我試圖找到一種異步方式立即返回客戶端請求響應。如何立即發送請求異步響應
我只需要記錄請求數據,調用新線程來請求其他服務器上的昂貴操作(一些後端操作) 並且無需等待來自它們的響應立即返回200狀態響應到客戶端。
在這一刻,我試圖用CompletableFuture做到這一點,但我錯過了一些東西。
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的值,它是太糟糕了,我becouse我需要調用其他Web服務從客戶端請求的值。感謝幫助!
對於我的應用程序,我使用Jetty版本。 9.2.18.v20160721