连接到STOMP队列的订阅者不会被添加到循环分发

时间:2017-01-05 20:24:31

标签: perl rabbitmq stomp

我在RabbitMQ上使用perl的Net::Stomp来构建一个非常简单的跨平台分布式工作队列。我们的想法是将一堆作业提交给一个队列名称,并让一些工作人员完成工作并执行它们。

如果我启动“工作人员”并将帧/作业提交到队列中,我就会得到我期望的结果:工作人员以循环方式将队列弹出队列。

如果我将作业提交到持久队列然后启动一些工作人员,那么只有第一个工作人员从队列中取出作业。

# submit.pl
use Net::Stomp;
use JSON::PP;

my $stomp = Net::Stomp->new( { hostname => 'localhost', port => '61613' } );

$stomp->connect( { login => 'a', passcode => 'a' } ) or die;

for (my $i=0; $i < 20; $i++) {
    my $package = encode_json( { seed => $i } );
    $stomp->send( { destination => '/queue/runs', body => $package } );
}

$stomp->disconnect;

# worker.pl
my $stomp = Net::Stomp->new( { hostname => 'localhost', port => '61613' } );
$stomp->connect( { login => 'a', passcode => 'a' } );
$stomp->subscribe({
        destination             => '/queue/runs',
        ack                     => 'client',
        'activemq.prefetchSize' => 1 });


while (my $frame = $stomp->receive_frame) {
    next unless defined $frame;
    $stomp->ack( { frame => $frame } );
    next unless $frame->body;
    my $spec = decode_json $frame->body;
    say $$ . " " . $spec->{seed};
    sleep 1;
}

运行此:

$ perl submit.pl && perl worker.pl & perl worker.pl

我期望看到的是:

30026 0
30024 1
30026 2
30024 3
...

相反,我看到只有第一个“工人”从队列中拉出帧。如果我杀了第一个“工人”进程,那么第二个就开始拉帧。

30024 0
30024 1
30024 2
30024 3
...

我希望情况是,当工作者订阅队列时,他们开始以循环方式拉帧。我宁愿不必编写明确的东西来处理这个问题。我假设协议中已经存在一些我忽略的机制,或者Net::Stomp中的错误?

正如我所说,如果工作人员在submit.pl运行之前正在运行,则循环调度工作正常。

1 个答案:

答案 0 :(得分:0)

在Rabbitmq的STOMP插件中,activemq.prefetchSize文档中显示的Net::Stomp键不执行任何操作。我所要做的只是将其改为'prefetch-count' => 1,然后一切按预期工作。