【发布时间】:2019-08-05 13:26:07
【问题描述】:
我目前正在从一个充满事务(消息)的远程队列中读取数据。我通过访问队列并测量记录的大小来阅读它。
getOptions.options = MQC.MQGMO_CONVERT + MQC.MQGMO_WAIT;queue.getCurrentDepth();
仅当队列的大小大于 0 时。我继续获取消息。
我的问题是,对于某些消息,我收到以下错误: MQJE001:完成代码“2”,原因“2033”。
但仅对于某些消息,有趣的是我有一个自定义重试变量,第三次重试得到一个空白消息。
我可能的解决方案:
起初我认为它可能是 waitInterval,我将它从 150 毫秒更改为 30 秒。对于某些消息,我可以在不到 100 毫秒的时间内正确获取它们。但是给我带来问题的消息会占用所有的waitInterval,然后给出错误并获得空白消息以进行第三次重试。
第二个测试是验证MQMessage类的参数,我原来有:
- 消息类型:8
- 编码:273
- 格式:
- 字符集:0
当我正确收到消息时,仍保留以下参数:
- 消息类型:8
- 编码:273
- 格式:MQSTR
- 字符集:819
当我在第三次重试时收到一条导致错误 2033 的消息时,我收到一条空白消息,并且参数更改为以下内容:
- 消息类型:8
- 编码:273
- 格式:
- 字符集:819
我开始认为队列中的消息没有指示正确的格式。所以我联系了支持人员,他们确认所有消息都有正确的转换标头。
所以我仍然怀疑为什么这个问题,如果有人遇到过类似的事情,会感谢你的评论。谢谢。
【问题讨论】:
-
我建议您改为执行循环,并在循环问题中等待。如果等待到期,您会得到 2033,忽略它并循环到下一个获取。
-
queue.getCurrentDepth()将显示您无法获取的未提交消息。 -
谢谢@JoshMc,明天当我收到交易时,我会这样做。我将在 getOptions 中添加此选项。
MQGMO_ALL_SEGMENTS_AVAILABLE因为它是一个远程队列,所以我收到的消息可能不是所有可用段 -
虽然设置
MQGMO_ALL_SEGMENTS_AVAILABLE不应该对邮件造成任何伤害,但它可能也无济于事。分段消息要求发送应用程序在放入的消息的 MQMD 上设置消息标志MQMF_SEGMENTATION_ALLOWED,然后告诉队列管理器允许执行消息自动分段。以我的经验,这不是一个非常常见的设置。如果您确实指定了该选项,您还应该同时指定这两个选项MQGMO_LOGICAL_ORDER和MQGMO_COMPLETE_MSG。 -
@Roger 提供了一个很好的例子来实现我在第一条评论中评论的内容。