在可自动重连的
JmsMessageListenerContainer中,有一个ClassLoader的属性值,请参见
[http://blog.csdn.net/supersue/archive/2008/04/02/2244727.aspx]
在 JmsMessageListenerContainer被初始化的时候(afterPropertiesSet),该ClassLoader被赋值,代码如下:
@Override
public
void
afterPropertiesSet() ...
{
super.afterPropertiesSet();
this.classLoader = Thread.currentThread().getContextClassLoader();
}
而在发生异常启动线程重新连接的时候(onException),把该值赋给了重连线程,如下所示:
public
void
onException(JMSException e) ...
{
this.logger.error(this.getBeanName() + " Connection Error: " + e.getMessage());
if (this.checker != null) ...{
this.checker.shutdown();
this.checker = null;
}
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
this.checker = new CheckConnectionThread();
this.checker.setDaemon(true);
this.checker.setContextClassLoader(this.classLoader);
this.checker.start();
}
这样做的原因是因为启动 JmsMessageListenerContainer的线程和执行onExcetion的线程不是同一个线程,ClassLoader也不一样,如果不把原来的ClassLoader保留的话,会导致重连前可以正常处理Jms消息,而重连后却发生NoClassFound错误。
[http://blog.csdn.net/supersue/archive/2008/04/02/2244727.aspx]
在 JmsMessageListenerContainer被初始化的时候(afterPropertiesSet),该ClassLoader被赋值,代码如下:
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/0196c3df5ea9e936f21e9932cca91014.gif)
而在发生异常启动线程重新连接的时候(onException),把该值赋给了重连线程,如下所示:
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/717446ca04a6125dc5b6b54e0fa14ab4.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/0196c3df5ea9e936f21e9932cca91014.gif)
这样做的原因是因为启动 JmsMessageListenerContainer的线程和执行onExcetion的线程不是同一个线程,ClassLoader也不一样,如果不把原来的ClassLoader保留的话,会导致重连前可以正常处理Jms消息,而重连后却发生NoClassFound错误。