Die Hintergrundstruktur ist SpringMVC, Spring, jpa(HibernateJpaDialect),
DataSource(c3p0), Mysql(InnoBDB),
transactionManager(JpaTransactionManager).
@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 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; }
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.
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...
同步调用,改为异步调用?
@Async
getGPSFromBaiduAPI
已经解决了问题了,应用的这里的方法:http://www.cnblogs.com/taocon...