是否有可能有一个远程池化的JMS连接工厂(WildFly 10)?



我有一个远程Java客户端,它在Wildfly 10上查找JMS连接工厂,一切都按预期工作正常。它只是一个测试程序;一个简单的JMS聊天系统。当我启动聊天客户端的多个实例时,有时会显示以下消息:

WARN: AMQ212051: Invalid concurrent session usage. Sessions are not supposed to be used by more than one thread concurrently.

后跟一条痕迹。

现在我想修复此警告,因此我需要一个池连接工厂。但是池连接工厂无法远程使用(正如我所读到的,它不应该远程可用(。

当我想在本地启动多个 JMS 聊天客户端时,如何修复此警告?

我知道当我只是不同的机器时不会出现错误。

这是工作的非池化远程代码(但有警告(

final Properties properties = new Properties();
properties.put(Context.INITIAL_CONTEXT_FACTORY, "org.jboss.naming.remote.client.InitialContextFactory");
properties.put(Context.PROVIDER_URL, "http-remoting://127.0.0.1:8080");
try {
context = new InitialContext(properties);
ConnectionFactory connectionFactory = (ConnectionFactory) context.lookup("jms/RemoteConnectionFactory");
jmsContext = connectionFactory.createContext("quickstartUser", "quickstartPwd1!");
} catch (NamingException e) {
e.printStackTrace();
}

此问题不是由不使用池连接工厂引起的,使用池连接工厂无法解决。问题在于应用程序在多个线程之间并发使用相同的 JMS 会话的方式(如 WARN 消息所示(。记录的堆栈跟踪将显示哪个类和方法触发了 WARN 消息。

您需要确保应用程序不会在多个线程之间并发使用相同的 JMS 会话。为此,您可以为每个线程提供自己的 JMS 会话,或者围绕会话设置并发控制,以便一次只有一个线程可以访问它。

最新更新