尽我所知,WSO2 ESB无法正确处理代理不返回响应消息的服务操作。
以下是该方案:
我们在WSO2应用服务器4.1.0上安装了代码优先的axis2生成的Web服务。
服务所基于的java类有一些方法,如:
public void updateMyObject(MyObject obj) throws MyServiceException
Axis2生成一个不包含响应消息的WSDL,因此这基本上是单向的。
注意:针对此操作运行的axis2生成的客户端存根工作正常。在客户端代码中调用存根时,客户端会阻塞,直到服务器成功处理该操作。如果服务器上发生错误,则会引发自定义错误,并在客户端抛出异常。
但是,我们希望通过ESB进行此调用。设置简单的基本代理服务器将无法正常工作。通过ESB调用服务时,即使远程服务已成功调用,客户端代码也会无限期地阻塞。
我在某处读到这可以通过在我的inSequence中添加以下内容来修复:
<property action="set" name="OUT_ONLY" value="true"/>
<property action="set" name="FORCE_SC_ACCEPTED" scope="axis2" value="true"/>
这可以解决远程服务成功处理响应的问题。客户端代码不再阻止。
但是,如果处理请求时出错,则客户端不知道。 ESB基本上“吃掉”错误。
这是毫无疑问的,因为由于OUT_ONLY设置,没有为操作注册回调处理程序。在下面的链接中搜索OUT_ONLY以获取更多信息:
http://techfeast-hiranya.blogspot.ca/2009/12/wso2-esb-tips-tricks-03-transport.html
FORCE_SC_ACCEPTED设置似乎会阻止客户端在成功条件下阻塞,可能是因为它强制对客户端发出202 http响应,因此它会停止等待响应。
由于客户端对成功和错误条件的服务应该运行,但我无法配置产生相同行为的代理服务,在我看来,ESB缺乏这种方式,这是一个bug
当然,如果有一种方法可以配置它以便它能够满足我的需求,那么我很乐意听到它。
但是尽管我已经知道了,但我认为即使没有回复,也不会在此处注册回拨是错误的。我不想实施火灾而忘记这里。执行仍然应该从客户端同步进行。我的客户期待HTTP 200响应,但没有成功的机构。
通过检查WSDL,ESB应该意识到服务没有响应消息但仍然注册回调。当成功收到200 OK时,它应该将其传播回客户端并取消注册回叫。当发生故障时,它还应该将其转发回客户端。
那么,有没有办法通过ESB实现我想要的东西,或者这种方式是否有缺陷?
答案 0 :(得分:0)
However, if there is an error processing the request, the client doesn't know. The ESB basically "eats" the error
如果在这种情况下为代理定义故障序列,客户端会发生什么?
如果我们为一个不经常的操作注册一个回调,那么ESB将会永远等待响应,并且将会耗尽线程。
单向消息;
如果是成功案例,请使用这两个属性;
<property action="set" name="OUT_ONLY" value="true"/>
<property action="set" name="FORCE_SC_ACCEPTED" scope="axis2" value="true"/>
对于故障序列中的故障案例句柄。我想知道,故障情况会发生什么。