您將需要使用JTA TransactionManager,但由於不在j2ee容器中,我會申請使用Atomikos。
https://github.com/camelinaction/camelinaction/tree/master/chapter9/xa
我的路線,其正在與IBM MQ - > Oracle數據庫,在J2EE肯定,但仍應該Atomikos公司建立合作。我會說這不是正確的方式,但它是我設法實現它的唯一方式 - 對我的用例足夠好。
from(inQueue)
.transacted()
.setHeader("storeData", constant(false))
.to("direct:a")
.choice().when(header("storeData").isEqualTo(false)) // if this is true the database calls are 'successful'
.log("Sending message to errorQueue")
.to(errorQueue)
;
StoreDataBean storeDataBean = new StoreDataBean();
from("direct:a")
.onException(Exception.class).handled(false).log("Rollbacking database changes").markRollbackOnlyLast().end()
.transacted("PROPAGATION_REQUIRES_NEW")
.bean(storeDataBean) //storeData sets the header storeData to true if no SQLException or other exceptions are thrown
.end()
;
提交由事務管理器處理,所以如果我實際上得到數據庫提交錯誤,它應該回滾消息。 回滾消息的下一個問題是,我無法像使用ActiveMQ一樣設置deadLetterQueue。所以它回滾到收到的隊列。因此,我實際上像處理數據庫事務一樣處理數據庫事務,它處於新事務中,在調用數據庫時發生正常SQLException時會進行回滾。
希望這個工作:
from(inQueue)
.onException(Exception.class).to(errorQueue).markRollbackOnly().end()
.bean(storeDataBean)
.end()
我已經發布有關此內容的社區論壇,但沒有答案的。
來源
2015-07-13 12:34:41
J2B
這個RFE也值得投票;這是關於增加支持額外的JTA交易協調員(不只是Atomikos) https://www.ibm.com/developerworks/rfe/execute?use_case=viewRfe&CR_ID=36184 我要強調的是官方支持聲明今天表示只能使用JavaEE認證的服務器;這是因爲在使用IBM MQ JMS時,其他人(如Atomikos)尚未得到驗證。 – Calanais
@ Calanais提供的鏈接不起作用。 – Julian
您是否已獲得IBM ID登錄頁面?一個id是必需的 - 這是免費的而且很容易創建。 – Calanais