java - Spring-data-jpa Les informations qui viennent d'être enregistrées sont introuvables
扔个三星炸死你
扔个三星炸死你 2017-06-12 09:25:28
0
2
1299

1 Structure du back-end

La structure d'arrière-plan est SpringMVC, Spring, jpa(HibernateJpaDialect),
DataSource(c3p0), Mysql(InnoBDB),
transactionManager(JpaTransactionManager).

2 Environnement problématique

@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; }

3 Description du problème

Le frontal appelle la méthode addScenicSpot() pour enregistrer les informations dans la base de données, puis envoie l'ID dans le contrôle des données enregistrées à la file d'attente des messages. Ensuite, l'abonné traite les informations dans la file d'attente et interroge les informations qui viennent d'être enregistrées en fonction. l'ID. Appelez ensuite l'interface externe pour interroger la longitude et la latitude, et stockez la longitude et la latitude obtenues dans la base de données.
Le problème est maintenant que la sauvegarde des informations est normale, mais lorsqu'il s'agit de traitement des abonnés, les informations enregistrées ne peuvent pas être trouvées sur la base de l'identifiant obtenu.

4 Devinez le problème

La raison du bug est que la soumission de la transaction du printemps est postérieure au message de production de la file d'attente des messages, ce qui entraîne des données incorrectes obtenues lorsque la file d'attente des messages consomme des messages.
L'inspiration vient d'ici : http://www.cnblogs. com/taocon...

扔个三星炸死你
扔个三星炸死你

répondre à tous (2)
迷茫

Appel synchrone, passer en appel asynchrone ?

@Async
getGPSFromBaiduAPI

    扔个三星炸死你

    Le problème a été résolu, et la méthode ici est appliquée : http://www.cnblogs.com/taocon...

      Derniers téléchargements
      Plus>
      effets Web
      Code source du site Web
      Matériel du site Web
      Modèle frontal
      À propos de nous Clause de non-responsabilité Sitemap
      Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!