2

据我所知,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 完成我想要的,或者它在这种方式上有缺陷吗?

4

1 回答 1

0
However, if there is an error processing the request, the client doesn't know. The ESB basically "eats" the error

如果您在这种情况下为代理定义故障序列,您的客户端会发生什么情况?

如果我们为一个 outonly 操作注册一个回调,将会发生的是 ESB 将永远等待响应并且将耗尽线程。

在单向消息中;

如果是成功案例,请使用这两个属性;

<property action="set" name="OUT_ONLY" value="true"/>
<property action="set" name="FORCE_SC_ACCEPTED" scope="axis2" value="true"/>

对于故障情况,请按故障顺序处理。我想知道,在故障情况下会发生什么。

于 2013-05-14T12:42:39.613 回答