현재 서버 측 이벤트가 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 응용 프로그램을 구성 할 수 있다면 내가 망설 이는 설정은 무엇입니까?