日期:2014-05-16  浏览次数:20717 次

Linux环境下连接SUN MQ 出现 connection refused异常的解决方案
    最近研究jms,一开始挺顺利,使用环境是windows,glassfish,sun的mq, spring。其实就是用spring提供的JmsTemplate实现发送jms消息到部署在windows上的glassfish的中去,glassfish是sun公司的一款服务器,所以他集成了sun自己的消息服务器sun mq,
   刚开始用spring的方式,还是自己用jms.jar imq.jar 实现发送消息都没有问题,用spring实现jms 远程方法调用(jms invoke)也很简单。spring自己写了一套远程调用标准的数据格式,RemoteInvocation类和RemoteInvocationResul类。基本上不用自己再做额外的事情了。就这样,本来三天的工作量,半天就完成了,剩下的时间就这里逛逛,那么逛逛,到第三天的时候,项目经理跟我说,我们的jms是要在Linux环境下跑的,你到Linux下面先测一下吧,心想,这个应该问题不到,事实证明低估了这个难度,到Linux下一开始报找不到JNDI资源,怎么会找不到呢?我又重新检查了一遍配置的JMS连接工厂名和队列名,都没有问题呀。捣鼓了半天还是找不到资源,最后试着在Linux下建一个JMS连接工厂的资源,发现了问题所在,原来在linux上面建JMS资源需要关联到我的work unit上面去,找到问题后,马上修改测试资材,将work unit在JMS资源之前创建,并将JMS资关联过去。还别说,找不到JNDI资源的问题真解决了,不幸的是,出现了新问题,JMS connection refused,到网上一查,说是要启动代理(Sun\messageQueue\mq\bin\imqbrokerd),于是启动了消息代理,问题全解决了,

    这次的问题说明了,只要环境有一点点变化,你的程序可能都会出现不同的结果,本来在Windows上消息代理是自动打开了,但linux下可能出于安全的考虑默认是关闭的。所以以后做事一定要小心,要考虑到外界因素的变化可能对我的程序产生的影响。