欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

學習spring事務與消息隊列

 更新時間:2016年10月12日 14:47:26   作者:登頂  
這篇文章主要為大家詳細介紹了spring事務與消息隊列,具有一定的參考價值,感興趣的小伙伴們可以參考一下

在開發(fā)過程中,遇到一個bug,產生bug的原因是spring事務提交晚于消息隊列的生產消息,導致消息隊列消費消息時獲取到的數據不正確。這篇文章介紹問題的產生和一步步的解決過程。

一.問題的產生:

場景還原:接口中的一個方法,首先修改訂單狀態(tài),然后向消息隊列中生產消息,消息隊列的消費者獲取到消息檢測訂單狀態(tài),發(fā)現(xiàn)訂單狀態(tài)未更改。

代碼:

@Service(orderApi)
public class OrderApiImpl implements OrderApi {
  @Resource MqService mqService;
  @OrderDao orderDao;
   
  public void push(String orderId) {
    // 更新訂單狀態(tài),之前的狀態(tài)是1
    updateStatus(orderId, 3);
    // 產生消息
    mqService.produce(orderId);
  }
  public viod updateStatus(String orderId, Integer status) {
    orderDao.updateStatus(orderId, status);
  }
}

問題產生原因:orderApi中的所有方法都有事務,事務類型PROPAGATION_REQUIRED,所以push方法對數據的操作會在push代碼全部執(zhí)行之后提交,而在事務提交之前消息隊列的消息已經產生所以消息隊列中消費到的訂單從數據庫查詢出的狀態(tài)可能還為1。為了讓bug現(xiàn)象更明顯,可以在push方法最后添加:

try {
  Thread.sleep(10000);
} catch (InterruptedException e) {
  // TODO Auto-generated catch block
  e.printStackTrace();
}

這樣就會發(fā)現(xiàn)消費消息時,訂單狀態(tài)一定是未修改的。 

二.問題的解決:

解決方案:在更新數據時,新建一個事物,保證更新代碼執(zhí)行完成后,更新數據庫的事務已被提交。(確保消息產生前數據庫操作已提交)

按照上述方案,我首先想到的是直接修改updateStatus方法的事務類型;我將此方法的事務類型改為PROPAGATION_REQUIRES_NEW(新建事務,如果當前存在事務,把當前事務掛起)。

但是這么做有兩點不合適:

  1.強制修改了updateStaus的事務類型,可能影響其他流程。

  2.未起到作用,updateStaus方法中沒有新建事務。

關于第二點的解釋:spring添加事務是通過BeanNameAutoProxyCreator實現(xiàn)的動態(tài)代理,只是給bean對象添加了事務,現(xiàn)在在類內部調用方法,是不會觸發(fā)新事物的創(chuàng)建的。

所以在經過以上嘗試后,我創(chuàng)建了一個新的類:

@Service("orderExtApi")
public class OrderExtApiImpl {
  @Resource OrderApi orderApi;
   
  public void updateStatusNewPropagation(String orderId) {
    orderApi.updateStatus(orderId);
  }
}

并為updateStatusNewPropagation方法添加事務PROPAGATION_REQUIRES_NEW

這個類就只是為了給orderApi中的updateStaus方法新起一個事務。

ok,到此為止bug已經解決了。

但是代碼中還是存在問題:對數據庫的操作已經提交,如果生產消息出現(xiàn)異常對業(yè)務邏輯來說還是錯誤的。所以需要檢測消息的產生是否完成。

最終orderApi中的代碼如下:

@Service(orderApi)
public class OrderApiImpl implements OrderApi {
  @Resource MqService mqService;
  @Resource OrderDao orderDao;
  @Resource OrderExtApiImpl orderExtApi;
   
  public void push(String orderId) {
    // 更新訂單狀態(tài),之前的狀態(tài)是1
    orderExtApi.updateStatusNewPropagation(orderId, 3);
    // 產生消息--produce會檢測是否出現(xiàn)異常 當返回1時表示生產消息成功
    Response response = mqService.produce(orderId);
    if (response.getCode() != 1) {
      log.info("消息隊列生產消息異常:" + response.getErrorMsg())
      // 生產消息異常,重置狀態(tài) 等待下次重新執(zhí)行
      orderExtApi.updateStatusNewPropagation(orderId, 1);
    }
     
  }
  public viod updateStatus(String orderId, Integer status) {
    orderDao.updateStatus(orderId, status);
  }
}

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • Spring核心容器之ApplicationContext上下文啟動準備詳解

    Spring核心容器之ApplicationContext上下文啟動準備詳解

    這篇文章主要介紹了Spring核心容器之ApplicationContext上下文啟動準備詳解,ApplicationContext 繼承自 BeanFactory ,其不僅包含 BeanFactory 所有功能,還擴展了容器功能,需要的朋友可以參考下
    2023-11-11
  • Java中的動態(tài)和靜態(tài)編譯實例詳解

    Java中的動態(tài)和靜態(tài)編譯實例詳解

    這篇文章主要介紹了Java中的動態(tài)和靜態(tài)編譯實例詳解的相關資料,需要的朋友可以參考下
    2017-04-04
  • SpringBoot開發(fā)之攔截器實例

    SpringBoot開發(fā)之攔截器實例

    這篇文章主要介紹了SpringBoot開發(fā)之攔截器實例,Spring?Boot簡介Spring?Boot發(fā)展史SpringBoot的魅力SpringBoot的優(yōu)點總結Spring?Boot是一個基于Spring框架的快速開發(fā)腳手架,它簡化了Spring應用的初始化和搭建過程,需要的朋友可以參考下
    2023-09-09
  • springboot中@Async默認線程池導致OOM問題

    springboot中@Async默認線程池導致OOM問題

    這篇文章主要介紹了springboot中@Async默認線程池導致OOM問題,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-06-06
  • 詳解Zookeeper基礎知識

    詳解Zookeeper基礎知識

    本文主要講解了Zookeeper的基礎知識,ZooKeeper提供了一個通用協(xié)調模式實現(xiàn)方法的開源共享庫,使程序員免于寫這類通用的協(xié)議。關于Zookeeper更多相關知識,感興趣的小伙伴參考一下這篇文章
    2021-09-09
  • MyBatis中的占位符入參全面詳解

    MyBatis中的占位符入參全面詳解

    這篇文章主要為大家介紹了MyBatis中的占位符全面詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-03-03
  • Java輕松實現(xiàn)在Excel中添加超鏈接功能

    Java輕松實現(xiàn)在Excel中添加超鏈接功能

    這篇文章主要為大家詳細介紹了Java如何輕松實現(xiàn)在Excel中添加超鏈接功能,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下
    2024-01-01
  • 詳解Java中Math.round()的取整規(guī)則

    詳解Java中Math.round()的取整規(guī)則

    這篇文章主要介紹了詳解Java中Math.round()的取整規(guī)則,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-05-05
  • Java畢業(yè)設計實戰(zhàn)項目之在線服裝銷售商城系統(tǒng)的實現(xiàn)流程

    Java畢業(yè)設計實戰(zhàn)項目之在線服裝銷售商城系統(tǒng)的實現(xiàn)流程

    基礎掌握怎么樣,用實戰(zhàn)檢驗就知道了,本篇文章手把手帶你用java+SpringBoot+Maven+Vue+mysql實現(xiàn)一個在線服裝銷售商城系統(tǒng),大家可以在過程中查缺補漏,提升水平
    2022-01-01
  • elasticsearch源碼分析index?action實現(xiàn)方式

    elasticsearch源碼分析index?action實現(xiàn)方式

    這篇文章主要為大家介紹了elasticsearch源碼分析index?action實現(xiàn)方式,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-04-04

最新評論