繁体   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