组里最近migrate MQ 到MQ hub,其中的一个模块(test order generator)出现了问题,消息无法发送到队列。但是其他的模块运行正常,我们可以给它们发送消息。
从log中发现,出现了NullPointerException, 简化的错误信息大概如下:
at java.util.Hashtable.put
at com.ibm.mq.jms.MQConnection.<MQConnection.java:466> ~[com.ibm.mqjms-com.ibm.mqjms.jar:6.0.0.0]
at com.ibm.mq.jms.MQQueueConnection...
由于之前的migration的改动涉及Spring的配置,bean的配置,我主要将debug精力放在了配置文件上,还花了很多时间去看了mq hub,ccdt,channel,hostname, port等。
我看来看去,配置和其他的模块一致,肉眼无法看出问题。我复制了其他模块的配置,将其中信息改成了test order 队列所需的信息,结果还是不行。
后来,又将发送消息的Java代码改动得和其他模块一模一样。但是同样的错误还是出现。
种种debug之后,基本确定队列是没有问题,ccdt配置文件也很没问题,bean的配置也没有问题。
种种尝试之后,还是无法找到根本原因。
最后,还是老同志罗伯特有经验,他发现了原因:该模块的mq driver的版本和其他模块的版本不一致。其实,从log中就可以发现端倪:com.ibm.mqjms-com.ibm.mqjms.jar:6.0.0.0。也是我经验不足,加上当时加入的团队的时间不长,没有注意到这个版本其实是错误的。将模块的引用的mq相关的版本改动到8,问题解决。
经验:
- 尽管有时候log信息不太清晰,或者不够直接。但是log的信息还是有用的(比如这次的6.0.0.0)。
- 引用的包的版本有时候也会导致bug,需要注意。
网友评论