Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ibm mq WebSphereMQ:Message在输入队列和回退队列之间不断切换_Ibm Mq_Weblogic 10.x - Fatal编程技术网

Ibm mq WebSphereMQ:Message在输入队列和回退队列之间不断切换

Ibm mq WebSphereMQ:Message在输入队列和回退队列之间不断切换,ibm-mq,weblogic-10.x,Ibm Mq,Weblogic 10.x,逻辑流程是这样的 消息被发送到输入队列 调用ProcessorMDB的onMessage。在该方法中,完成了多个操作/验证 在出现有害消息msg的情况下,会抛出应用程序代码无法处理RuntimeException的消息。 这将回滚事务。我们在日志文件中看到了证据。 存在使用回退队列名称定义的回退阈值 一旦达到阈值,消息将被发送到回退队列 但它立即开始在输入队列和回退队列之间来回移动。 我们正在使用MQMON工具来观察这种奇怪的行为。即使在运行MDB的应用服务器关闭后,这种情况也会一直持续下去。

逻辑流程是这样的

消息被发送到输入队列 调用ProcessorMDB的onMessage。在该方法中,完成了多个操作/验证 在出现有害消息msg的情况下,会抛出应用程序代码无法处理RuntimeException的消息。 这将回滚事务。我们在日志文件中看到了证据。 存在使用回退队列名称定义的回退阈值 一旦达到阈值,消息将被发送到回退队列 但它立即开始在输入队列和回退队列之间来回移动。 我们正在使用MQMON工具来观察这种奇怪的行为。即使在运行MDB的应用服务器关闭后,这种情况也会一直持续下去。 我们正在使用Weblogic 10.3.1和WebSphere MQ 6.02
任何帮助都将不胜感激,看起来我们的想法已经没有了。

这听起来像是一个同步点问题。如果QMgr在工作单元内重新请求消息时发出提交,则会影响该线程内同步点下的所有消息。如果应用程序在发出有毒消息之前执行了几个PUT或GET调用,这将导致严重的问题。QMgr不会在程序的控制之外发出提交,而是将消息留在工作单元内的回退队列上,并等待程序发出提交。这可能会导致一些意外行为,例如您看到的消息返回到输入队列的位置

如果在坏消息后面的队列中有另一条消息,并且该消息由同一线程成功处理,那么一切都会顺利进行。应用程序对新消息发出提交,这也会影响退出队列中的有害消息。但是,如果线程在没有显式断开连接或提交的情况下不干净地退出,那么事务将回滚,毒药消息将返回到输入队列

通常的处理方法是,如果事务在输入队列中成批处理,则下一条好消息或一批消息将强制提交。但是,在某些情况下,如果拥有线程没有得到新的工作,可能它正在执行一个GET by Correlation ID,那么就没有任何东西可以将坏消息推送通过。在这些情况下,重要的是确保应用程序在结束之前发出提交。一种方法是编写代码,以等待时间间隔执行GET by CORRELID。如果等待间隔到期,应用程序将获得2033的返回代码,然后在关闭线程之前发出提交。如果回复消息因任何原因合法延迟,则提交将无效。但是,如果消息到达并已退出并重新查询,则提交将使其留在退出队列中

要确切了解发生了什么,一种方法是对相关队列运行跟踪。您可以使用内置的跟踪函数strmqtrc,它比其他函数有更多的选项。但是,如果您想要非常细粒度的控制,可以在中使用跟踪出口。使用MA0W,您可以确切地看到程序进行了哪些API调用以及代表程序进行的API调用

[编辑]使用PMR中的一些信息更新响应:

以下内容来自WMQ V7信息中心:

MessageConsumers是会话级别以下的单线程,并且 任何毒药信息的重新查询 在当前单位内发生 工作这并不会影响 但是,应用程序的操作 当毒药消息重新发出时 在交易或 客户端确认会话 重新查询操作本身不会被删除 提交至当前单位 工作由应用程序提交 代码,或者,如果合适的话 应用程序容器代码

因此,如果重要的是客户有有毒信息 在他们死后立即犯下的 已退出,建议他们 或者使用该应用程序 服务器设施 可以提交的ConnectionConsumer 立即发送消息,或 另一种移动毒物的机制 来自队列的消息


这是指向和信息中心中此信息的链接。因为您使用的是V6客户机,所以您可能希望参考V6信息中心。请注意,对于V6客户端,信息中心中没有提到ASF能够立即提交毒药消息,即使在使用ConnectionConsumer时也是如此。按照我的理解,这意味着您可能需要升级到V7客户端才能获得所需的行为。将有兴趣查看PMR是否会产生类似的建议。

也许您可以发布一些处理事务回滚的代码?查看来回跳转的邮件时,您是否可以验证它是否是具有完全相同标题属性的完全相同的邮件,即重新交付计数等?另外,您是否使用自己的POI回退队列
您是否正在使用系统dlq?@gwhitake:否,我们已为回退队列定义了错误Q。没有处理回滚事务的代码,我们将MDB与CMT一起使用。如前所述,如果在处理过程中遇到错误,我们只会抛出一个运行时异常。我们无法验证消息头,因为它一直在队列之间跳跃,我们根本无法抓住它。也就是说,当我们刷新或想要查看详细信息时,该消息会进入输入Q。这是一种奇怪的行为,这就是为什么我们要访问它out@T.Rob:我们在一个weblogic应用程序服务器中,通过XA事务&MDB的onMessage方法运行它。如果onMessage中遇到任何异常,它只会抛出一个运行时异常,容器开始回滚。我们的假设是,这将导致回退计数增加,一旦达到两个阈值,消息将自动移动到我们设置的回退队列中。虽然我可以理解您的推理,但我无法理解在我的代码或任何设置中,我应该做些什么来指示MQ在backoutQ上提交毒药消息。@SCS075最大的问题是它背后是否有另一条消息来推出毒药消息。如果没有,请添加一个,然后重试。如果是这样,但它仍然表现不好,那么是时候进行跟踪了。跟踪将告诉您WLS代码是否存在阻止消息提交到BOQ上的错误,或者事实上,我描述的场景是否是您看到的行为的原因。@T.Rob:在另一次测试运行中开始看到这种行为后,我们推送了一些消息。那没什么帮助。现在,我正在与MQ管理员一起设置跟踪。一个快速的问题,是很容易读取跟踪文件还是我们需要MQ专家?您需要格式化strmqtrc中的跟踪文件,然后可以相当容易地读取它们。MA0W跟踪更易于阅读,因为您可以在非常细粒度的级别控制跟踪的内容,并且所有内容都是人类可读的。如果你对出口感到满意,就使用那个出口。否则,请使用strmqtrc和dspmqtrc.ok。我掌握了这个问题的诀窍,但找不到解决办法。这是因为WLS服务器不会在回退Q上发出XA_提交。但是我必须从代码中做些什么才能使回退队列被提交呢?我抛出了一个异常,事务已被回滚,无法发出提交,对吗?不同的线程MDB/onMsg正在拾取好的消息。那我该怎么办