RocketMq支持事務性的消息
RocketMq支持傳輸帶有事務的消息,可以用來保持數據的最終一致性。下面我來簡單的實現一個帶有事務的消息
生產者端的代碼
需要寫事務檢查的Listener,自定義一個類,實現TransactionCheckListener(rocketMq3.0.8版本以前)
public LocalTransactionState checkLocalTransactionState(MessageExt messageExt) { //可以查看messageExt裏面的body是否存在,來判斷事務的狀態 return LocalTransactionState.COMMIT_MESSAGE; }
然後寫本地操作的事務,我們需要實現TransactionExuctor的接口,
public LocalTransactionState executeLocalTransactionBranch(Message message, Object o) {
System.out.println(“本地事務”);
//在這裏進行數據庫的操作,
return LocalTransactionState.COMMIT_MESSAGE;
}生產者的代碼
TransactionCheckListener transactionCheckListener=new MyTranscationCheckListener();
TransactionMQProducer producer=new TransactionMQProducer(“transaction”);
producer.setNamesrvAddr(“47.106.132.60:9876”);
producer.setTransactionCheckListener(transactionCheckListener);
producer.start();
MyLocalTranscationExuctor transcationExuctor=new MyLocalTranscationExuctor();
Message message=new Message(“Topic_Trans”,”MyTags”,”事務消息”.getBytes());
producer.sendMessageInTransaction(message,transcationExuctor,null);
producer.shutdown();
如何處理在RocketMq3.0.8版本後的消息檢查
我們需要自己去解決消息的check listener回查機制,我們可以在生產者這端執行本地事務操作時,我們可以把當前消息存在另外一張表中,最好每條信息都需要一個Id,然後在這端另起一個任務或者線程來取出發送確認消息失敗的消息發送給消費者。然後消費者這段需要一張表來存儲已經成功解決的消息列表,然後起一個任務,來取出一段時間之內已成功消費的信息,然後消費者那端進行修改表中的消息狀態碼。這樣就會解決確認消息失敗的原因。其實這個也可以用來實現不支持事務消息的消息隊列實現分佈式事務的最終一致性。