您的位置:首页 > 其它

JMS(Jboss Messaging)的一点使用心得(十六)复数JMS Server监听-JBoss Remoting里存在的问题

2009-01-19 14:53 706 查看
最近做了一个项目,要求一个JMS客户端监听复数台JMS Server,结果在测试时发生了问题。

各机器如下:

JMS Client,简称C

JMS Server1:简称S1

JMS Server2:简称S2

我们发现如果拔掉S1和C之间的网线,结果C和S2之间的连接也断掉了!郁闷啊!~!@#¥%

郁闷中调查了很久,修改了JBOSS的配置,不行!把我们的程序简化,不加任何处理,直接监听JMS,不行!把Spring去掉,直接用代码写监听程序,不行!把Connection中的Security部分去掉,还是不行……

没办法,只好上绝招了,就是,用Debug跟踪代码了,下载了JBOSS的Messaging和Remoting部分的代码,一步一步的跟踪下去,终于找到了问题。

JMS监听是常连接,为了节约Connection资源,所以做了死活管理。JMS Client端会定期去Ping JMS Server。这个定时器是一个Timer;如果一个定时器发现自己所Ping的Server没有应答,就会把自己关闭。

在org.jboss.remoting.LeasePinger里,大家可以看到相关代码!

public void startPing()
{
if(trace) { log.trace(this + " starting lease timer with ping period of " + pingPeriod); }
timerTask = new LeaseTimerTask(this);
timer.schedule(timerTask, pingPeriod, pingPeriod);
}


这段代码没什么问题,但是问题在于这个Timer是静态的。

private static Timer timer = new Timer(true);


也就是说,如果这个Timer停止了,那么所有的Ping都没有了。结果就如下:

1.C和S1之间网络故障

2.C停止执行Ping命令的Timer

3.S2收不到C的Ping,就认为C已经停止了对它的监听,回收了和C之间的Connection

4.C不知道发生了问题,还在傻傻的等待S2给它发消息

......
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐