首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用Spring JMS发布JMS主题?

如何使用Spring JMS发布JMS主题?
EN

Stack Overflow用户
提问于 2010-08-19 10:32:53
回答 3查看 41.8K关注 0票数 25

我有一个组件,它将消息发送到一个队列,由另一个系统处理。它还应该每隔一段时间发布一个关于工作状态的主题。我可以使用与发送到队列和发布到主题相同的JmsTemplate吗?

我在ActiveMQ中创建了一个新的主题,只是当我从JmsTemplate发送一条消息时,会用发送的消息创建一个具有该主题名称的新队列(而不是将数据发送到实际的主题),我在这里做错了什么?

这是我的配置:

代码语言:javascript
复制
<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是我用来发送队列消息的类(它是有效的),我能不能也用它来发布一个主题?

我能用它同时做队列发送和主题发布吗?:

代码语言:javascript
复制
jmsTemplate.convertAndSend("TOPIC_NAME" /* or queue name */, message);
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-08-19 15:40:05

这看起来可能有点奇怪,您需要通过将JmsTemplate的pubSubDomain属性设置为true来告诉它是一个主题而不是一个队列。

这意味着您将需要两个JmsTemplate bean,一个用于队列,另一个用于主题:

代码语言:javascript
复制
<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>
票数 48
EN

Stack Overflow用户

发布于 2010-08-20 20:53:28

如果将目的地创建为spring bean,而不是在代码中使用目的地名称,Spring将不需要知道它是主题还是队列。否则,上面建议的解决方案也应该有效。

AMQ JMS目标可以通过直接实例化它们来创建:

代码语言:javascript
复制
  <bean id="destination" class="org.apache.activemq.command.ActiveMQTopic">
    <constructor-arg value="TOPIC_NAME" />
  </bean>

或者从JNDI获取:

代码语言:javascript
复制
<bean id="topic" class="org.springframework.jndi.JndiObjectFactoryBean">
        <property name="jndiName" value="TOPIC_NAME"/>
        <property name="jndiTemplate" ref="jmsJndiTemplate"/> 
</bean>

我更喜欢JNDI技术,因为它更标准。

票数 7
EN

Stack Overflow用户

发布于 2015-10-07 22:53:34

如果您可以对队列/主题使用命名约定,那么您可以实现自定义org.springframework.jms.support.destination.DestinationResolver

代码语言:javascript
复制
public class NamingDestinationResolver implements DestinationResolver {
   public Destination resolveDestinationName(Session session, String destinationName, boolean pubSubDomain) throws JMSException {
      if (destinationName.endsWith("Queue")) {
         return session.createQueue(destinationName);
      } else if (destinationName.endsWith("Topic")) {
         return session.createTopic(destinationName);
      }
      throw new RuntimeException("Naming convention not respected for destination " + destinationName);
   }
}

并使用JmsTemplate.setDestinationResolver引用它

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3518292

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档