2016-09-22 107 views
1

我目前正在基於Spring Integration(ver。3.0.1.RELEASE)應用程序實現一個流程,該流程需要將消息存儲在JMS隊列中以稍後再拾起。 爲此,我一直在嘗試將Spring Integration JMS入站通道適配器與自定義選擇器一起使用,然後通過將JMSDestinationPollingSource的JMS選擇器更改爲某個包含作爲標題屬性的匹配ID來從隊列中拾取消息。Spring集成控制總線消息來更改JMS入站通道適配器的選擇器

其中一個要求是我不能添加一個新的服務或一個JAVA方法,所以我一直試圖使用控制總線對它進行整理,但當我發送消息時仍然收到相同的錯誤將messageSelector設置爲不同的東西。

入站通道適配器定義:

<int-jms:inbound-channel-adapter id="inboundAdapter" 
           channel="inboundChannel" 
           destinationName="bufferQueue" 
           connection-factory="connectionFactory" 
           selector="matchingID = 'NO VALUE'"> 
    <int:poller fixed-delay="1000"/> 
</int-jms:inbound-channel-adapter> 

消息:

@'inboundAdapter.source'.setMessageSelector("matchingID = 'VALUE'") 

錯誤:

EvaluationException: The method 'public void org.springframework.integration.jms.JmsDestinationPollingSource.setMessageSelector(java.lang.String)' is not supported by this command processor. If usign the Control Bus, consider adding @ManagedOperation or @ManagedAttribute. 

其中,AFAIK,意味着該JmsDestinationPollingSource類不是控制總線管理,如它沒有通過ControlBusMethodFilter。

這種方法是否存在,或者是否有我遺失的東西?有沒有辦法只使用SI XML配置文件動態設置選擇器?

回答

1

首先奇怪的是使用Java工具,並且不允許對編寫Java代碼的...

但是,這是你的選擇,或如你所說要求

更換僱主! ;-)

沒錯:控制總線只允許使用@ManagedOperation@ManagedAttribute方法。由於JmsDestinationPollingSource.setMessageSelector。我們可以做到這一點。但是,如果我們能夠實現一點不同的方法,它有多大意義?

<int:outbound-channel-adapter id="changeSelectorChannel" 
    ref"inboundAdapter.source method="setMessageSelector"/> 

其中一個新的選擇表達式應該作爲Message此頻道的​​。

+0

我使用Transformer將選擇器設置爲具有匹配ID值作爲標題屬性的消息,並將Transformer的表達式設置爲'expression =''matchingID ='''+ headers [matchingID] +'''' 「',但似乎不起作用。沒有消息記錄,但是,具有該頭部屬性的消息未被消耗。 – gnzlrm

+0

您必須將該代碼作爲EDIT分享給您的問題。關於此事的記錄也很有用。 –

+0

沒關係。顯然它工作,但花了15分鐘來輪詢來自JMS隊列的消息。在原始問題上發佈輪詢器配置時,輪詢操作不應該是每秒一次?我已經標記答案爲正確和upvoted,感謝您的幫助:) 是的,有人很自豪,他做了一個非常通用的應用程序來管理大量的流而不編寫服務,現在認爲添加一個JAVA顯然,階級會毀了他的成就。 – gnzlrm

相關問題