【问题标题】:Connection Refused when wrapping JMS Connection in ThreadLocal在 ThreadLocal 中包装 JMS 连接时连接被拒绝
【发布时间】:2013-07-26 23:25:26
【问题描述】:

遇到一个问题,即 connection.start() 由于

而失败

java.net.ConnectException: Connection refused: connect

当我将javax.jms.TopicConnection 包裹在ThreadLocal 中时,如下所示:

private ThreadLocal<TopicConnection> createThreadLocalTopicConnection(final TopicConnectionFactory cf)
{
    return new ThreadLocal<TopicConnection>() {
        public TopicConnection result;

        protected synchronized TopicConnection initialValue() {
            try {
                // Returns a javax.jms.TopicConnection object.
                result = cf.createTopicConnection();
                result.start();
                return result;
            } catch (JMSException e) {
                throw new RuntimeException(e);
            }
        }

            protected void finalize() throws Throwable {
                if(result!=null) result.close();
            }
        };
    }

如果我只是将TopicConnection 创建为一个裸static 变量,它可以毫无问题地连接。任何人都可以解释为什么它会作为一个裸变量工作,但是当包裹在 ThreadLocal 中时它会失败?这一次 Google 让我非常失望。

【问题讨论】:

    标签: java multithreading jms activemq thread-local


    【解决方案1】:

    很难确切说明为什么会发生这种情况,但 JMS 客户端通常是多线程的野兽,所以我可以看到这种策略可能并不完全合乎情理。

    JMS 连接旨在实现线程安全,您可能只想将连接包装在单例或其他东西中。 (JMS Session 及以下不是线程安全的,不应由线程共享,因此如果您致力于这种方法,可以考虑将会话放在本地线程中)。

    【讨论】:

    • 我将它包装在 ThreadLocal 中的原因是,当我简单地将连接声明为静态时,我得到了一些奇怪的副作用行为,即在应用程序间消息时没有收到应用程序内消息正在按预期工作。我怀疑一些线程间配置差异是罪魁祸首。使用 ActiveMQ 的 PooledConnectionFactory 解决了这个问题,但我试图避免超出我的代码中已有的 javax.jms 引用
    【解决方案2】:

    ThreadLocal 意味着每个线程都有自己的连接。 比较应用程序产生的线程数与 ActivationSpec 中的连接数

    【讨论】:

    • "ThreadLocal 意味着每个线程都有自己的连接"。这就是重点。不过谢谢
    猜你喜欢
    • 2017-08-08
    • 1970-01-01
    • 2019-10-20
    • 1970-01-01
    • 2023-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-29
    相关资源
    最近更新 更多