Websphere MQ - 获取原因代码为2042的错误

时间:2014-09-02 19:10:06

标签: c++ ibm-mq suse

我们在ImqQueue::get( ImqMsg &, ImqGetMessageOptions & );来电时出现间歇性错误,原因代码为2042,基于Websphere文档,这应该是Not Happen™;我们应该只打开那个原因代码。

此错误是否表明服务器无法打开队列,或者是否表明我们的客户端存在问题?处理此错误的最佳方法是什么?现在我们只记录它发生了,但它发生了一个很多。不幸的是,我并不精通Websphere MQ;在我走的时候,我有点挑选这个,所以我没有把所有的术语都正确。

我们的客户端是用C ++编写的,链接libmq 6.0.2.4并在SLES-10上运行。除了运行版本7.1之外,我不知道服务器的详细信息。我们要求升级以使我们的方面保持最新状态。我们有多个客户端同时运行的实例;所有人都使用相同的请求队列,但每个队列都使用MQOO_INPUT_EXCLUSIVE + MQOO_INPUT_FAIL_IF_QUIESCING创建自己的动态回复队列。

1 个答案:

答案 0 :(得分:1)

如果队列尚未打开,ImqQueue :: get方法将隐式为您打开队列。这将最终使用MQOO_INPUT_AS_Q_DEF选项,因此将使用队列上的DEFSOPT(EXCL | SHARED)属性。您还应该仔细检查队列是否已定义SHARE而不是NOSHARE,但我怀疑它已经被正确设置。

你提到你有多个应用程序同时运行的实例,所以如果其中一个实体的队列被隐式打开为MQOO_INPUT_AS_Q_DEF,从DEFSOPT导致MQOO_INPUT_SHARED,那么如果其他人打开它,它将获得2042(MQRC_OBJECT_IN_USE)。如果当时没有其他任何东西打开,那么隐式打开将起作用,后来的实例将取代2042。

如果它是间歇性的,那么我建议你的应用程序中有一条路径,它不会调用ImqQueue :: open方法。当你寻找它时,将队列定义更改为DEFSOPT(共享)应该摆脱2042年。