MQSeriesQueueManager 队列管理器:
MQSeries::QueueManager - OO interface to the MQSeries Queue Manager
O O 面向对象 MQSeries 队列管理器:
语法:
use MQSeries qw(:functions);
use MQSeries::QueueManager;
#
# Simplest, trivial usage
#
my $qmgr = MQSeries::QueueManager->
new(QueueManager => 'some.queue.manager' ) ||
die("Unable to connect to queue manager
");
[mqm@node01 mqm]$ cat t4.pl
use MQSeries qw(:functions);
use MQSeries::QueueManager;
#
# # Simplest, trivial usage
# #
my $qmgr = MQSeries::QueueManager->
new(QueueManager => 'YWJZZF_CZCB_SEND1' ) ||
die("Unable to connect to queue manager
");
[mqm@node01 mqm]$ perl t4.pl
MQCONN failed (Reason = 2058) (Queue manager name not valid or not known.) at t4.pl line 7.
Unable to connect to queue manager
##最后的错误检查,处理对象:
##实例化和连接到队列管理器
## 高级使用,让连接超时,和重连
my $qmgr = MQSeries::QueueManager->new
(
QueueManager => 'some.queue.manager',
AutoConnect => 0,
ConnectTimeout => 120,
RetryCount => 60,
RetrySleep => 10,
) || die "Unable to instantiate MQSeries::QueueManager object
";
$qmgr->Connect() ||
die("Unable to connect to queue manager
" .
"CompCode => " . $qmgr->CompCode() . "
" .
"Reason => " . $qmgr->Reason() .
" (", MQReasonToText($qmgr->Reason()) . ")
";
##避免通道表文件或者MQSERVER 变量和指定客户端连接选项:
my $qmgr = MQSeries::QueueManager->new
(
QueueManager => 'some.queue.manager',
ClientConn => { 'ChannelName' => 'FOO',
'TransportType' => 'TCP', # Default
'ConnectionName' => "hostname(1414)", ###ip 端口
'MaxMsgLength' => 16 * 1024 * 1024,
},
) || die("Unable to connect to queue manager
");
##把一个消息在同步点之下,然后commit/backout(在很多情况下,一个put 完成使用一个MQSeries::Queue object instead
###往MQ队列放入消息:
[mqm@node01 mqm]$ cat t4.pl
use MQSeries qw(:functions);
use MQSeries::QueueManager;
#
# # Simplest, trivial usage
# #
my $qmgr = MQSeries::QueueManager->
new(QueueManager => 'YWJZZF_CZCB_SEND' ) ||
die("Unable to connect to queue manager
");
my $msg_data="hhdsdahdgahadg";
my $msg = MQSeries::Message->new(Data => $msg_data);
$qmgr->Put1(Message => $msg,
Queue => 'CZ_RSP',
);
[mqm@node01 mqm]$ perl t4.pl
[mqm@node01 mqm]$
描述:
MQSeries::QueueManager 对象是一个面向对象的用于连接到MQSeries 队列管理器,打开或者查询一个队列管理器对象。
这个模块是结合 MQSeries::Queue, MQSeries::Message and MQSeries::Properties, and the other MQSeries::* modules 一起使用
那些对象提供一个简单的,高层次的接口道MQI
这个模块也提供了特定的支持 用于连接超时(用于打断MQCONNX() 请求,请求可能会hang很久),
以及连接重试
METHODS :
new
构造函数以一个散列作为一个参数,具有以下键:
Key Value
=== =====
QueueManager String
Carp CODE reference
AutoConnect Boolean
AutoCommit Boolean
ConnectTimeout Numeric
ConnectTimeoutSignal String
GetConvert CODE reference
PutConvert CODE reference
RetrySleep Numeric
RetryCount Numeric
RetryReasons HASH Reference
CompCode Reference to Scalar Variable
Reason Reference to Scalar Variable
QueueManager:
这个只是 队列管理器的名字 你需要连接的,这是直接传递到MQCONNX() 请求
通常,这个是简单的队列管理器的名字 你希望连接,但是如果"default" 队列管理器被使用,
然后这个可以是一个空字符串,也可以完全省略
Carp:
这个key 指定了一个code 引用到一个程序来替换所有的carp()请求到API,
允许API 用户来捕获和处理所有的错误消息
AutoConnect 自动连接:
这是一个可选的参数 默认是true, 如果值的参数是false,然后构造器不会自动调用Connect()方法,
允许开发显示的调用,这样单独的错误检查对象实例化和连接到队列管理器。
AutoCommit:
如果这个参数设置为true, 那么挂起的事务会自动被提交 在对象消灭前。
如果为false, 等待的事务 会被退出 在从队列管理器断开前
ClientConn
ClientConn => { 'ChannelName' => "$ChannelName",
'TransportType' => 'TCP', # Default
'ConnectionName' => "$ip($port)",
'MaxMsgLength' => 16 * 1024 * 1024,
},
对于客户端连接, 连接信息必须被以某种方式提供。
默认, client channel table 文件(MQCLCHL.TAB) 或者 MQSERVER
使用环境变量。
这个额外的参数允许你指定细节在你的代码里
ClientConn 参数 是一个ChannelName 的hash 引用,ConnectionName 和 MaxMsgLength 是最中肯的。
ConnectTimeout
如果 这个值是给定, 它必须是一个正整数。 这个是时间, 单位秒,
一个MQCONNX() 必须完成 在MQI 调用会被中断。
默认值,以为着MQCONNX() 称不中断。
Connect:
这个方法 不需要参数, 只是叫calls MQCONNX() 来连接到队列管理器
这个方法是被自动调用的通过构造器,除非AutoConnect 参数是指定的
Disconnect
该方法没有参数, 仅仅调用MQDISC()来断开队列管理器
需要注意的是, 这个方法不需要被调用,因为它是隐式被调用通过对象破坏者。
如果Disconnect() 调用 错误需要被处理
Put1
这个方法封装 MQPUT1 call, 参数是一个hash,使用下面的key/value对
Key Value
=== =====
Message* MQSeries::Message object
Queue String, or ARRAY reference (distribution list)
QueueManager String
ObjDesc HASH reference
PutMsgOpts HASH Reference
PutMsgRecs ARRAY Reference
Sync Boolean
PutConvert CODE reference
Properties HASH Reference or MQSeries::Properties object
[mqm@node01 mqm]$ cat t4.pl
use MQSeries qw(:functions);
use MQSeries::QueueManager;
#
# # Simplest, trivial usage
# #
my $qmgr = MQSeries::QueueManager->
new(QueueManager => 'YWJZZF_CZCB_SEND' ) ||
die("Unable to connect to queue manager
");
my $msg_data="hhdsdahdgahadg";
my $msg = MQSeries::Message->new(Data => $msg_data);
$qmgr->Put1(Message => $msg,
Queue => 'CZ_RSP',
);
返回值 是true 或者false,依赖于 MQPUT1() 请求成功 如果失败
如果一个PutConvert() 方法失败,在actual MQPUT1() 函数是被调用,
Message
这个参数是消息被放入到队列,该值必须是一个 MQSeries::Message对象
Queue:
这是一个队列,或者列出队列 如果使用一个分布式列表,放置消息。
如果一个单独的队列, 然后这个值是一个字符串,命名的队列
如果它是一个分布式列表, 然后这个值是一个ARRAY 引用,列出当前队列
QueueManager
注意 这个Key 是只有相关的 我们不适用分布式列表
这个描述 目标队列的队列管理器
my $qmgr_obj = MQSeries::QueueManager->new
(
QueueManager => "$QueueManager",
ClientConn => { 'ChannelName' => "$ChannelName",
'TransportType' => 'TCP', # Default
'ConnectionName' => "$ip($port)",
'MaxMsgLength' => 16 * 1024 * 1024,
},
) || die("Unable to connect to queue manager
");
Queue 队列:
这是队列,或者队列的列表 如果使用一个分布式列表, 来put消息。
如果它是单独的队列, 然后只是一个字符串,命名队列。
如果它是一个分布式列表, 然后这个值是一个ARRAY 引用,列出目标队列
ObjDesc:
整个 ObjDesc 结构传递到潜在的MQPUT1()调用可以指定通过key.
在这种情况下,Queue and/or QueueManager 是简单忽略的。
PutMsgOpts
这个参数强制 开发者指定完整的PutMsgOpts 结构,
会覆盖便利的flag的使用,比如 Sync.
Sync:
这是一个flag 来表明 Syncpoint 选项被使用, messages(s) 不提交到队列知道一个MQBACK或者MQCOMM 调用被执行
它们是封装了Backout() and Commit() methods
PutConvert:
看到 new() 构造文档对于冗长的细节, 这个可以指定通过知识PUT1()方法在一个转换的消息需要被放入到一个队列
在a MQSeries::QueueManager object
Close:
该方法没有参数, 只是仅仅调用MQCLOSE() 来关闭实际的队列管理器对象。
这个意味着只有当队列管理已经通过Inquire() 被打开
my $getmessage = MQSeries::Message->new(Data =>"");
$attr = $command->InquireQueue
(
QName => "$QueueName",
QAttrs => [qw(
OpenInputCount
OpenOutputCount
CurrentQDepth
)],
) or die "InquireQueue: " . MQReasonToText($command->Reason()) . "
";
Inquire:
这种方法是一个接口道MQINQ() API 调用,然而,如果它需要更多方便,人可读的字符串代替
my $queue = MQSeries::Queue->
new(QueueManager => $qmgr_obj,
Queue => "$QueueName",
Mode => 'input_exclusive',
) or die("Unable to open queue.
");