WebSphere MQを使った電文の送受信をするにはC言語やJavaなど、IBMがサポートするAPIが用意された言語でしか使用できないと思っていたのですが、先日Perlでもそれを可能にする「MQSeries」なるモジュールが公開されていることを知りました。
さっそくCPANからソースをダウンロードしてAIX機にインストールしていろいろ試してみましたがこれは便利!これまではテストやなんかで特殊な編集を伴う電文の送受信が必要な場合はC言語で面倒な文字列操作をやってましたが、もともと文字列編集が得意なPerlだとそうした負荷が大幅に軽減できます。複数の環境を使い分ける必要がある場合もPerlだったらあちこちでコンパイルする必要もありません。
参考までに…電文送信(MQPUT)用に作成したサンプルプログラムはこちら。
#!/usr/bin/perl
use MQSeries;
use constant QUEMGR => '(キューマネージャー名)';
use constant QUENAM => '(キュー名)';
my ($CompCode, $Reason);
# MQ Connect
my $Hconn = MQCONN(QUEMGR, $CompCode, $Reason);
if ($CompCode) { print "MQCONN ERROR " . QUEMGR ." ($CompCode)\n"; exit; }
# MQ Open
my $ObjDesc = {
ObjectName => QUENAM,
#DynamicQName => 'FOOBAR*',
};
my $Options = MQOO_OUTPUT | MQOO_FAIL_IF_QUIESCING | MQOO_SET_IDENTITY_CONTEXT;
my $Hobj = MQOPEN($Hconn, $ObjDesc, $Options, $CompCode, $Reason);
if ($CompCode) { print "MQOPEN ERROR $ObjDesc->{ObjectName} ($CompCode)\n"; exit; }
# MQ Put
my $MsgDesc = {MQMD_DEFAULT};
my $PutMsgOpts = { Options => MQPMO_FAIL_IF_QUIESCING };
my $Msg; foreach() { $Msg .= $_; }
MQPUT($Hconn, $Hobj, $MsgDesc, $PutMsgOpts, $Msg, $CompCode, $Reason);
if ($CompCode) { print "MQPUT ERROR ($CompCode)\n"; exit; }
# MQ Commit
MQCMIT($Hconn, $CompCode, $Reason);
if ($CompCode) { print "MQCMIT ERROR ($CompCode)\n"; exit; }
# MQ Close
MQCLOSE($Hconn,$Hobj,$Options,$CompCode,$Reason);
# MQ Disconnect
MQDISC($Hconn, $CompCode, $Reason);
exit;
__DATA__
送信したいメッセージ
受信(MQGET)用はこんな感じ。
#!/usr/bin/perl
use MQSeries;
use constant QUEMGR => '(キューマネージャー名)';
use constant QUENAM => '(キュー名)';
my ($CompCode, $Reason);
# MQ Connect
my $Hconn = MQCONN(QUEMGR, $CompCode, $Reason);
if ($CompCode) { print "MQCONN ERROR " . QUEMGR ." ($CompCode)\n"; exit; }
# MQ Open
my $ObjDesc = {
ObjectName => QUENAM,
#DynamicQName => 'FOOBAR*',
};
my $Options = MQOO_INPUT_SHARED | MQOO_FAIL_IF_QUIESCING;
my $Hobj = MQOPEN($Hconn, $ObjDesc, $Options, $CompCode, $Reason);
if ($CompCode) { print "MQOPEN ERROR $ObjDesc->{ObjectName} ($CompCode)\n"; exit; }
# MQ Get
my $MsgDesc = {MQMD_DEFAULT};
my $GetMsgOpts = {
Options => MQGMO_FAIL_IF_QUIESCING | MQGMO_SYNCPOINT | MQGMO_WAIT,
WaitInterval => MQWI_UNLIMITED,
};
my $BufferLength = 10240; # 受信バッファサイズ
my $Buffer = MQGET($Hconn, $Hobj, $MsgDesc, $GetMsgOpts, $BufferLength, $CompCode, $Reason);
print "$Buffer\n";
if ($CompCode) { print "MQGET ERROR ($CompCode)\n"; exit; }
# MQ Commit
MQCMIT($Hconn, $CompCode, $Reason);
if ($CompCode) { print "MQCMIT ERROR ($CompCode)\n"; exit; }
# MQ Close
MQCLOSE($Hconn,$Hobj,$Options,$CompCode,$Reason);
# MQ Disconnect
MQDISC($Hconn, $CompCode, $Reason);
exit;
「MQSeries」に関する日本語の資料や解説はほとんど見当たらなかったのですが、CPANに記載されたドキュメントでほぼ充足。オプションなどはC言語でのMQ送受信のロジックを組んだことがあればさほど迷うこともないでしょう。