我在多線程環境中使用MQSeries Perl模塊時出現問題。在這裏我曾嘗試過:多線程與MQ
- 在不同的線程中創建兩個句柄與
$mqMgr = MQSeries::QueueManager->new()
。我認爲這會給我兩種不同的MQ連接,但是在第二次調用MQOPEN()
時,我得到了返回碼2219,這可能意味着我通過兩次單獨調用new()方法獲得了與mq相同的下層連接。 - 聲明只有一個$ mqMgr全球共享變量。但是我不能將對MQSeries :: QueueManager對象的引用分配給
$mqMgr
。原因是「參數:: shared :: shared的arg 1的類型必須是[$ @%]之一(不是子例程條目)」 - 只聲明一個
$mqMgr
作爲全局變量。得到相同的2219代碼。 - 試圖將
MQCNO_HANDLE_SHARE_NO_BLOCK
轉換爲MQSeries::QueueManager->new()
,以便跨線程共享單個連接。但我不能找到一種方法,通過它英寸
我的問題是,用Perl模塊的MQSeries
- 我如何/可以從不同的線程來MQ隊列管理單獨的連接?
- 如何在不同的線程上共享MQ隊列管理器的連接?
我環顧四周,但有一點運氣,任何信息,將不勝感激。
相關的問題:
更新1:添加例如兩個地方的MQSeries ::兩個線程事業MQ錯誤代碼的QueueManager對象2219
use threads;
use Thread::Queue;
use MQSeries;
use MQSeries::QueueManager;
use MQSeries::Queue;
# globals
our $jobQ = Thread::Queue->new();
our $resultQ = Thread::Queue->new();
# ----------------------------------------------------------------------------
# sub routines
# ----------------------------------------------------------------------------
sub worker {
# fetch work from $jobQ and put result to $resultQ
# ...
}
sub monitor {
# fetch result from $resultQ and put it onto another MQ queue
my $mqQMgr = MQSeries::QueueManager->new(...);
# different queue from the one in main
# this would cause error with MQ code 2219
my $mqQ = MQSeries::Queue->new(...);
while (defined(my $result = $resultQ->dequeue())) {
# create an mq message and put it into $mqQ
my $mqMsg = MQSeries::Message->new();
$mqQ->put($mqMsg);
}
}
# main
unless (caller()) {
# create connection to MQ
my $mqQMgr = MQSeries::QueueManager->new(...);
my $mqQ = MQSeries::Queue->new(...);
# create worker and monitor thread
my @workers;
for (1 .. $nThreads) {
push(@workers, threads->create('worker'));
}
my $monitor = threads->create('monitor');
while (True) {
my $mqMsg = MQSeries::Message->new();
my $retCode = $mqQ->get(
Message => $mqMsg,
GetMsgOptions => $someOption,
Wait => $sometime
);
die("error") if ($retCode == 0);
next if ($retCode == -1); # no message
# not we have some job to do
$jobQ->enqueue($mqMsg->Data);
}
}
包含一些示例代碼可能很有用 - 例如[MVCE](http://stackoverflow.com/help/mcve)。 – Sobrique
@Sobrique感謝您的建議,添加了示例。 – Sky
你在Win32上嗎? – Sobrique