【发布时间】:2011-04-11 19:22:54
【问题描述】:
我正在尝试设置一个可用于异步调用 Web 服务的 servlet。在大多数情况下,它工作正常。我有一个带有 doGet 方法的 servlet 和一个调用它的 js。我在 js 中有一个回调方法,当 servlet 完成它的事情时它会正确调用它。
复杂之处在于我调用的其中一个 Web 服务也是异步的,我希望能够在异步 ws 回调完成后再次调用 js 回调方法。例如,如果您有一个状态字段,当您调用同步 Web 服务时,它会立即更新为“开始同步调用”,然后当 servlet 回调到达时,它会更改为回调值,这是 Web 服务的结果。
当你调用异步 web 服务时,update 字段立即更新为“Beginning Asynchronous Call”,并很快收到来自 servlet 的第一个回调,表明该 web 服务已被请求,因此我们将该字段更新为“Processing Web服务”之类的。问题是一旦 web 服务完成并回调 servlet,我似乎无法弄清楚如何将结果发送到 js 回调方法。
我对 AJAX 和 servlet 还很陌生,所以也许这是实现我想要的一种可怕的方式。
Web 服务都在 Servlet 中调用,主要使用 Netbeans 自动生成的 WS 调用。 WS 调用自己工作正常,但是一旦我得到异步 WS 的结果,我就被困在 web 服务回调的 handleResponse 方法中,不再有任何对我想要更新的文档的响应元素的引用。
我尝试将原始响应变量存储为静态成员变量,并在 handleResponse 方法中使用它,如下所示:
javax.xml.ws.AsyncHandler<WsClients.Op11Response> asyncHandler = new javax.xml.ws.AsyncHandler<WsClients.Op11Response>() {
public void handleResponse(javax.xml.ws.Response<WsClients.Op11Response> asyncResponse) {
try {
storedResponse.setContentType("text/xml");
String returnString = asyncResponse.get().getReturn();
storedResponse.getWriter().write("<returnData><content>"
+ returnString + "</content></returnData>");
} catch (Exception ex) {
}
}
};
这将无法在附加调试器的情况下编译,并且似乎无论如何都无法分配引用。
有没有更好的方法来做到这一点?
【问题讨论】:
-
所以你正在使用 web 服务进行一些异步处理,第一次调用开始处理,第二次调用获取结果?因为 web 服务调用不是真正的异步(像所有 http 调用一样)?
标签: java javascript ajax web-services servlets