10

根据 javadoc:

表示给定的@WebMethod 只有一个输入消息,没有输出。通常,单向方法在执行实际业务方法之前将控制线程返回给调用应用程序。如果标记为 @Oneway 的操作具有返回值或 Holder 参数,或声明任何已检查的异常,则 181 处理器应报告错误。

那么我可以假设,如果我需要异常处理(选中或未选中),不建议使用此注释吗?我不会从业务逻辑中返回任何内容,但是我仍然有兴趣了解超时和其他各种特定于调用 SOAP 方法的行为的错误。此注释是否意味着我无权访问 HTTP 返回码或抛出异常?

问题:我最好自己将其线程化以获得真正的异步调用并删除@Oneway注释?

4

1 回答 1

17

@Oneway意味着没有任何东西可以逃脱您的方法,无论是响应还是异常。这有两个原因:

  • 从技术上讲,异常只是另一种类型的响应(SOAP 错误),因此不能从单向方法返回(不能返回任何东西)

  • 通常单向方法由 Web 服务框架异步执行(我知道 odes)。框架会立即返回,因此您的客户可能甚至在开始处理单向方法之前就收到了空响应。当抛出异常时,原来的 HTTP 连接早已不复存在。

因此,如果您想传播异常或超时,请使用标准 SOAP 方法,其中包含空响应*和显式声明的少量错误。如果您想在一段时间后使呼叫超时,则需要单独的线程池并阻塞等待响应或给定时间段。

*请不要混淆空的 SOAP 响应(一个没有内容的 XML 文档,只是根标签,包裹在一个 SOAP 信封中)和空的 HTTP 响应(什么都没有发回)。请记住,SOAP 不限于 HTTP。例如,如果您使用 JMS 或电子邮件传输,普通双向功能的空响应(或故障)是另一个从服务器发送到客户端的消息。单向方法只是一条最可靠的消息,并且没有发回任何内容。

于 2012-10-24T21:15:14.160 回答