suchen

Heim  >  Fragen und Antworten  >  Hauptteil

java - Spring-data-jpa Die gerade gespeicherten Informationen können nicht gefunden werden

1 Backend-Struktur

Die Hintergrundstruktur ist SpringMVC, Spring, jpa(HibernateJpaDialect),
DataSource(c3p0), Mysql(InnoBDB),
transactionManager(JpaTransactionManager).

2 Problemumgebung

@Transactional(value = "transactionManager", isolation = Isolation.READ_UNCOMMITTED)
    public Object addScenicSpot(int tourGuideID, String jsonStr) {
        Djd_js entity = new Djd_js();
        try{
            _setEntity(entity, jsonStr);
            entity.setDaoyouID(tourGuideID);
            jdjsDao.save(entity);
            int spotId = entity.getId();
            //添加信息到消息队列中
        try {
            Sender sender = new SenderImpl();
            sender.getGPSFromBaiduAPI("jdjs", spotId, entity.getDizhi());
        } catch (InterruptedException e) {
            return false;
        }
            return spotId;
        }catch (Exception e){
            return false;
        }
    }
以上是保存的部分,并把得到的 ID 发送到消息队列中,下边是消息队列的处理部分
public boolean updateLngAndLat(MessageVo messageVo) {
        System.out.println("CreateTime--------"+messageVo.getCreateDate());
        System.out.println("Address--------"+messageVo.getContent());
        System.out.println("Id--------"+messageVo.getId());
        Djd_js entity = jdjsDao.findOne(messageVo.getId());
        System.out.println("entity-Address--------"+entity.getDizhi());
        、、运行到这里就直接卡住了,如果注释掉查询,其他的调用皆正常。
        Map<String, Object> result = LngAndLatUtil.getLngAndLat(((MessageVo) messageVo).getContent());
        System.out.println("result--------"+(int)result.get("result"));
        if (1 == (int)result.get("result")){
            entity.setJingdu(Double.valueOf(result.get("lng").toString()));
            entity.setWeidu(Double.valueOf(result.get("lat").toString()));
            System.out.println("message-------------------------------"+"lng:"+Double.valueOf(result.get("lng").toString())+", lat:"+Double.valueOf(result.get("lat").toString()));
            jdjsDao.updateLngAndLatBySenciSpotID(messageVo.getId(), (Double) result.get("lng"), (Double) result.get("lat"));
        }else {
            System.out.println("message-------------------------------False");
        }
        return false;
    }

3 Problembeschreibung

Das Frontend ruft die Methode addScenicSpot() auf, um die Informationen in der Datenbank zu speichern, und sendet dann die ID im gespeicherten Datensteuerelement an die Nachrichtenwarteschlange. Anschließend verarbeitet der Abonnent die Informationen in der Warteschlange und fragt die gerade gespeicherten Informationen ab Rufen Sie dann die externe Schnittstelle auf, um den Längen- und Breitengrad abzufragen und den erhaltenen Längen- und Breitengrad in der Datenbank zu speichern.
Das Problem besteht nun darin, dass das Speichern von Informationen normal ist, aber wenn es um die Abonnentenverarbeitung geht, können die gespeicherten Informationen anhand der erhaltenen ID nicht gefunden werden.

4 Erraten Sie das Problem

Der Grund für den Fehler liegt darin, dass die Übermittlung der Frühjahrstransaktion später erfolgt als die Produktionsnachricht der Nachrichtenwarteschlange, was zu falschen Daten führt, wenn die Nachrichtenwarteschlange Nachrichten verbraucht.
Die Inspiration kommt von hier: http://www.cnblogs. com/taocon...

扔个三星炸死你扔个三星炸死你2739 Tage vor1455

Antworte allen(2)Ich werde antworten

  • 迷茫

    迷茫2017-06-12 09:27:28

    同步调用,改为异步调用?

    @Async
    getGPSFromBaiduAPI

    Antwort
    0
  • 扔个三星炸死你

    扔个三星炸死你2017-06-12 09:27:28

    已经解决了问题了,应用的这里的方法:http://www.cnblogs.com/taocon...

    Antwort
    0
  • StornierenAntwort