我想通過syslog入站通道適配器消息事務性啓動一個流程。不幸的是,適配器沒有采用可以作爲事務處理的輪詢器(許多示例中使用其他入站適配器的典型方法)。
如何使消息流(僞)事務的任意部分?
有什麼解決方法嗎?
編輯
經過一番思考,我意識到,我的意圖是比最初描述的(因此標題的變化)有一點不同。基本上我只想做一些簡單而直接的方法,讓我的消息流僞事務性的任意部分(從流中的某個任意通道開始)。含義 - 如果流程完成時沒有任何異常,我想執行一些自定義代碼(但請注意,我不希望我的自定義僞提交代碼成爲流本身的一部分(步驟))。如果發生任何異常,我想執行一些自定義代碼。
使用TransactionSynchronizationFactory的語義將很適合我。
<int:transaction-synchronization-factory id="syncFactory">
<int:after-commit expression="payload.renameTo('/success/' + payload.name)" channel="committedChannel" />
<int:after-rollback expression="payload.renameTo('/failed/' + payload.name)" channel="rolledBackChannel" />
</int:transaction-synchronization-factory>
唯一的問題是如何將它與其餘的流連接在一起。我所嘗試的是定義中間虛擬服務激活端點,該中間虛擬服務激活端點從我希望事務開始的通道接收消息。然後將事務性輪詢器添加到該服務激活器。但是這種方法有其自身的問題,因爲爲了使用輪詢器,你必須將傳入通道定義爲一個隊列通道,這似乎在單獨的線程中執行流(或者至少我觀察到一些異步行爲)。
在問這個問題之前,我嘗試了這種方法。當發生失敗(回滾)或成功(提交)時,無法找到如何插入我的自定義代碼的方法。我試圖使用的事務管理器是僞事務管理器。 – davidgale
您可以向系統日誌適配器添加一個'error-channel';在回滾之後,它將得到一個帶有MessagingException負載的'ErrorMessage',它有兩個屬性'cause'和'failedMessage'。如果你想處理交易範圍內的錯誤(並決定是否提交),我可以用不同的技術編輯我的答案。 –
請參閱已編輯的文章。 – davidgale