Java Filter/ContainerRequestContext异步处理(Jeresy/JAX-RS)
我目前遇到一个问题,在异步请求完成之前,我的HTTP请求被发送到“处理阶段”,该异步请求认为身份验证是否有效 以下是导致问题的过滤器示例:Java Filter/ContainerRequestContext异步处理(Jeresy/JAX-RS),java,jakarta-ee,asynchronous,jax-rs,jersey-2.0,Java,Jakarta Ee,Asynchronous,Jax Rs,Jersey 2.0,我目前遇到一个问题,在异步请求完成之前,我的HTTP请求被发送到“处理阶段”,该异步请求认为身份验证是否有效 以下是导致问题的过滤器示例: @Provider public class AuthenticationFilter implements ContainerRequestFilter { private static final Response ACCESS_DENIED = Response.status(Response.Status.UNAUTHORIZED).bui
@Provider
public class AuthenticationFilter implements ContainerRequestFilter {
private static final Response ACCESS_DENIED = Response.status(Response.Status.UNAUTHORIZED).build();
private static final Response INTERNAL_SERVER_ERROR = Response.status(Response.Status.INTERNAL_SERVER_ERROR).build();
@Context
private ResourceInfo resourceInfo;
@Override
public void filter(final ContainerRequestContext context) throws IOException {
System.out.println("Filter called");
Method method = resourceInfo.getResourceMethod();
if(method.isAnnotationPresent(NoAuthorizationRequired.class)) {
return;
}
if(method.isAnnotationPresent(AuthorizationRequired.class)) {
AuthorizationRequest request = (new AuthorizationRequest(false) {
@Override
public void onCompleted(ParallelResult superResult) {
AuthorizationResult result = (AuthorizationResult)superResult;
if(result.successful()) {
System.out.println("Authentication completed -- Process resource");
} else {
context.abortWith(ACCESS_DENIED);
}
}
});
request.setTask(new AuthorizationTask(request));
Worker.work(request);
} else {
System.err.println("[SEVERE] IMPLEMENTATION FAULT. Authorization annotation not found for method: " + method.getName());
context.abortWith(INTERNAL_SERVER_ERROR);
}
}
}
如何使请求在异步请求完成之前不会进入“处理阶段”。(数据库) 也许?@peeskillet-任何会导致线程阻塞的事情都违背了异步处理的全部目的。如果要使用CountDownLatch,我还可以在主线程上处理查询。注意:没有逻辑来解决这个问题,如果该方法在没有调用“abort”的情况下完成执行,则进入“处理阶段”。如果您需要等待异步处理完成,就过滤器->资源处理而言,这与同步处理不是很一样吗?如果我理解正确的话,那不是你的意思吗。或者我不明白你的问题correctly@peeskillet-区别在于,我正在寻找一种将上下文传递给处理线程的方法,而不是等待网络线程等待处理线程完成工作。整个API都是异步友好的,直到涉及到过滤器,而过滤器似乎没有任何异步实现。一个长时间的数据库调用可能会导致许多REST请求超时。啊,我明白你的意思。也许?@peeskillet-任何会导致线程阻塞的事情都违背了异步处理的全部目的。如果要使用CountDownLatch,我还可以在主线程上处理查询。注意:没有逻辑来解决这个问题,如果该方法在没有调用“abort”的情况下完成执行,则进入“处理阶段”。如果您需要等待异步处理完成,就过滤器->资源处理而言,这与同步处理不是很一样吗?如果我理解正确的话,那不是你的意思吗。或者我不明白你的问题correctly@peeskillet-区别在于,我正在寻找一种将上下文传递给处理线程的方法,而不是等待网络线程等待处理线程完成工作。整个API都是异步友好的,直到涉及到过滤器,而过滤器似乎没有任何异步实现。一个长时间的数据库调用可能会导致许多REST请求超时。啊,我明白你的意思。