Я нахожусь в процессе адаптации некоторого существующего кода с помощью Net :: Stomp от возможности обрабатывать одну тему до возможности работы над несколькими темами.Кто-нибудь может сказать мне, возможен ли такой подход?Сейчас он не работает, потому что там, где он ожидает получения транзакции, он получает первое сообщение по другой теме.Я хотел бы знать, просто ли я лаю неправильное дерево, прежде чем пытаться исправить это.
Вот как выглядит рабочий процесс:
# first subscribe to three different queues
for $job (qw/ JOB1 JOB2 JOB3 /){
$stomp->subscribe({
"ack" => "client",
"destination" => "/queue/$job"
});
# listen on those three channels...
while($stomp->can_read){
$frame = $stomp->receive_frame();
# ... receives a message for JOB1
# and to start a transaction send a BEGIN frame that looks like this:
bless({
command => "BEGIN",
headers => {
receipt => "0002",
transaction => "0001",
},
}, "Net::Stomp::Frame")
# Then looks for a receipt on that frame by calling
$receipt = $stomp->receive_frame()
К сожалению, гдеон ожидает фрейм RECEIPT, фактически получает следующий фрейм MESSAGE, ожидающий в очереди JOB2.
Мой вопрос: есть ли способ, чтобы это работало, быть подписанным на несколько тем и иметь возможностьполучать квитанции о транзакциях?Или есть лучший / более стандартный способ справиться с этим?
Любые советы или предложения будут приветствоваться, спасибо!Я также публикую этот вопрос в списке ActiveMQ, надеюсь, что все в порядке: - /
* обновление *
Вот полный пример воспроизведения:
use Net::Stomp;
use strict;
my $stomp = Net::Stomp->new( { hostname => 'bpdeb', port => '61612' } );
$stomp->connect( { login => 'hello', passcode => 'there' } );
# pre-populate the two queues
$stomp->send( { destination => '/queue/FOO.BAR', body => 'test message' } );
$stomp->send( { destination => '/queue/FOO.BAR2', body => 'test message' } );
# now subscribe to them
$stomp->subscribe({ destination => '/queue/FOO.BAR',
'ack' => 'client',
'activemq.prefetchSize' => 1
});
$stomp->subscribe({ destination => '/queue/FOO.BAR2',
'ack' => 'client',
'activemq.prefetchSize' => 1
});
# read one frame, then start a transaction asking for a receipt of the
# BEGIN message
while ($stomp->can_read()){
my $frame = $stomp->receive_frame;
print STDERR "got frame ".$frame->as_string()."\n";
print STDERR "sending a BEGIN\n";
my($frame) = Net::Stomp::Frame->new({
command => 'BEGIN',
headers => {
transaction => 123,
receipt => 456,
},
});
$stomp->send_frame($frame);
my $expected_receipt = $stomp->receive_frame;
print STDERR "expected RECEIPT but got ".$expected_receipt->as_string()."\n";
exit;
}
Это выводит (с пропущенными деталями)
got frame MESSAGE
destination:/queue/FOO.BAR
....
sending a BEGIN
expected RECEIPT but got MESSAGE
destination:/queue/FOO.BAR2
....
При просмотре сетевого трафика, как только отправляется запрос ПОДПИСАТЬСЯ, первое сообщение в очереди передается по проводам наклиент.Итак, первое сообщение от FOO.BAR2 уже ждет в сетевом буфере клиента, когда я отправляю сообщение BEGIN, и клиент читает FOO.BAR2 прямо из его буфера.
Так что либо я делаю что-то не такили так не получится.