wsb*_*383 19 java spring activemq-classic 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>
Run Code Online (Sandbox Code Playgroud)
MessageFacadeJms是我用来发送队列消息的类(它可以工作),我还可以用它来发布一个主题吗?
我可以使用它来同时进行队列发送和主题发布吗?:
jmsTemplate.convertAndSend("TOPIC_NAME" /* or queue name */, message);
Run Code Online (Sandbox Code Playgroud)
ska*_*man 37
这可能看起来有点奇怪,你需要告诉JmsTemplate它是一个主题而不是一个队列,通过设置它的pubSubDomain属性true.
这意味着你将需要两个JmsTemplatebean,一个用于队列,一个用于主题:
<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>
Run Code Online (Sandbox Code Playgroud)
如果将目标创建为spring bean而不是在代码中使用目标名称,则Spring不需要知道它是主题还是队列.否则,上面提出的解决方案也应该起作用.
可以通过直接实例化它们来创建AMQ JMS目标:
<bean id="destination" class="org.apache.activemq.command.ActiveMQTopic">
<constructor-arg value="TOPIC_NAME" />
</bean>
Run Code Online (Sandbox Code Playgroud)
或者从JNDI获取:
<bean id="topic" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName" value="TOPIC_NAME"/>
<property name="jndiTemplate" ref="jmsJndiTemplate"/>
</bean>
Run Code Online (Sandbox Code Playgroud)
我更喜欢JNDI技术,因为它更标准.
如果您可以为队列/主题使用命名约定,那么您可以实现自定义 org.springframework.jms.support.destination.DestinationResolver
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);
}
}
Run Code Online (Sandbox Code Playgroud)
并使用引用它 JmsTemplate.setDestinationResolver
| 归档时间: |
|
| 查看次数: |
36069 次 |
| 最近记录: |