从队列管理器中检索MQ消息的脚本文件

3

我想编写一个脚本文件,将到达消息队列管理器的MQ消息附加在日志文件中。请帮忙。

1个回答

1

如果您想要获取通道上的所有消息,可以使用mrmq.dk的BlockIP2页面中的LogIP出口。像SupportPac MA0W这样的API出口可以记录所有放置的消息。API出口可以捕获本地应用程序以及通过通道到达的消息。

如果您想要编写脚本,可以使用诸如Q(来自SupportPac MA01)之类的程序,在消息到达时将其从队列中移除并附加到文件中。

例如:

#!/usr/bin/ksh

q -IMYQMGR/MY.QUEUE >> logfile.txt

通常,脚本会被触发并配置为将新消息附加到文件中。这样做的问题在于它会破坏性地删除消息。如果有一个需要使用这些消息的记录应用程序,这并不是一个好的解决方案。你可以浏览队列,但不能保证在记录应用程序获取消息之前就能获取到这些消息 - 并且浏览会定期重新启动队列头,因此你可能会记录相同的消息两次。
另一个脚本选项是Perl MQSeries模块。该模块公开了WMQ API的所有选项以及面向对象的方法。如果你需要快速而简单的东西,Q程序作为可执行文件提供。如果你想要一个强大的东西,它可以将所有API暴露给你的脚本(并且不介意编译它),那么Perl MQSeries模块是一个很好的选择。下面是一个代码片段,取自该模块的示例,展示如何获取消息:
while (1) {
    $sync_flag = 0;
    undef $outcome;
    my $request_msg = MQSeries::Message::->new();
    my $status = $request_queue->
      Get('Message'       => $request_msg,
          'GetMsgOpts' =>
          {
           'WaitInterval' => 5000,  # 5 seconds
           'Options'      => (MQSeries::MQGMO_WAIT |
                              MQSeries::MQGMO_SYNCPOINT_IF_PERSISTENT |
                              MQSeries::MQGMO_CONVERT |
                              MQSeries::MQGMO_FAIL_IF_QUIESCING),
          },
         );
    unless ($status) {  # Error
        my $rc = $request_queue->Reason();
        die "Error on 'Get' from queue $qmgr_name/$request_qname:\n" .
          "\tReason: $rc (" . MQReasonToText($rc). ")\n";
    }
    next if ($status < 0);      # No message available

过去人们经常将队列转换为主题的别名。使用消息的应用程序被重定向到从新队列获取,并且管理订阅将主题连接到新队列。此时,真正的应用程序获得所有消息,可以为通过主题传递的日志消息创建新的订阅。

我必须以某种方式使用mqget函数来检索消息,然后将内容附加到日志文件中。 - Kullu
我扩展了Q示例以在ksh中展示,并添加了一个Perl示例。标签和原始问题都没有提到平台,但是Q和Perl模块都可在*nix和Windows上使用。 - T.Rob

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接