据我所知,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 在这种方式上存在缺陷,这是一个错误。
当然,如果有一种方法我可以配置它,让它做我想做的事,那么我很想听听。
但据我所知,我认为不注册回调是错误的做法,即使没有回应。我不想在这里实施火灾并忘记。执行仍应从客户端同步发生。我的客户期待 HTTP 200 响应,但没有成功的正文。
通过检查 WSDL,ESB 应该意识到服务没有响应消息但仍然注册回调。当成功收到 200 OK 时,它应该将其传播回客户端并取消注册回调。当发生故障时,它还应该将其转发回客户端。
那么,有没有办法用 ESB 完成我想要的,或者它在这种方式上有缺陷吗?