在我的 Catalyst 应用程序中,我使用带有 WSDL 的 SOAP 与远程服务器建立了非常重要的连接。
一切正常,但是当远程服务器由于某种原因关闭时,我的所有应用程序都会等待超时到期。一切。所有的控制器和进程,所有的客户端!!
如果我为 SOAP LITE 传输错误设置了 15 秒的超时,那么一切都会等待 15 秒。在超时等待期间,无法显示来自任何用户或连接的任何页面。
我将 Fast CGI 和 Ngnix 用于 Catalyst 应用程序。如果我在一个等待时使用多个 fcgi 进程,其他人会处理连接,但如果他们都尝试访问有故障的 SOAP 服务......他们都会等待并等待答案,直到达到超时。当他们都在等待时,不允许更多的连接。
寻找我在某处读到 SOAP::LITE 是“单线程”的答案。
这是真的吗?这是否意味着我的所有应用程序以及所有访问者都只能使用一个SOAP 连接?很难相信。
这是我的通话代码:
sub check_result {
my ($self, $code, $IP, $PORT) = @_;
my $soap = SOAP::Lite->new( proxy => "http://$IP:$PORT/REMOTE_SOAP
+");
$soap->autotype(0);
$soap->default_ns('http://REMOTENAMESPACE/namespace/default');
$soap->transport->timeout(15);
$soap-> on_fault(sub { my($soap, $res) = @_;
eval { die ref $res ? $res->faultstring : $soap->transport->st
+atus };
return ref $res ? $res : new SOAP::SOM;
});
my $som = $soap->call("remote_function",
SOAP::Data->name( 'Entry1' )->value( $code ),
);
return $som->paramsout;
}
我还尝试了 perlmonks 建议的这种略有不同的方法,但没有什么比这更好的了
拜托,有人能指出我正确的方向吗?
米格