solace - 无法在同一连接上使用不同的 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
解决方案
我发现在 JMS Solace 中每个连接只能有一个队列。因此,如果您需要多个连接,您可以使用不同的登录值创建另一个 Connection bean(例如 public Connection connection2 () )。
我不得不将 solConnectionFactory() 折叠到我的连接方法中以获得不同的值,但它现在正在工作。
推荐阅读
- javascript - 如何使用 MUI 制作圆形复选框?
- regex - MS Word 2016 宏正则表达式替换
- java - 如何让我的哈希图按照我想要的顺序打印
- python - PySpark - 在数据框列中创建的列表的类型是字符串而不是整数
- javascript - NodeJS - Jimp - 处理 .png 图像以减轻其重量(质量)
- javascript - jQuery timepicker 的两个实例
- android - Dalvik 真的会给回收释放的内存吗?
- amazon-web-services - 使用 CLI 上传的文件夹没有正确的 ACL(文件正常,只有文件夹有问题)
- javascript - Now.sh 构建中断,原因是:当前未启用对实验性语法“decorators-legacy”的支持
- ios - CloudKit - 公共和私有数据库 - 消息传递平台