Как опубликовать тему JMS в Spring JMS?

У меня есть компонент, который отправляет сообщения в очередь для обработки другой системой. Следует также периодически публиковать тему о статусе работы. Могу ли я просто использовать тот же 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);
19
задан wsb3383 19 August 2010 в 02:32
поделиться

2 ответа

Это может показаться немного странным, вам нужно сказать 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>
37
ответ дан 30 November 2019 в 03:02
поделиться

Если вы создадите место назначения как 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, так как она более стандартна.

5
ответ дан 30 November 2019 в 03:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: