0

我需要检索 pgmq 中的所有消息。我尝试使用 *FIRST 作为参数,但 api 不返回任何内容。

     qmhrcvpm(rcvm0200:%size(rcvm0200):'RCVM0200':'*':0:
              '*FIRST':*BLANKS:0:'*SAME':errDS);

Althoug,如果我使用密钥,api会返回正确的消息:

    qmhrcvpm(rcvm0200:%size(rcvm0200):'RCVM0200':'*':0:
              '*ANY':fldkey:0:'*SAME':errDS);

David:api不返回错误,errDs的bytesAvailable为0

曼迪:我不明白你的问题。

4

2 回答 2

1

为了从作业日志中获取消息,您需要使用“*PRVJLMSG”或“*NXTJLMSG”。

根据您要处理的消息的顺序选择一个。

第一次调用应该收到消息密钥 x'00000000'。

然后您使用检索到的密钥来获取下一条消息。

requestKey = x'00000000';
DOU errDS.bytesAvailable > 0 Or rcvm0200.bytesAvailable = 0;
  qmhrcvpm(rcvm0200:%size(rcvm0200):'RCVM0200':'*':0:
          '*NXTJLMSG':requestKey :0:'*SAME':errDS);
  requestKey = rcvm0200.Msgid;

Enddo;
于 2019-05-14T16:41:28.173 回答
1

我开始写这篇评论作为评论,但当我打字时,它既要求澄清又提供答案。

您使用 *ANY 和 检索什么类型的消息fldkey?如果消息是 *REQUEST 消息,那是您的问题。*FIRST、*NEXT 和 *PRV 都跳过请求消息。

或者,您可能正在检索作业日志中的某处消息,而不是在您按键检索时正在检索的活动程序或过程。*FIRST、*NEXT 和 *PRV 仅检索队列中活动程序或过程的消息。有关*NXTJLMSG 或 *PRVJLMSG 描述中的说明,请参阅文档。

我还在Message Key描述下的文档中找到:

如果您知道要接收的消息的消息密钥,则可以接收该消息,而无需考虑包含该消息的呼叫消息队列。您可以通过在此参数中指定键、调用堆栈条目参数的特殊值“*”和调用堆栈计数器参数的值“0”来执行此操作。如果消息被发送到不再在调用堆栈中的调用堆栈条目,这将很有用。

根据 *NXTJLMSG 的描述,也许对你有用的是使用 *NXTJLMSG 和 *TOP 或x'00000000'.

于 2019-05-06T15:11:28.017 回答