2

我在虚拟机上有一个用服务器,这是工作流程:

  • 客户在路由中发布一些内容/post_wait:POST 应该等待业务处理返回结果
  • 请求由另一个 VM 处理(通信由POE + IKC处理)
  • 报告应通过路由返回给服务器/report使用会话 ID 标识的客户REST

舞者代码:(这就是我到目前为止所尝试的)

package var;
use Data::Dumper;
use Dancer ':syntax';
use JSON::XS;

my $session = {};

# curl -H 'Content-Type: application/json' -X POST -d '{"id":22}' http://127.0.0.1:3000/post_wait
post '/post_wait' => sub {
    my $json = request->body;
    my $h = decode_json $json;
    my $id = $h->{id};
    until (exists $session->{$id}->{report}) {
        sleep 1;
        print STDERR ".";
    }

    return Dumper $session;
};

# curl -H 'Content-Type: application/json' -X POST -d '{"foobar":"xxxx"}' http://127.0.0.1:3000/report
post '/report' => sub {
    my $json = request->body;
    my $h = decode_json $json;
    my $id = $h->{id};
    $session->{$id}->{report} = $h;
    return "OK\n";
};

true;

问题是这段代码挂起,因为我让父进程休眠。

也许我应该使用:

我的信息系统应该是可扩展的并处于模式。

做我想做的事的最佳做法是什么?

4

1 回答 1

2

你需要某种视觉跟踪。为此使用 Dancer::Session。

你需要做一些“异步”,可能是 fork()。

然后您可以通过调用来启动业务流程

# curl -H 'Content-Type: application/json' -X POST -d '{"id":22}' http://127.0.0.1:3000/post_wait

进程被分叉并且pid存储在会话中的位置。

然后你可以打电话

# curl -H 'Content-Type: application/json' -X POST -d '{"foobar":"xxxx"}' http://127.0.0.1:3000/report

从您的会话中获取 pid(如果有的话)并检查该进程是否仍在运行。

于 2013-02-05T13:15:36.973 回答