首页 > 解决方案 > 无法在同一连接上使用不同的 msgVPN 连接到多个 Solace 队列

问题描述

我有一个使用 JMS Solace 连接到具有多个订阅的 Solace 代理的 Spring 应用程序。每个订阅都有不同的 msgVPN 和队列值。我能够使用 solace-jms-spring-boot-starter 创建到一个队列的连接。问题是当我尝试在同一个连接上创建第二个队列时,我收到一个 Solace 503 错误“未知队列”错误。

理想情况下,我希望有一个带有多个队列的 JMS 连接,以从所有订阅中检索消息。Solace 是否可以做到这一点,或者我需要其他方法吗?

目前,这就是我试图建立联系的方式。

BeanConfig.java

import com.rumack.listener.JmsExceptionListener;
import com.rumack.listener.JmsMessageListener;
import com.solacesystems.jms.SolConnectionFactory;
import com.solacesystems.jms.SolJmsUtility;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.core.env.Environment;
import javax.jms.Connection;
import javax.jms.MessageConsumer;
import javax.jms.Queue;

@Configuration
@PropertySource({"classpath:application.properties"})
public class BeanConfig {

    private static final Logger logger = LoggerFactory.getLogger(BeanConfig.class);

    @Autowired
    private Environment environment;

    @Autowired
    private JmsExceptionListener exceptionListener;

    @Bean
    public SolConnectionFactory solConnectionFactory() throws Exception {
        SolConnectionFactory connectionFactory = SolJmsUtility.createConnectionFactory();
        connectionFactory.setHost(environment.getProperty("solace.java.host"));
        // Here I have to set the connection to a msgVPN value. 
        // From everything I've seen the VPN needs to be set here.
        connectionFactory.setVPN(environment.getProperty("solace.java.msgVpn"));
        connectionFactory.setUsername(environment.getProperty("solace.java.clientUsername"));
        connectionFactory.setPassword(environment.getProperty("solace.java.clientPassword"));
        connectionFactory.setClientID(environment.getProperty("solace.java.clientName"));
        return connectionFactory;
    }

    @Bean
    public JmsMessageListener jmsMessageListener() {
        return new JmsMessageListener();
    }

    @Bean(destroyMethod = "close")
    public Connection connection() {
        Connection connection = null;
        javax.jms.Session session;

        try {
            connection = solConnectionFactory().createConnection();
            session = connection.createSession(false, javax.jms.Session.AUTO_ACKNOWLEDGE);

            // This queue will work and return messages because the connection has a vpn msg value set correctly 
            Queue queue = session.createQueue(environment.getProperty("Queue1.solace.message.consumer.queue"));
            MessageConsumer messageConsumer = session.createConsumer(queue);
            messageConsumer.setMessageListener(jmsMessageListener());

            // This queue will not work and crash the app because the connection is set to the other sub and I'm trying to
            // connect to a queue other than the first
            Queue FDPSQueue = session.createQueue(environment.getProperty("Queue2.solace.message.consumer.queue"));
            MessageConsumer messageConsumer1 = session.createConsumer(FDPSQueue);
            messageConsumer1.setMessageListener(jmsMessageListener1());

            connection.setExceptionListener(exceptionListener);
            // Application fails here with a Solace 503 error
            connection.start();
            logger.info("Connected Awaiting message...");

        } catch (Exception e) {
            logger.info("JMS connection failed with Solace." + e.getMessage());
            e.printStackTrace();
        }
        return connection;
    }


}

应用程序属性

Queue1.solace.message.consumer.queue=acme.queue1.OUT
Queue2.solace.message.consumer.queue=acme.queue2.OUT

solace.java.host=tcps://<url>:<port>
solace.java.clientUsername=<username>
solace.java.clientPassword=<password>
solace.java.msgVpn=msgVPN1
solace.java.clientName=solacetest
solace.java.messageAckMode=client_ack
solace.java.reapplySubscriptions=false

标签: solace

解决方案


我发现在 JMS Solace 中每个连接只能有一个队列。因此,如果您需要多个连接,您可以使用不同的登录值创建另一个 Connection bean(例如 public Connection connection2 () )。

我不得不将 solConnectionFactory() 折叠到我的连接方法中以获得不同的值,但它现在正在工作。


推荐阅读