У меня есть компонент, который отправляет сообщения в очередь для обработки другой системой. Следует также периодически публиковать тему о статусе работы. Могу ли я просто использовать тот же JmsTemplate, который использовался для отправки в очередь И для публикации в теме?
Я создал новую тему в ActiveMQ, за исключением того, что при отправке сообщения из JmsTemplate создается новая очередь с именем темы. с отправленным сообщением (вместо отправки данных в актуальную тему), что я здесь делаю неправильно?
вот мой конфиг:
<bean id="connectionFactory" class="org.springframework.jms.connection.CachingConnectionFactory">
<constructor-arg ref="amqConnectionFactory" />
<property name="exceptionListener" ref="jmsExceptionListener" />
<property name="sessionCacheSize" value="100" />
</bean>
<!-- JmsTemplate Definition -->
<bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">
<constructor-arg ref="connectionFactory" />
</bean>
<bean id="messageFacade" class="org.foo.MessageFacadeJms">
<property name="jmsTemplate" ref="jmsTemplate" />
</bean>
MessageFacadeJms - это класс, который я использую для отправки сообщения очереди (и он работает), могу ли я также использовать это для публикации темы?
Могу ли я просто использовать это для отправки очереди и публикации темы?:
jmsTemplate.convertAndSend("TOPIC_NAME" /* or queue name */, message);
Это может показаться немного странным, вам нужно сказать JmsTemplate, что это тема, а не очередь, установив его свойство pubSubDomain
в true
.
Это означает, что вам понадобится два боба JmsTemplate
, один для очереди и один для темы:
<bean id="jmsQueueTemplate" class="org.springframework.jms.core.JmsTemplate">
<constructor-arg ref="connectionFactory" />
<property name="pubSubDomain" value="false"/>
</bean>
<bean id="jmsTopicTemplate" class="org.springframework.jms.core.JmsTemplate">
<constructor-arg ref="connectionFactory" />
<property name="pubSubDomain" value="true"/>
</bean>
Если вы создадите место назначения как spring bean, а не будете использовать имя места назначения в коде, Spring не нужно будет знать, является ли оно темой или очередью. В противном случае решение, предложенное выше, также должно работать.
Пункты назначения AMQ JMS могут быть созданы путем прямого инстанцирования:
<bean id="destination" class="org.apache.activemq.command.ActiveMQTopic">
<constructor-arg value="TOPIC_NAME" />
</bean>
или выборки из JNDI:
<bean id="topic" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName" value="TOPIC_NAME"/>
<property name="jndiTemplate" ref="jmsJndiTemplate"/>
</bean>
Я предпочитаю технику JNDI, так как она более стандартна.