[英]How to get custom properties from JMS message in a Spring JMS Listener
[英]How to specify custom JMS Message Listener in Spring Xml
我是JMS的新手,需要批量處理偵聽器的請求。 鏈接: http : //sleeplessinslc.blogspot.in/2010/04/batchmessagelistenercontainer-using.html提供了一個很好的解決方案。 我堅持執行同樣的事情。 我沒有使用默認容器,而是覆蓋容器類以使用這個新類:
<jms:listener-container container-class="org.bsnyder.spring.jms.listener.BatchMessageListenerContainer"
acknowledge="transacted">
<jms:listener destination="CHANDRA.BATCHTEST" ref="messageListener" />
</jms:listener-container>
<bean id="messageListener" class="org.bsnyder.spring.jms.listener.BatchMessageListener" />
這里的BatchMessageListener正在擴展SessionAwareBatchMessageListener,如博客中所述。
我得到的錯誤是:
[ERROR] PropertyAccessException 1: org.springframework.beans.MethodInvocationException: Property 'messageListener' threw exception;
nested exception is java.lang.IllegalArgumentException: Message listener needs to be of type [org.bsnyder.spring.jms.listener.SessionAwareBatchMessageListener]:
Failed properties: Property 'messageListener' threw exception; nested exception is java.lang.IllegalArgumentException: Message listener needs to be of type [org.bsnyder.spring.jms.listener.SessionAwareBatchMessageListener]
我應該更改容器類型(默認為“默認”)? http://docs.spring.io/spring/docs/3.1.x/spring-framework-reference/html/jms.html不包含有關如何設置此內容的詳細信息。
問題是jms名稱空間解析器正在創建org.springframework.jms.listener.adapter.MessageListenerAdapter
的實例,其中包含一個引用org.bsnyder.spring.jms.listener.BatchMessageListener
實例的delegate
屬性。 因此,在您的checkMessageListener()
的方法BatchMessageListenerContainer
,你需要改變這樣的:
protected void checkMessageListener(Object messageListener) {
if (!(messageListener instanceof SessionAwareBatchMessageListener)) {
throw new IllegalArgumentException("Message listener needs to be of type ["
+ SessionAwareBatchMessageListener.class.getName() + "]");
}
}
......對此:
protected void checkMessageListener(Object messageListener) {
if (!(messageListener instanceof MessageListenerAdapter)) {
throw new IllegalArgumentException("Message listener needs to be of type ["
+ MessageListenerAdapter.class.getName() + "]");
}
}
雖然,在驗證加載的類方面,這確實不會給你太多。 同樣不幸的是, MessageListenerAdapter
的getDelegate()
方法受到保護; 否則,您可以對委托的類型進行檢查,該類型應該是自定義SessionAwareBatchMessageListener
的實例。 我想你可以使用反射。 或者,您可以避免使用jms命名空間並創建自己的自定義BatchMessageListenerAdapter
,該實現SessionAwareBatchMesageListener
並擴展MessageListenerAdapter
並使用該自定義適配器而不是jms命名空間的默認實現。 (沒有辦法使用命名空間btw覆蓋此默認值。)最終,它歸結為如果你真的需要加載時驗證。
如果您想跳過驗證,請改為:
protected void checkMessageListener(Object messageListener) {
// Do nothing...
}
這將允許您的應用程序加載沒有問題。
為什么需要從隊列中批量讀取消息? 在這種情況下,我強烈建議您使用spring批處理而不是編寫自定義批處理監聽器。 Spring批處理很容易配置。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.