我们在一个带有原因代码2042的ImqQueue::get( ImqMsg &, ImqGetMessageOptions & );调用上得到了一个间歇性错误,这个错误不应该基于Websphere文档而发生™;我们应该只在打开的时候得到这个原因代码。
此错误是否表示服务器无法在其一侧打开队列,还是表示我们的客户端存在问题?处理此错误的最佳方法是什么?现在,我们只是记录它发生了,但它发生了很多。不幸的是,我对Websphere MQ不太熟悉;我在学习时会发现这一点,所以我没有所有的术语都是正确的。
我们的客户端是用C++链接libmq6.0.2.4编写的,运行在SLES-10上。除了运行7.1版本之外,我不知道服务器的详细信息。我们要求升级使我们的队伍更新。我们有多个客户机实例同时运行;所有实例都使用相同的请求队列,但每个实例都使用MQOO_INPUT_EXCLUSIVE + MQOO_INPUT_FAIL_IF_QUIESCING创建自己的动态应答队列。
发布于 2014-09-15 11:16:09
如果队列尚未打开,ImqQueue::get方法将隐式地为您打开队列。这将最终使用MQOO_INPUT_AS_Q_DEF选项,因此它将在队列中使用DEFSOPT(不包括共享的)属性。您还应该反复检查队列是否已定义为共享,而不是NOSHARE,但我怀疑已经正确设置了该队列。
您提到了应用程序的多个实例同时运行,因此如果其中一个实例以MQOO_INPUT_AS_Q_DEF身份隐式地打开队列,从而导致来自DEFSOPT的MQOO_INPUT_SHARED,则如果其他人打开队列,则将得到2042 (MQRC_OBJECT_IN_USE)。如果当时没有其他任何东西打开它,那么隐式打开就会工作,以后的实例将得到2042。
如果是断断续续的,那么我建议在您的应用程序中有一个路径,其中不调用ImqQueue::open方法。在查找时,将队列定义更改为DEFSOPT(SHARED)应该可以消除2042 s。
https://stackoverflow.com/questions/25630602
复制相似问题