【问题标题】:Is it possible to have a remote pooled JMS connection factory (WildFly 10)?是否可以有一个远程池化 JMS 连接工厂(WildFly 10)?
【发布时间】:2020-01-18 00:58:33
【问题描述】:

我有一个远程 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 wildfly


【解决方案1】:

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

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

【讨论】:

  • 感谢您的回答!你能帮我一下,告诉我如何给每个线程自己的 JMS 会话吗?上面显示的代码在构造函数中是一个超类。我有一个使用这个超类的派生类。当我启动派生类的两个实例时,我认为(一开始)这两个实例已经使用了单独的 JMS 会话。显然这是错误的。
  • 您应该发布一个关于如何为每个线程提供自己的会话的新问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-06-16
  • 2015-05-02
  • 1970-01-01
  • 2016-09-26
  • 2017-03-13
  • 2018-07-11
  • 1970-01-01
相关资源
最近更新 更多