如何在泽西岛的过滤器发送响应后继续进行请求处理?
问题描述:
我有一种情况,我需要为接收到的每个请求返回“接受”响应,并稍后将实际响应发布到服务之外的单独端点。如何在泽西岛的过滤器发送响应后继续进行请求处理?
为了实现“接受”的响应,我实现了一个过滤器。
public class AcknowledgementFilter implements ContainerRequestFilter{
@Override
public void filter(ContainerRequestContext containerRequestContext) throws IOException {
containerRequestContext.abortWith(Response.accepted().build());
// call Resource method in new Thread() . <------ ?
}
}
服务端点的执行情况:
@Path("/vendor")
public class VendorHandler {
@POST
public void addVendor(VendorRequest addVendorRequest)){
vendor = new Vendor();
Client.publish(vendor); // publish request to an endpoint
return null;
}
如何调用VendorHandler的addVendor(或任何方法取决于请求)从确认过滤器?
是否有任何其他方式来为每个请求实现接受的响应,然后分别处理请求?
答
您可以使用AsyncResponse,
@GET
@ManagedAsync
@Produces(MediaType.APPLICATION_JSON)
public void getLives(@Suspended final AsyncResponse asyncResponse,
@DefaultValue("0") @QueryParam("newestid") final int newestId,
@QueryParam("oldestid") final Integer oldestId) {
asyncResponse.setTimeoutHandler(asyncResponse1 -> {
logger.info("reached timeout");
asyncResponse1.resume(Response.ok().build());
});
asyncResponse.setTimeout(5, TimeUnit.MINUTES);
try {
List<Life> lives = oldestId == null ?
Lifes.getLastLives(newestId) : Lifes.getOlderLives(oldestId);
if (lives.size() > 0) {
final GenericEntity<List<Life>> entity = new GenericEntity<List<Life>>(lives) {
};
asyncResponse.resume(entity);
} else LifeProvider.suspend(asyncResponse);
} catch (SQLException e) {
logger.error(e, e);
asyncResponse.resume(new WebApplicationException(Response.Status.INTERNAL_SERVER_ERROR));
}
}
检查这个Link了解更多详情。
我不认为资源方法会被调用,因为响应已经发送到过滤器中的客户端。 –
我认为'AsyncResponse'的意思是删除过滤器的需要,恕我直言,从来没有打算处理这种情况下:) –