gpt4 book ai didi

java - 第二次调用 HttpServletResponse

转载 作者:行者123 更新时间:2023-11-28 21:23:30 26 4
gpt4 key购买 nike

我正在尝试设置一个可用于异步调用 Web 服务的 servlet。在大多数情况下,它运行良好。我有一个带有 doGet 方法的 servlet 和一个调用它的 js。我在 js 中有一个回调方法,当 servlet 完成其操作时,它会正确调用该方法。

复杂的是,我调用的 Web 服务之一也是异步的,我希望能够在异步 ws 回调完成后再次调用 js 回调方法。例如,如果您有一个状态字段,当您调用同步 Web 服务时,它会立即更新为“开始同步调用”,然后当 Servlet 回调到达时,它会更改为回调值,这是 Web 服务的结果。

当您调用异步 Web 服务时,更新字段立即更新为“开始异步调用”,并很快收到来自 servlet 的第一个回调,表明已请求 Web 服务,因此我们将该字段更新为“处理 Web服务”什么的。问题是,一旦Web服务完成并回调到servlet,我似乎不知道如何将结果发送到js回调方法。

我对 AJAX 和 servlet 还很陌生,所以也许这是实现我想要的目标的一种糟糕方法。

Web 服务都在 Servlet 中调用,主要使用 Netbeans 自动生成的 WS 调用。 WS 调用本身工作正常,但是一旦我获得异步 WS 的结果,我就会陷入 webservice 回调的 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) {
}
}
};

这不会在附加调试器的情况下进行编译,并且似乎无法分配引用。

有更好的方法吗?

最佳答案

HTTP 的本质是,除非客户端通过轮询或保持连接打开来请求此信息,否则您无法将任何内容发送回客户端。

启动异步调用的操作立即结束,您需要从 servlet doGet 方法返回(虽然从技术上讲,您可以留在 servlet 调用中直到异步调用完成,但我不建议这样做,因为它会占用服务器资源) . 通常,最好尽快从 servlet 返回)。

最好的行动方案是:

  1. 具有内部数据结构(例如具有适当同步的 HashMap)来保存正在执行的异步调用。
  2. 当您开始新的调用时,为其分配伪随 secret 钥并从初始调用中返回它。
  3. 使用上述 key ,让浏览器端 JavaScript AJAX 调用定期轮询调用状态并显示结果。
  4. 不要忘记清理已完成或过时的调用(例如通过运行计时器线程)。

当您熟悉上述步骤 3 中的轮询实现时,您可能需要考虑 Comet, a.k.a. long poll取代客户端轮询。

关于java - 第二次调用 HttpServletResponse,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5626381/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com