我有一个Jersey REST API并使用a ContainerRequestFilter
来处理授权.我也在@ManagedAsync
所有端点上使用,以便我的API可以服务数千个并发请求.
我的授权过滤器命中远程服务,但是当运行过滤器时,Jersey还没有将当前线程添加到它的内部ExecutorService
,所以我完全失去了异步的好处.
我可以告诉泽西岛我希望这ContainerRequestFilter
是异步的吗?
@Priority(Priorities.AUTHORIZATION) public class AuthorizationFilter implements ContainerRequestFilter { @Inject private AuthorizationService authSvc; @Override public void filter(ContainerRequestContext requestContext) throws IOException { String authToken = requestContext.getHeaderString(HttpHeaders.AUTHORIZATION); // HITS A REMOTE SERVER AuthorizationResponse authResponse = authSvc.authorize(authToken); if (!authResponse.isAuthorized()) { requestContext.abortWith(Response.status(Response.Status.UNAUTHORIZED) .entity("unauthorized!") .build()); } } }
这是一个示例资源:
@Path("/stuff") @Produces(MediaType.APPLICATION_JSON) public class StuffResource { @GET @Path("/{id}") @ManagedAsync public void getById(@PathParam("id") long id, @Suspended final AsyncResponse ar) { Stuff s; // HIT THE DATABASE FOR STUFF ar.resume(s); } }
更新刚刚从泽西岛球员那里听到,从2.7开始这是不可能的.仅异步调用资源方法本身,而不是过滤器.任何进行的建议仍然欢迎.