Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring javax.jms.Destination-动态更新defaultDestination_Spring_Jms - Fatal编程技术网

Spring javax.jms.Destination-动态更新defaultDestination

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

我需要通过轮询数据库表动态填充接收方队列名称。 使用的框架-Spring集成, 消息路由器-Solace

面临的问题- 需要将队列名称(从数据库轮询)作为javax.jms.Destination传递给jms模板

下面的代码是服务激活器类,我在其中触发jmsTemplate从队列读取并传递到下一个流

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>       

问候拉文达尔·尼迪贡达