在ThreadLocal中包装JMS连接时拒绝连接

时间:2013-07-26 15:43:01

标签: java multithreading jms activemq thread-local

遇到由于

而导致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时会失败吗?这次谷歌让我非常惊讶。

2 个答案:

答案 0 :(得分:0)

很难确切说明为什么会这样,但JMS客户端通常是多线程的野兽,所以我可以看到这个策略可能不完全是犹太人。

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

答案 1 :(得分:0)

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