2017-10-26 7 views
0

現在、サーバー側のイベントをEventSourceを使用してクライアントに送信できるようにRESTアプリケーションを構成しようとしています。現時点では、非同期要求を許可するようにサーバーが構成されていないため、REST要求への非同期接続を開こうとすると、IllegalStateExceptionが実行されています。非同期要求を許可する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を可能にする場合 デバッグモードでヘッダを変更し、取得しようと

のトークンがAuthorizationヘッダーに渡されました...しかし、たとえ私がstartAsync()行を上書きしても、私はまだ同じIllegalStateExceptionだから私はそれがヘッダー変更の問題だとは思わない。

特定の行のISEがServletRequestWrapper.java:314であるということは、基盤となるFelix/Jettyサーバが非同期要求を許可するように設定されていないことを示しています。

また、ヘッダーをtext/event-streamに設定してレスポンスへの書き込みを続けましたが、もちろんRESTメソッドを終了すると閉じられました。

さらなる調査では、非同期要求を処理して別のURLパターンにバインドするように設定された第2のサーブレットを実行するなど、他の解決策が提供されています。もちろん、それは自分自身の努力であり、複数のサーブレットがどれだけうまく連動するかはわかりません。私は、1つのEnrouteアプリケーションから非同期応答を開くことができるようにしたいと考えています。

非同期応答を許可するようにエンロールアプリケーションを設定することができれば、私は迷惑をかけている設定は何ですか?

答えて

1

一口... @WebServletを起動するのが難しいうちに答えを見つけ、ホワイトボードに戻ってきました。 HttpWhiteboardConstants.HTTP_WHITEBOARD_SERVLET_ASYNC_SUPPORTED::「Javaの非同期ホワイトボード」の検索がHttpWhiteboardConstants設定育て

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

これを、しかし、代わりに私はそれが別のコンポーネントで動作するように取得することができた、RESTを実装@Componentに動作しませんでした次のように:

@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は私の質問の1と平行に開始されました。この設定をRESTサーバに引き渡そうとしたとき、私は同じ例外がありました。これは、requestがRESTメソッドの外側にタッチされていることが原因である可能性があります。

関連する問題