我想编写一个脚本文件,该文件将在队列管理器中将到达的 MQ 消息附加到日志文件中。请帮忙
如果您希望所有消息都到达通道,则可以使用 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
人们过去做的一件事是将队列转换为主题上的别名。 使用消息的应用将从新队列重定向到 GET,管理订阅将主题连接到新队列。 此时,真正的应用程序将获取所有消息,并且可以进行新的订阅以记录通过该主题的消息。