簡體   English   中英

如何在Spring Xml中指定自定義JMS消息偵聽器

[英]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() + "]");
    }
}

雖然,在驗證加載的類方面,這確實不會給你太多。 同樣不幸的是, MessageListenerAdaptergetDelegate()方法受到保護; 否則,您可以對委托的類型進行檢查,該類型應該是自定義SessionAwareBatchMessageListener的實例。 我想你可以使用反射。 或者,您可以避免使用jms命名空間並創建自己的自定義BatchMessageListenerAdapter ,該實現SessionAwareBatchMesageListener並擴展MessageListenerAdapter並使用該自定義適配器而不是jms命名空間的默認實現。 (沒有辦法使用命名空間btw覆蓋此默認值。)最終,它歸結為如果你真的需要加載時驗證。

如果您想跳過驗證,請改為:

protected void checkMessageListener(Object messageListener) {
    // Do nothing...
}

這將允許您的應用程序加載沒有問題。

為什么需要從隊列中批量讀取消息? 在這種情況下,我強烈建議您使用spring批處理而不是編寫自定義批處理監聽器。 Spring批處理很容易配置。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM