当前位置: 首页 > 知识库问答 >
问题:

骆驼JMS:如何在连接到主题时配置自定义消息侦听器

温亮
2023-03-14

我需要定义一个从主题读取消息(包含xml)并将其解组到JavaBean的路由。

早些时候,我使用Spring JmsTemboard来管理这个主题的连接工厂,我的路由看起来像这样(并且工作正常)。消息转换器本质上返回fromMessage()方法中的TextMessage实例

JaxbDataFormat dataFormat = new JaxbDataFormat();
dataFormat.setContextPath("com.somepath.xml");

from("jms:topic:myTopic?transacted=true&connectionFactory=myJmsConnectionFactory&messageConverter=#myMessageConverter")
 .transacted()
 .unmarshal(dataFormat)
 .routeId("myRouteId")

现在,我使用org.springframework.jms.listener.DefaultMessageListenerContainer来连接到这个持久的主题,而不是JmsTemboard。

(也是因为它支持异步模式

为此,我编写了自己的消息侦听器,它实现了javax。jms。MessageListener我在onMessage()中阅读了这条消息。但我不能像使用JmsTemplate时那样从这里返回文本消息。

我不知道如何在路由定义中配置它,使其仍然支持解组?


共有1个答案

汪和悌
2023-03-14

我尝试了很多东西,解决方案非常简单,没有必要使用org.springframework.jms.listener.DefaultMessageListenerContainer,相反,我们所需要做的就是定义一个连接工厂,在我的情况下是myJmsConnectionFactory实例,定义如下Springxml

<bean id="myJmsConnectionFactory"        class="org.springframework.jndi.JndiObjectFactoryBean">
            <property name="jndiTemplate" ref="myJndiTemplate" />
            <property name="jndiName" value="TopicConnectionFactory" />
            <property name="lookupOnStartup" value="false" />
            <property name="proxyInterfaces" value="javax.jms.ConnectionFactory" />
            <property name="cache" value="true" />
</bean>

这个连接工厂使用一个jndi模板,它有助于远程对象的jndi查找。这被定义为

<bean id="myJndiTemplate" class="org.springframework.jndi.JndiTemplate">
            <property name="environment">
                <bean class="org.springframework.beans.factory.config.PropertiesFactoryBean">
                    <property name="location" value="file:///opt/test/jndi.properties" />
                </bean>
            </property>
</bean>

在路由定义中,我只是使用这个连接工厂来查找远程主题。默认情况下,当您连接到jms主题时,camel会注册一个消息侦听器,您不必指定一个(您可以,但我不需要:)

JaxbDataFormat dataFormat = new JaxbDataFormat();
dataFormat.setContextPath("com.somepath.xml");

from("jms:topic:myTopic?transacted=true&connectionFactory=myJmsConnectionFactory")
 .transacted()
 .unmarshal(dataFormat)
 .routeId("myRouteId")
 类似资料:
  • 我创建了一个路由器类,并在@Configuration中标记为@Bean。有一件事我不太确定,那就是camel会多久调用一次数据库以获取select结果?一旦我在数据库中有了一个新条目,camel就会检索并处理它。

  • 我想使用骆驼路由接收消息,但能够以某种方式注入自定义“容器工厂”。 通常(没有骆驼路线),你会做以下事情: 注意上面“JmsListener”注释的“containerFactory”属性如何为我们提供了一种使用非默认“containerFactory”的方法。这很好,但是如果我们想使用骆驼路径从队列中读取呢?类似于: 在上面的最新案例中,我无法“注入”自定义JMS containerFactor

  • 现在当我启动基于spring的应用程序时。我在调试器中看到,我的侦听器方法注册了,但是Spring不连接到ActiveMQ队列,我可以通过查看ActiveMQ web控制台轻松地看到这一点。此外,我没有看到任何来自spring的日志输出,而JMS的东西是这样做的。 我错过什么了吗?从这里走下去最好的路是什么?当然,我也测试了从ActiveMQ的web控制台中发送消息,但是如果没有客户端连接,就没有

  • 问题内容: 我们有一个Java侦听器,它从JBossMQ的队列中读取文本消息。如果必须重新启动JBoss,则侦听器将不会重新连接并重新开始阅读消息。我们只是每2分钟在侦听器的日志文件中收到一条消息,指出该消息无法连接。我们在代码或JBossMQ中没有设置什么吗?我是JMS的新手,因此将非常感谢您的帮助。谢谢。 问题答案: 您应该在客户端代码中实现javax.jms.ExceptionListene

  • 我有一个Spring应用程序在独立的JBoss EAP 6.2中运行(带有嵌入式HornetQ提供程序)。 消息被成功地放在队列中(我可以在jboss eap-6.2\独立\data\MessagingJournal\hornetq-data-1.hq中看到它们,因为队列是持久的),但不会被侦听器拾取(侦听器中的断点不会被命中)。我怀疑配置中缺少或错误的东西,但看不出是什么。JBoss启动时没有任