gpt4 book ai didi

java - 如何在 Spring Xml 中指定自定义 JMS 消息监听器

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:27:52 24 4
gpt4 key购买 nike

我是 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 的实例,它带有一个 delegate 属性,该属性引用了您的 org.bsnyder.spring.jms.listener.BatchMessageListener 实例。因此,在 BatchMessageListenerContainercheckMessageListener() 方法中,您需要更改:

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() 方法受到了保护;否则,您可以检查委托(delegate)的类型,它应该是您的自定义 SessionAwareBatchMessageListener 的一个实例。我想你可以使用反射。或者,您可以避免使用 jms 命名空间并创建自己的自定义 BatchMessageListenerAdapter 实现 SessionAwareBatchMesageListener 并扩展 MessageListenerAdapter 并使用该自定义适配器而不是jms 命名空间的默认实现。 (顺便说一句,无法使用命名空间覆盖此默认值。)最终,归结为您是否真的需要加载时验证。

如果您想跳过验证,只需这样做:

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

这将使您的应用能够顺利加载。

关于java - 如何在 Spring Xml 中指定自定义 JMS 消息监听器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19153102/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com