2016-02-19 2 views
0

Привет, мне нужно реализовать асинхронный запрос на обработку в сервере apache cxf. Поэтому мне казалось, что нужно добавить AsyncResponse для запроса. Но это не сработало.Сервер Apache cxf асинхронно запрашивает обработку

@GET 
@Path("/test") 
@Produces(MediaType.APPLICATION_XML) 
@Consumes(MediaType.APPLICATION_XML) 
void sample(@Suspended AsyncResponse asyncResponse); 

@Override 
    public void sample(AsyncResponse asyncResponse) { 
     asyncResponse.setTimeout(3, TimeUnit.MINUTES); 
     asyncResponse.setTimeoutHandler(new TimeoutHandler() { 
      @Override 
      public void handleTimeout(AsyncResponse asyncResponse) { 
       asyncResponse.resume("Sample"); 
      } 
     }); 

    } 

Когда я отправляю запрос в конечную точку, он будет вызывать исключение.

WebApplicationExceptionMapper - WebApplicationException has been caught, status: 415 
javax.ws.rs.WebApplicationException 
    at org.apache.cxf.jaxrs.utils.JAXRSUtils.readFromMessageBody(JAXRSUtils.java:1054) 
    at org.apache.cxf.jaxrs.utils.JAXRSUtils.processParameter(JAXRSUtils.java:614) 
    at org.apache.cxf.jaxrs.utils.JAXRSUtils.processParameters(JAXRSUtils.java:578) 
    at org.apache.cxf.jaxrs.interceptor.JAXRSInInterceptor.processRequest(JAXRSInInterceptor.java:238) 
    at org.apache.cxf.jaxrs.interceptor.JAXRSInInterceptor.handleMessage(JAXRSInInterceptor.java:89) 
    at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:262) 
    at org.apache.cxf.transport.ChainInitiationObserver.onMessage(ChainInitiationObserver.java:122) 
    at org.apache.cxf.transport.http_jetty.JettyHTTPDestination.serviceRequest(JettyHTTPDestination.java:344) 
    at org.apache.cxf.transport.http_jetty.JettyHTTPDestination.doService(JettyHTTPDestination.java:310) 
    at org.apache.cxf.transport.http_jetty.JettyHTTPHandler.handle(JettyHTTPHandler.java:72) 
    at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:943) 
    at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:879) 
    at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:117) 
    at org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:250) 
    at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:110) 
    at org.eclipse.jetty.server.Server.handle(Server.java:345) 
    at org.eclipse.jetty.server.HttpConnection.handleRequest(HttpConnection.java:441) 
    at org.eclipse.jetty.server.HttpConnection$RequestHandler.headerComplete(HttpConnection.java:919) 
    at org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:582) 
    at org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:218) 
    at org.eclipse.jetty.server.AsyncHttpConnection.handle(AsyncHttpConnection.java:51) 
    at org.eclipse.jetty.io.nio.SelectChannelEndPoint.handle(SelectChannelEndPoint.java:586) 
    at org.eclipse.jetty.io.nio.SelectChannelEndPoint$1.run(SelectChannelEndPoint.java:44) 
    at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:598) 
    at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:533) 

Я хочу знать, как я реализованный асинхронно является правильным, и если это так, что это проблема с моей реализации.

ответ

1

Не уверен, что вы все еще ищете ответ. Ваша реализация выглядит хорошо, если посмотреть на трассировку стека, кажется, сервер не смог правильно понять запрос. Пожалуйста, проверьте в web.xml, если есть какой-либо фильтр, который вы используете. Фильтр должен иметь это свойство (true) для поддержки асинхронного вызова.

Ваш фильтр должен должен выглядеть как этот ..

<filter> 
    <filter-name>XXXXXX</filter-name> 
    <filter-class>xxx.xxx.xxx.XXXXXX</filter-class> 
    <async-supported>true</async-supported> 
</filter>