Spring javax.jms.Destination-动态更新defaultDestination
我需要通过轮询数据库表动态填充接收方队列名称。 使用的框架-Spring集成, 消息路由器-Solace 面临的问题- 需要将队列名称(从数据库轮询)作为javax.jms.Destination传递给jms模板 下面的代码是服务激活器类,我在其中触发jmsTemplate从队列读取并传递到下一个流Spring javax.jms.Destination-动态更新defaultDestination,spring,jms,Spring,Jms,我需要通过轮询数据库表动态填充接收方队列名称。 使用的框架-Spring集成, 消息路由器-Solace 面临的问题- 需要将队列名称(从数据库轮询)作为javax.jms.Destination传递给jms模板 下面的代码是服务激活器类,我在其中触发jmsTemplate从队列读取并传递到下一个流 public class JmsTemplateListener { JmsTemplate jmsTemplate; public void setJmsTemplate(Jm
public class JmsTemplateListener {
JmsTemplate jmsTemplate;
public void setJmsTemplate(JmsTemplate jmsTemplate) {
this.jmsTemplate = jmsTemplate;
}
Logger logger = Logger.getLogger(JmsTemplateListener.class);
public Message<?> messageDetails(Message<?> message) {
Message<?> inboundMessage = null;
try {
String receiverQueueName = (String) message.getHeaders().get(
"receiverQueueName");
logger.info("receiverQueueName -- " + receiverQueueName);
Destination destination = jmsTemplate.getDefaultDestination();
logger.info("Queue Name - " + destination);
// This is where i want to replace the DefaultDestination with receiverQueueName
//polled from the database
// But unable to convert or cast from String to Javax.jms.Destination
logger.info("Calling JMS Tempate Receive() method");
SolTextMessage receivedMessage = (SolTextMessage) jmsTemplate
.receive(jmsTemplate.getDefaultDestination());
logger.info("Message Retreived from Receiver Queue using JMS Tempalte :\n"
+ receivedMessage.getText());
inboundMessage = MessageBuilder.withPayload(
receivedMessage.getText()).build();
} catch (Exception e) {
e.printStackTrace();
}
return inboundMessage;
}
公共类JmsTemplateListener{
JmsTemplate JmsTemplate;
public void setJmsTemplate(JmsTemplate JmsTemplate){
this.jmsTemplate=jmsTemplate;
}
Logger Logger=Logger.getLogger(JmsTemplateListener.class);
公共消息详细信息(消息消息){
Message inboundMessage=null;
试一试{
字符串receiverQueueName=(字符串)message.getHeaders().get(
“接管人名称”);
logger.info(“receiverQueueName--”+receiverQueueName);
Destination Destination=jmsTemplate.getDefaultDestination();
logger.info(“队列名称-”+目的地);
//这就是我想用receiverQueueName替换DefaultDestination的地方
//从数据库中轮询
//但无法将字符串转换或强制转换为Javax.jms.Destination
info(“调用JMS Tempate Receive()方法”);
SolTextMessage receivedMessage=(SolTextMessage)jmsTemplate
.receive(jmsTemplate.getDefaultDestination());
logger.info(“使用JMS临时消息从接收方队列检索的消息:\n”
+receivedMessage.getText());
inboundMessage=MessageBuilder.withPayload(
receivedMessage.getText()).build();
}捕获(例外e){
e、 printStackTrace();
}
返回边界内消息;
}
有人能告诉我如何将默认目的地更改为从数据库轮询的目的地吗
我不知道是否有任何JMS实用程序可用,它可以将字符串作为输入并更新要读取的目标
问候,,
PD为什么需要为此设置默认目标?如果希望出现多线程问题,这是一种解决方法,但我怀疑这正是您想要的 接下来,它为什么应该是一个
javax.jms.Destination
?只需配置一个DestinationResolver
的正确实现(或您自己的实现),它将名称解析为一个实际的javax.jms.Destination
。为您省去了很多麻烦和多线程问题。而不是调用receive(Destination)
method调用receive(String)
方法(该方法将负责目标查找/解析任何内容)
但是请不要乱动
defaultDestination
,因为这只会给您带来更多您现在正试图解决的问题。大家好,请检查以上问题的解决方案:
<bean id="SolaceJndiTemplate" class="org.springframework.jndi.JndiTemplate"
lazy-init="default" autowire="default">
<property name="environment">
<map>
<entry key="java.naming.provider.url" value="${java.naming.provider.url}" />
<entry key="java.naming.factory.initial" value="${java.naming.factory.initial}" />
<entry key="java.naming.security.credentials" value="${java.naming.security.credentials}" />
<entry key="java.naming.security.principal" value="${java.naming.security.principal}" />
<entry key="Solace_JMS_VPN" value="${solace.jms.vpn}" />
</map>
</property>
</bean>
<bean id="SolaceCachedConnectionFactory"
class="org.springframework.jms.connection.CachingConnectionFactory">
<property name="targetConnectionFactory" ref="SolaceConnectionFactory" />
<property name="sessionCacheSize" value="10" />
</bean>
<bean id="SolaceConnectionFactory" class="org.springframework.jndi.JndiObjectFactoryBean"
lazy-init="default" autowire="default">
<property name="jndiTemplate" ref="SolaceJndiTemplate" />
<property name="jndiName" value="${int.dbus.jms.outbound.connectionfactory}" />
</bean>
<bean id="transactionManager"
class="org.springframework.jms.connection.JmsTransactionManager">
<property name="connectionFactory" ref="SolaceCachedConnectionFactory" />
</bean>
<bean id="SimpleDestinationResolver"
class="org.springframework.jms.support.destination.DynamicDestinationResolver" />
<bean id="inboundJmsTemplate" class="org.springframework.jms.core.JmsTemplate">
<property name="connectionFactory" ref="SolaceCachedConnectionFactory" />
<!-- <property name="defaultDestination" ref="inboundDestination" /> -->
<property name="pubSubDomain" value="true" />
<property name="deliveryPersistent" value="true" />
<property name="deliveryMode" value="2" />
<property name="destinationResolver" ref="SimpleDestinationResolver" />
</bean>
<bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">
<property name="connectionFactory" ref="SolaceCachedConnectionFactory" />
<property name="deliveryPersistent" value="true" />
<property name="deliveryMode" value="2" />
<property name="destinationResolver" ref="SimpleDestinationResolver" />
</bean>
<int-jms:outbound-channel-adapter
jms-template="jmsTemplate" channel="com.db.jms.outbound" destination-expression="headers.senderQueueName" >
</int-jms:outbound-channel-adapter>
问候拉文达尔·尼迪贡达