2017-10-26 13 views
0

현재 서버 측 이벤트가 EventSource을 사용하는 클라이언트로 전송되도록 REST 응용 프로그램을 구성하려고합니다. 현재 IllegalStateException에 비동기 요청을 허용하도록 구성된 서버의 결과 인 것으로 보이는 REST 요청에 대한 비동기 연결을 열려고 할 때 실행 중입니다.비동기 요청을 허용하도록 OSGI Enroute REST 응용 프로그램 구성

다음 인쇄 일부 코드

@RequireBootstrapWebResource(resource="css/bootstrap.css") 
@RequireWebServerExtender 
@RequireHttpImplementation 
@RequireConfigurerExtender 
@Component(name="my.web", property={"debug=true"}) 
public final class MyApplication implements REST 
{ 
    public void getBatching(RESTRequest request) 
    { 
     User user = authenticate(request); 

     HttpServletResponse response = request._response(); 
     response.setStatus(HttpServletResponse.SC_OK); 
     response.setContentType("text/event-stream"); 
     response.setCharacterEncoding(StandardCharsets.UTF_8.name()); 
     try 
     { 
     AsyncContext async = (AsyncContext)request._request().startAsync(); 
     async.addListener(new InternalAsyncListener()); 
     sseConnectionMap.put(UUID.randomUUID(), async); 

     response.flushBuffer(); 
     } 
     catch (Exception e) 
     { 
     System.out.println("Message=" + e.getMessage()); 
     e.printStackTrace(); 
     } 
    } 

    @SuppressWarnings("unused") 
    @Activate 
    void activate(ComponentContext cc, BundleContext bc, Map<String, Object> config) 
    { 
     System.out.println(this.getClass() + " started"); 

     if ("true".equals(config.get("debug"))) 
     { 
     debug = true; 
     } 

     System.out.println("Link Start"); 
    } 
} 

현재 :

Message=null 
java.lang.IllegalStateException 
at org.apache.felix.http.base.internal.dispatch.ServletRequestWrapper.startAsync(ServletRequestWrapper.java:314) 
at my.application.MyApplication.getBatching(WebApplication.java:399) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
at java.lang.reflect.Method.invoke(Unknown Source) 
at osgi.enroute.rest.simple.provider.Function.invoke(Function.java:203) 
at osgi.enroute.rest.simple.provider.RestMapper.execute(RestMapper.java:333) 
at osgi.enroute.rest.simple.provider.RestServlet.service(RestServlet.java:66) 
at javax.servlet.http.HttpServlet.service(HttpServlet.java:725) 
at org.apache.felix.http.base.internal.handler.ServletHandler.handle(ServletHandler.java:85) 
at org.apache.felix.http.base.internal.dispatch.InvocationChain.doFilter(InvocationChain.java:79) 
at my.application.CORSFilter.doFilter(CORSFilter.java:75) 
at org.apache.felix.http.base.internal.handler.FilterHandler.handle(FilterHandler.java:135) 
at org.apache.felix.http.base.internal.dispatch.InvocationChain.doFilter(InvocationChain.java:74) 
at org.apache.felix.http.base.internal.dispatch.Dispatcher.dispatch(Dispatcher.java:124) 
at org.apache.felix.http.base.internal.DispatcherServlet.service(DispatcherServlet.java:61) 
at javax.servlet.http.HttpServlet.service(HttpServlet.java:725) 
at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:845) 
at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:583) 
at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:224) 
at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1160) 
at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:511) 
at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:185) 
at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1092) 
at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141) 
at org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:213) 
at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:134) 
at org.eclipse.jetty.server.Server.handle(Server.java:518) 
at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:308) 
at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:244) 
at org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:273) 
at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:95) 
at org.eclipse.jetty.io.SelectChannelEndPoint$2.run(SelectChannelEndPoint.java:93) 
at org.eclipse.jetty.util.thread.strategy.ExecuteProduceConsume.produceAndRun(ExecuteProduceConsume.java:246) 
at org.eclipse.jetty.util.thread.strategy.ExecuteProduceConsume.run(ExecuteProduceConsume.java:156) 
at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:654) 
at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:572) 
at java.lang.Thread.run(Unknown Source) 
authenticate() 현재 응용 프로그램을 개발하는 동안 CORS를 허용 할 때 디버그 모드에서 헤더를 수정하고를 얻기 위해 시도

User 토큰이 Authorization 헤더로 전달 된 경우 ... 그러나 내가 위에 startAsync() 행을 넣어도 여전히 같은 IllegalStateException 그래서 나는 그것이 헤더 수정의 문제라고 생각하지 않는다.

일부 특정 문제에 대한 ISE가 발생했습니다. ServletRequestWrapper.java:314은 기본 Felix/Jetty 서버가 비동기 요청을 허용하도록 설정되어 있지 않음을 나타냅니다.

또한 헤더를 text/event-stream으로 설정하고 응답에 계속 쓰려고했지만 물론 REST 메서드를 종료 할 때 닫혔습니다.

추가 조사는 비동기 요청을 처리하고 별도의 URL 패턴에 바인딩하도록 구성된 두 번째 서블릿 실행과 같은 다른 솔루션을 제공합니다. 물론, 그것은 자체적 인 노력이며 여러 서블릿이 얼마나 잘 작동하는지 잘 모르겠습니다. 가급적 나는 하나의 Enroute 응용 프로그램에서 비동기 응답을 열 수 있기를 원합니다.

비동기 응답을 허용하도록 enroute 응용 프로그램을 구성 할 수 있다면 내가 망설 이는 설정은 무엇입니까?

답변

1

한숨 ... @WebServlet을 시작하는 데 어려움을 겪고있는 동안 대답을 찾았으며 화이트 보드로 계속 되돌아 왔습니다. HttpWhiteboardConstants.HTTP_WHITEBOARD_SERVLET_ASYNC_SUPPORTED : '자바 비동기 화이트 보드'에 대한 검색이 HttpWhiteboardConstants 설정 제기

@Component(..., property={..., 
    HttpWhiteboardConstants.HTTP_WHITEBOARD_SERVLET_ASYNC_SUPPORTED+"=true", ...}...) 

이, 그러나, @ComponentREST을 구현하는 작동하지 않았다을 대신 난 단지는 별도의 구성 요소로 작동시킬 수 있었다

@RequireHttpImplementation 
@Component(name="sse", property={ 
    HttpWhiteboardConstants.HTTP_WHITEBOARD_SERVLET_PATTERN+"=/sse/*", 
    HttpWhiteboardConstants.HTTP_WHITEBOARD_FILTER_ASYNC_SUPPORTED+"=true", 
    HttpWhiteboardConstants.HTTP_WHITEBOARD_SERVLET_ASYNC_SUPPORTED+"=true"}, 
    service=Servlet.class) 
public final class ServerSideEventServlet extends HttpServlet 
{ 
    @Override 
    protected void doGet(HttpServletRequest request, HttpServletResponse response) 
     throws ServletException, IOException 
    { 
    } 
} 

을이 Servlet 내 문제의 하나에 평행하게 시작 :로는 다음과 같다. REST 서버로이 구성을 가져 오려고 했는데도 여전히 동일한 예외가 있습니다. request이 REST 메서드 외부에 닿아 있기 때문에 그럴 수 있습니다.