存储中间件-MQ常见问题解决方法FAQ
IBM Websphere MQ FAQ
Last Release: 2006-1-2
这里整理了IBM Websphere MQ的一些常见错误和解决方法,当发现MQ错误而一时无法解决时,可以参阅这里的解决方法,可能有所启发;多个原因可能会引发同一错误现象,为此对某种错误现象列出了好几种解决方法,工程人员需要根据实际情况用相应的解决方法处理。引发MQ错误的原因有很多,这里也无法一一罗列出来,对于无法在这里找到解决方法的错误,请将错误现象发给我(MSN: sqwen_cn@,邮件: sqwen@, wensq@),我会将解决方法整理添加到这里面。
不能创建MQ队列管理器
javax.jms.JMSException: MQJMS2005: 未能为‘1:' 创建MQQueueManager
at com.ibm.mq.jms.services.ConfigEnvironment.newException(ConfigEnvironment.java:546)
at com.ibm.mq.jms.MQConnection.createQM(MQConnection.java:1450)
at com.ibm.mq.jms.MQConnection.createQMNonXA(MQConnection.java:960)
at com.ibm.mq.jms.MQTopicConnection.(MQTopicConnection.java:152)
at com.ibm.mq.jms.MQTopicConnection.(MQTopicConnection.java:114)
at com.ibm.mq.jms.MQTopicConnectionFactory.createMQTopicConnection(MQTopicConnectionFactory.java:337)
at com.ibm.mq.jms.MQTopicConnectionFactory.createTopicConnection(MQTopicConnectionFactory.java:214)
at ipnet.sqwen.jmstest.JMSSubscriber.subscribe(JMSSubscriber.java:71)
at ipnet.sqwen.jmstest.JMSSubscriber.main(JMSSubscriber.java:34)
解决方法:
CCSID不对,修改相应队列管理器的CCSID与JNDI里面定义的相同;
运行mqMonitor脚本中的mc.sh,查看现在的连接数,是否为100;如果是,则是达到了默认情况下通道的最大连接数,需要优化MQ的配置;具体优化的方法是修改/var/mqm/qmgrs/XXX/qm.ini文件,增加:
Channels:
MaxChannels=xxxx
MaxActiveChannels=xxxx
xxxx表示需要配置的最大通道数和最大活动通道数,根据实际情况指定,100是默认值,对一般的队列管理器是足够的,对于QM_BASE、QM_DC、QM_TOPIC、QM_PS_FM需要增大为200直至1000,最大为9999。–m QM_XXX (只用于重启过程中)
strmqbrk –m QM_XXX
也有可能是broker出现故障,需要重建:
endmqbrk –m QM_XXX
dltmqbrk QM_XXX
strmqbrk –m QM_XXX
队列深度满
错误现象:
普通的队列管理器报队列深度满的错误
解决方法:
增加队列管理器的最大深度,默认队列深度为100000,可以根据需要增加为1000000或2000000。上
runmqsc QM_XXX
alter ql(Q_XXX) maxdepth(xxxxx)
end
SYSTEM.JMS.ND.SUBSCRIBER.QUEUE队列深度一直满
错误现象:
系统运行一段时间后,用于JMS pub/sub的队列管理器中的队列SYSTEM.JMS.ND.SUBSCRIBER.QUEUE一直保持在最大深度,即使增加最大队列深度,新增消息也很快使队列积压消息数达到最大深度。
解决方法:
这种情况下,再次增加最大深度是没有意义的。需要相关的开发人员改进程序,在Publish消息之前,设置TimeToLive(单位为毫秒)的值为较小的值(默认TimeToLive=0,即永久存活),使Publish出去的消息只有有限的生命周期,超过TimeToLive设定的时间值将被MQ队列管理器自动删除。