Maison  >  Questions et réponses  >  le corps du texte

java - Spring-data-jpa Les informations qui viennent d'être enregistrées sont introuvables

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<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 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...

扔个三星炸死你扔个三星炸死你2686 Il y a quelques jours1392

répondre à tous(2)je répondrai

  • 迷茫

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

    Appel synchrone, passer en appel asynchrone ?

    @Async
    getGPSFromBaiduAPI

    répondre
    0
  • 扔个三星炸死你

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

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

    répondre
    0
  • Annulerrépondre