Camel JMS: как настроить пользовательский прослушиватель сообщений при подключении к теме

Мне нужно определить маршрут, который читает сообщение (имеет xml) из темы и демаршалирует его в java bean.

Раньше я использовал spring JmsTemplate для управления connectionFactory для этой темы, и мой маршрут выглядел примерно так (и он работал нормально). Конвертер сообщений по существу возвращает экземпляр TextMessage в методе fromMessage()

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

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

Теперь вместо JmsTemplate я использую org.springframework.jms.listener.DefaultMessageListenerContainer для подключения к этой устойчивой теме.

(Также потому, что он поддерживает асинхронный режим)

Для этого я написал свой собственный прослушиватель сообщений, который реализует javax.jms.MessageListener, и я прочитал сообщение в onMessage(). Но я не могу вернуть TextMessage отсюда, как раньше, когда используется JmsTemplate.

Я не знаю, как мне настроить это в определении маршрута, чтобы он по-прежнему поддерживал немаршаллинг?


person rahul pasricha    schedule 02.04.2014    source источник


Ответы (1)


Я много чего пробовал, и решение действительно простое, нет необходимости использовать org.springframework.jms.listener.DefaultMessageListenerContainer, вместо этого все, что нам нужно сделать, это определить connectionFactory, который в моем случае был экземпляром myJmsConnectionFactory определяется следующим образом весной xml

<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, и вам не нужно указывать его (вы можете, но мне не нужно было :))

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

from("jms:topic:myTopic?transacted=true&connectionFactory=myJmsConnectionFactory")
 .transacted()
 .unmarshal(dataFormat)
 .routeId("myRouteId")
person rahul pasricha    schedule 08.05.2014