我正在使用Spring AMQP(RabbitMQ實現),並試圖將單個事務傳播到多個線程中。例如,假設有3個隊列,名稱爲X,Y,Z,首先我使用線程1從隊列X獲取消息,然後將該消息提供給線程0,並且在線程0消息中被克隆並通過線程3發送到隊列Y,線程2和隊列Z通過線程3發送。線程0等待線程3和線程4完成,以提交或回滾消息。請注意,我在這裏使用4個線程。多線程的AMQP春季交易
我想要的基本上是將這3個操作(獲取消息並將其放到兩個隊列中)作爲單個事務處理。即如果我成功地將消息發送到隊列Y,但未能將其發送到Z,則發送到Y的消息將被回滾,並且原始消息也將被回滾到隊列X中。
到目前爲止,我已經設法通過threadLocals(主要是TransactionStatus和TransactionSynchronizationManager.resources)來傳遞事務信息,並且我能夠將這3個操作綁定到一個事務中。
但我的問題是發送ACK/NACK原始隊列X,即使我提交/回滾事務,它只適用於隊列Y和Z只。從X獲得的消息始終處於未確認狀態。
我試圖通過channel.basicAck(),RabbitUtils.commitIfNecessary()方法,但沒有成功。
請注意,我也啓用了channelTransacted。任何幫助,高度讚賞。
在提交時,線程1處於活動狀態?也許死了,這是等什麼? –
在提交時,線程1返回到池中(其所有線程本地都被清除)。提交由線程0完成。我已經更新了這個問題。 –
也許只將txSize設置爲1,僅用於測試或在測試期間發送比txSize更多的消息。 –