0

遇到 connection.start() 由于以下原因而失败的问题

java.net.ConnectException: Connection refused: connect

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

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变量,则它可以毫无问题地连接。任何人都可以解释为什么它会作为一个裸变量工作,但是当包裹在 a 中时ThreadLocal它会失败?谷歌这次让我非常失望。

4

2 回答 2

0

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

于 2013-07-26T19:05:40.140 回答
0

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

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

于 2013-07-26T17:32:17.753 回答