[英]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.