遇到由于
而导致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
时会失败吗?这次谷歌让我非常惊讶。
答案 0 :(得分:0)
很难确切说明为什么会这样,但JMS客户端通常是多线程的野兽,所以我可以看到这个策略可能不完全是犹太人。
JMS Connections旨在是线程安全的,您可能只想将连接包装在单个或类似的东西中。 (JMS Sessions及以下版本不是线程安全的,不应由线程共享,因此如果您致力于这种方法,可以考虑将会话放在本地线程中。)
答案 1 :(得分:0)
ThreadLocal意味着每个Thread都拥有它自己的Connection。 比较应用程序生成的线程数与ActivationSpec中的连接数