2017-06-29 137 views
1

我的設置:
我有一個消息守護進程使用ActiveMQ將消耗JSON消息。
JSON消息的發佈者添加了具有值的type頭,例如,com.example.Foo這是json消息的類型。我用這個將json轉換成pojo。彈簧集成 - 異常和重試

Spring配置:
一旦接收到消息,這些都是它通過以下步驟:
1.變壓器:來變換JSON來POJO
2.淨荷類型路由器:基於POJO的類型,將pojo路由到適當的服務激活者。
3.服務激活器:處理消息。

<int:chain input-channel="transformerChannel"> 
    <int:transformer id="jsonToPojoTransformer" ref="JsonToPojoTransformer" method="transform" /> 

    <int:payload-type-router default-output-channel="defaultChannel"> 
     <int:mapping type="com.example.Foo" channel="fooHandlerChannel"/> 
     <int:mapping type="com.example.Bar" channel="barHandlerChannel"/> 
    </int:payload-type-router> 
</int:chain> 

<int:service-activator input-channel="fooHandlerChannel" ref="fooHandler" method="onMessage"/> 
<int:service-activator input-channel="barHandlerChannel" ref="barHandler" method="onMessage"/> 

服務激活定義:

public class FooHandler { 
    public void onMessage(Foo foo) {...} 
} 

問題:

  1. 我想知道如何訪問郵件頭在服務激活。由於變換器正在返回pojo,因此服務激活器似乎無法訪問消息頭。

  2. 可以說服務激活器無論出於何種原因都無法調用下游休息服務。我現在要跳過處理此消息,並且稍後要重試此消息。或者讓我們說在處理這封郵件時有一個例外。我想在延遲一段時間後重試處理此消息。我該如何做到這一點?

- 編輯 -
刪除細節來減少問題的大小按阿爾喬姆的評論。

回答

0

請嘗試不要在這裏做這麼長的話題。如果有很多問題很難回答特定的問題。

絕對不清楚爲什麼你無法訪問服務激活器方法中的頭部。您可以接受整個Message<>,並將其稱爲其getHeaders(). You can use @標題annotation on the地圖arg to get headers from the message. You can use @ Header`註釋從報文中提取確切的特定報頭。

即使您的變壓器方法僅返回一個POJO,但這並不意味着它不會被包裝到帶有來自requestMessage頭部的Message。如果你需要返回特定的頭文件和你的POJO,你應該自己創建Message,使用MessageBuilder,並且不要忘記複製requestMessage頭文件,只是因爲如果整個消息被返回,變換器不會複製請求頭文件。

您必須在您的JMS消費者上支持TX,以便RuntimeException將導致回滾並因此最終重新交付。你應該確保所有的流程都在同一個線程中執行。否則,TX被提交併且消息在代理上被查詢。當你沒有交易時也會發生同樣的情況。

+0

我的服務激活器被定義爲'public void fooHandler(Foo foo){...}'。因此,我想知道如何訪問標題。我將它改爲'public void fooHandler(Message message){...}'。現在有效負載具有'Foo'的實例,並且消息頭可用。我沒有意識到變壓器返回的內容也包含在'Message'中。 我增加了更多的細節來解釋我爲什麼在做我在做的事情。很多時候,人們會問我爲什麼選擇一種特定的方式來做某件事。因此詳細的長信息。 – shravanp

+0

好的。也許這只是晚上的效果:-)。我的答案有用嗎?還是你需要其他的東西? –

+0

我正在嘗試查找有關客戶端的tx的spring文檔。你能指點我正確的文件嗎?我仍在搜索大量的春季集成參考。 – shravanp