У меня есть REST API Джерси, и я использую ContainerRequestFilter
для авторизации. Я также использую @ManagedAsync
на всех конечных точках, чтобы мой API мог обслуживать тысячи одновременных запросов.
Мой фильтр авторизации обращается к удаленной службе, но когда фильтр запущен, Джерси еще не добавил текущий поток к своему внутреннему 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. Асинхронно вызывается только сам метод ресурса, а не фильтры. Любые предложения по продолжению приветствуются.
@ManagedAsync
бесполезен, если у вас есть какие-либо фильтры... - person Alden   schedule 19.12.2013ContainerRequestFilter
все еще плохо работает с@ManagedAsync
? Я искал это все и не могу найти никакой информации, связанной с этим. Думаю, HK2 по-прежнему лучший подход, верно? 5 лет спустя... - person igracia   schedule 12.04.2018@ManagedAsync
. С тех пор прошло почти 4 года, и мы не оглядывались назад — теперь у нас есть много API-интерфейсов Джерси с высокой пропускной способностью, которые бесперебойно работают в производстве. - person Alden   schedule 03.08.2018