我的流程設置是這樣的:交易完成不確定性
<int:channel id="channel1">
<int:queue/>
</int:channel>
<int:channel id="channel2">
<int:queue/>
</int:channel>
<int:chain id="chain1" input-channel="channel1" output-channel="channel2">
<int:poller>
<int:transactional propagation="REQUIRES_NEW"/>
</int:poller>
<Authorzier/>
<JMS_put1/>
<DB_update_state1/>
</int:chain>
<int:chain id="chain2" input-channel="channel2" output-channel="nullChannel">
<int:poller>
<int:transactional propagation="REQUIRES_NEW"/>
</int:poller>
<Transformer/>
<JMS_put2/>
<DB_update_state2/>
</int:chain>
在某些情況下的鏈2的交易鏈1的交易前完成
現在,我有DB_state_1在數據庫中。
如何在鏈1的消息發送到output-channel
之前強制鏈1的事務完成?
我知道我可以使用TransactionSynchronization
發送消息到channel2 afterCommit()
,但我認爲必須有一個更優雅的解決方案。
EDIT CURRENT WORKAROUND
@ServiceActivator
public void sendToDestinationFlow(Message<?> message) {
TxSenderSyncer s = new TxSenderSyncer(message, this.channel, this.errorChannel);
TransactionSynchronizationManager.registerSynchronization(s);
}
private static class TxSenderSyncer implements TransactionSynchronization {
private Message<?> message;
private MessageChannel channel;
private MessageChannel errorChannel;
public TxSenderSyncer(Message<?> message, MessageChannel channel, MessageChannel errorChannel) {
this.message = message;
this.channel = channel;
this.errorChannel = errorChannel;
}
@Override
public void afterCompletion(int paramInt) {
if (paramInt == STATUS_ROLLED_BACK) {
errorChannel.send(MessageBuilder.withPayload(new MessagingException(message, "Transaction rolled back")).build());
} else {
channel.send(message);
}
}
}
我已經編輯我的例子。通常,帶有代表事務的輪詢器的鏈具有其他處理程序,其中一些也是事務性資源。所以我需要在消息被髮送到鏈的'output-channel'之前完成鏈的完整事務。 –
請在我的回答中查看'EDIT'。 –
這個解決方案的工作原理,但我們有另一個問題[見這篇文章](http://stackoverflow.com/questions/39097422/dataaccessexception-not-wrapped-in-messagingexception)。目前我們正在使用'EDIT CURRENT WORKAROUND'下的問題中插入的解決方法,並會很感激您的意見。 –