2015-07-13 26 views
1

我正在開發一個獨立的Apache駱駝應用程序(未運行在J2EE容器上)。 此應用程序需要能夠將消息從IBM MQ隊列管理器路由到分佈式事務中的Oracle數據庫。 我的谷歌搜索幾乎把我帶到了一些地方,但沒有一個能夠給我提供關於如何把所有東西放在一起的一些好的線索。 下面的這個鏈接與我所需要的最接近,但不幸的是它不足以讓我走上正確的道路。使用IBM MQ和Oracle作爲資源的獨立的Spring應用程序XA事務

IBM MQManager as XA Transaction Manager with Spring-jms and Spring-tx

預先感謝您爲您的輸入。

+0

這個RFE也值得投票;這是關於增加支持額外的JTA交易協調員(不只是Atomikos) https://www.ibm.com/developerworks/rfe/execute?use_case=viewRfe&CR_ID=36184 我要強調的是官方支持聲明今天表示只能使用JavaEE認證的服務器;這是因爲在使用IBM MQ JMS時,其他人(如Atomikos)尚未得到驗證。 – Calanais

+0

@ Calanais提供的鏈接不起作用。 – Julian

+0

您是否已獲得IBM ID登錄頁面?一個id是必需的 - 這是免費的而且很容易創建。 – Calanais

回答

0

您將需要使用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() 

我已經發布有關此內容的社區論壇,但沒有答案的。

+0

感謝J2B的評論。你指向我的例子正是我所遵循的,我確實設法將Atomikos放在一起,並可以在日誌條目中看到像這樣'## 14-07-2015 08:43:42,112 [INFO] atomikos - setRollbackOnly()要求事務10.16.164.34.tm0000600003 ## 14-07-2015 08:43:42,112 [WARN] org.apache.camel.spring.spi.TransactionErrorHandler - 事務回滾(0x560513ce)redelivered(未知)'。然而,我的信息並沒有回滾到我放入的隊列中,它只是消失了(如果你認爲這是一條支付信息,那就不好了:-) – Julian

+0

我正在使用沒有設置事務管理器的SJMS組件方法。我應該切換到JMS組件,還是我的路由配置中仍然存在的東西?比較那個「駱駝在行動」的例子,這是我還沒有完成的一點' <! - 指事務管理器 - > ' – Julian

+0

OK so我使用了JmsComponent。我通過在兩個MQ Webshere隊列管理器之間移動消息來進行測試,並且由於目標隊列被設置爲「禁止」,接收者無法接受消息。事務回滾到源隊列。我仍然需要看到它與數據庫一起工作,但是它會有很大的信心。不過,我仍想澄清SJMS組件如何設置事務管理器。 – Julian

相關問題