Perl AnyEvent::STOMP::Client+;AnyEvent::ForkManger=间歇性错误

Perl AnyEvent::STOMP::Client+;AnyEvent::ForkManger=间歇性错误,perl,anyevent,Perl,Anyevent,我正在尝试编写一个进程,该进程侦听ActiveMQ并基于消息,从一个Web服务中获取数据,进行一些处理,然后将该进程数据放到另一个Web服务中。(REST/JSON) 下面的模块工作正常,直到与我交谈的一个不可靠的Web服务返回错误。我尝试了很多方法来捕捉错误,但都没有成功。一旦发生webservice错误,尽管我收到以下消息: 事件(消息、, AnyEvent::STOMP::Client=HASH(0x3ad5e48),HASH(0x3a6bb0) {“操作”:“已创建”,“数据”:{“id

我正在尝试编写一个进程,该进程侦听ActiveMQ并基于消息,从一个Web服务中获取数据,进行一些处理,然后将该进程数据放到另一个Web服务中。(REST/JSON)

下面的模块工作正常,直到与我交谈的一个不可靠的Web服务返回错误。我尝试了很多方法来捕捉错误,但都没有成功。一旦发生webservice错误,尽管我收到以下消息:

事件(消息、, AnyEvent::STOMP::Client=HASH(0x3ad5e48),HASH(0x3a6bb0) {“操作”:“已创建”,“数据”:{“id”:40578737,“类型”:“警报”,“谁”:null},“guid”:“ADCCEE0C-73A7-11E6-8084-74B346D1CA67”,“主机名”:“myserver”,“pid”:48632}): $fork\u manager->start()应在管理器进程内调用

好的,我从概念上理解,子进程正在尝试启动另一个进程,而fork管理器说这是一个no no。但是考虑到下面的模块,启动新进程以处理长时间运行的进程的正确方法是什么。或者为什么子进程死亡会导致此异常,我如何防止此情况

这是模块(精简版)

最后是一个流量生成器,您可以使用它来查看此操作:

#!/usr/bin/env perl

use lib '../lib';
use lib '../../lib';
use v5.18;

use Data::Dumper;
use JSON;
use Net::STOMP::Client;

$ENV{'scot_mode'} = "testing";

my $stomp = Net::STOMP::Client->new(
    host    => "127.0.0.1",
    port    => 61613
);
$stomp->connect();

for (my $i = 1; $i < 1000000; $i++) {
    my $href    = {
        id      => $i,
        type    => "event",
        what    => "foo",
    };
    my $json    = encode_json $href;
    say "Sending ".Dumper($href);
    $stomp->send(
        destination => "/topic/test",
        body        => $json,
    );
}

$stomp->disconnect();
#/usr/bin/env perl
使用lib'../lib';
使用lib'../../lib';
使用v5.18;
使用数据::转储程序;
使用JSON;
使用Net::STOMP::Client;
$ENV{'scot_mode'}=“测试”;
my$stomp=Net::stomp::Client->new(
主机=>“127.0.0.1”,
端口=>61613
);
$stomp->connect();
对于(我的$i=1;$i<1000000;$i++){
我的$href={
id=>i美元,
类型=>“事件”,
what=>“foo”,
};
my$json=encode_json$href;
说“发送”。转储程序($href);
$stomp->send(
destination=>“/topic/test”,
body=>$json,
);
}
$stomp->disconnect();

我可以通过使用Try::Catch解决这个问题,并使用如下Try-Catch将对self->process的调用包装起来:

$stomp->on_message(sub {
        my ($stomp, $header, $body) = @_;
        my $href    = decode_json $body;
        $pm->start(cb => sub {
            my ($pm, @params) = @_;
            try {
                $self->process(@params);
            }
            catch {
                # error handling stuff
            };
        },
        args    => [ $href->{id}, $href->{data}->{type}, $href->{data}->{who} ],
        );
    }
);
#!/usr/bin/env perl

use lib '../lib';
use lib '../../lib';
use v5.18;

use Data::Dumper;
use JSON;
use Net::STOMP::Client;

$ENV{'scot_mode'} = "testing";

my $stomp = Net::STOMP::Client->new(
    host    => "127.0.0.1",
    port    => 61613
);
$stomp->connect();

for (my $i = 1; $i < 1000000; $i++) {
    my $href    = {
        id      => $i,
        type    => "event",
        what    => "foo",
    };
    my $json    = encode_json $href;
    say "Sending ".Dumper($href);
    $stomp->send(
        destination => "/topic/test",
        body        => $json,
    );
}

$stomp->disconnect();
$stomp->on_message(sub {
        my ($stomp, $header, $body) = @_;
        my $href    = decode_json $body;
        $pm->start(cb => sub {
            my ($pm, @params) = @_;
            try {
                $self->process(@params);
            }
            catch {
                # error handling stuff
            };
        },
        args    => [ $href->{id}, $href->{data}->{type}, $href->{data}->{who} ],
        );
    }
);