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

时间:2012-04-25 17:28:42

标签: ibm-mq

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

1 个答案:

答案 0 :(得分:1)

如果您希望所有邮件都到达某个频道,您可以使用mrmq.dk的BlockIP2页面中的LogIP退出。 API退出(例如SupportPac MA0W)可以记录所有放入的消息。 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

过去人们做过的一件事就是将队列转换为主题的别名。使用消息的应用程序从新队列重定向到GET,管理订阅将主题连接到新队列。此时,真正的应用程序将获取所有消息,并且可以进行新的订阅以记录通过该主题的消息。

相关问题