我正在尝试找到一种异步的方式来立即返回客户端请求的响应。
我所需要的只是记录请求数据,调用新线程请求其他服务器上昂贵的操作(一些后端操作),并且无需等待它们的响应,立即返回200状态响应给客户端。
此时此刻,我正试图用完整的未来来做这件事,但我错过了一些东西。
package com.example.controller;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.core.Logger;
import javax.servlet.http.HttpServletRequest;
import javax.ws.rs.Consumes;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import java.util.concurrent.CompletableFuture;
@Path("/class")
public class AsynchronousResponse {
private static final Logger LOGGER = (Logger) LogManager.getLogger(AsynchronousResponse.class.getName());
private static final int HTTP_STATUS_OK = 200;
private static final String EMPTY_CONTENT = "";
@Context
private HttpServletRequest httpRequest;
@Path("/method")
@GET
@Consumes(MediaType.APPLICATION_JSON)
public Response asyncResponseSupply() {
LOGGER.info(httpRequest.getSession().getId() + " : New session received");
CompletableFuture.supplyAsync(this::veryExpensiveOperations);
LOGGER.info(httpRequest.getSession().getId() + " : Returning empty response... ");
return Response.status(HTTP_STATUS_OK).entity(EMPTY_CONTENT).build();
}
// need to do some operations on data from httpRequest
private String veryExpensiveOperations() {
LOGGER.info(httpRequest.toString());
LOGGER.info("Start very expensive operations");
try {
Thread.sleep(3000);
LOGGER.info("Finished");
return "DONE";
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
e.printStackTrace();
LOGGER.error("Error: " + e.getMessage());
return "ERROR";
}
}
}
总之,我得到了立即响应,但veryExpensiveOperations()方法似乎丢失了httpRequest值,这对我来说太糟糕了,因为我需要从客户端请求调用具有值的其他webservices。多谢帮忙!
对于我的应用程序,我使用的是Jetty Ver。9.2.18.V20160721
一旦完成对servlet的调度,就提交响应,并回收request和response对象。
对于servlet规范的处理,您必须使用AsyncContext
(通过HttpServletRequest.startAsync()
调用获得)来让容器知道请求/响应尚未完成,并且对它的处理正在非分派线程中进行(就像您的CompletableFuture.SupplyAsync()
调用)
至于如何将JAX-RS和AsyncContext
混合使用,我完全不知道。我甚至不知道JAX-RS是否已经更新为支持asyncContext
。
我试图理解异步响应在Jersey上的工作方式。我阅读了新泽西文档(https://jersey.java.net/documentation/latest/async.html)的第10章,但它对我的问题没有帮助。这里关于stackoverflow的研究也没有得出令人满意的答案(这一点我可以理解)。 我试图做的与本文中的一个问题类似(使用http状态202进行异步操作)。我想使用HTML表单文档将
问题内容: 我有一个DialogFlow V2 node.js Webhook。 我有一个通过webhook动作调用的意图: 现在,如果我有一个成功完成的异步请求,并且 在成功块中 执行了 app.add, 如下所示: …则对话流不等待语音返回。我在Response对象中收到错误: 如何让DialogFlow V2等待Webhook的Async操作完成,而不是立即等待语音响应? 注意:此问题仅在V
我想发送10个独立的请求,一个接着一个按顺序发送。并希望在数组中获得所有结果。我尝试过,但它并行地命中了所有请求。 对于并行请求 我可以订阅这个方法,并且可以在一个数组中得到所有的结果。但如何才能按顺序发送所有请求呢?
我在网上找到了这个脚本: 但我不明白如何与PHP一起使用它,也不明白params变量内部的内容是什么,也不明白如何使用它。我能帮个忙吗?
客户端通过HTTP请求(通过浏览器post)调用Servlet,然后Servlet应向外部网站发送请求(get),并从网站接收响应(post)。servlet继续响应并向客户端发送响应(post)。 我的问题是如何在Servlet中发送和接收请求/响应并将某些内容发送回客户端?
问题内容: PHP中有没有办法进行异步HTTP调用?我不在乎响应,我只想做类似的事情,但不等待请求完成再执行其余代码。这对于在我的应用程序中触发某种“事件”或触发较长的进程非常有用。 有任何想法吗? 问题答案: 我以前接受的答案没有用。它仍然在等待回应。但这确实有效,取自我如何在PHP中发出异步GET请求?