搜尋

首頁  >  問答  >  主體

java - Spring-data-jpa 剛儲存的資訊查找不到

1 後台結構

後台的架構是 SpringMVC, Spring, jpa(HibernateJpaDialect),
DataSource(c3p0), Mysql(InnoBDB),
transactionManager(JpaTransactionManager)。

2 問題環境

@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 問題描述

前端呼叫addScenicSpot() 方法,會將資訊儲存到資料庫中,然後將儲存之後的資料控中的ID傳送到訊息佇列中,然後訂閱者處理佇列中的信息,根據ID 查詢到剛儲存的訊息,然後呼叫外部介面查詢到經緯度,並將得到的經緯度儲存到資料庫中。
現在的問題是,保存資訊正常,但是到了訂閱者處理這邊,根據得到的 ID 查找不到保存的資訊。

4 猜測問題所在

產生bug的原因是spring事務提交晚於訊息佇列的生產訊息,導致訊息佇列消費訊息時所獲得的資料不正確,
靈感來自這裡:http://www.cnblogs.com/ taocon...

扔个三星炸死你扔个三星炸死你2732 天前1447

全部回覆(2)我來回復

  • 迷茫

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

    同步調用,改為非同步調用?

    @Async
    getGPSFromBaiduAPI

    回覆
    0
  • 扔个三星炸死你

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

    已經解決了問題了,應用的這裡的方法:http://www.cnblogs.com/taocon...

    回覆
    0
  • 取消回覆