3

Tomcat 7 で JAX-RS Jersey 2.3.1 を使用して ChunkedOutput を動作させることができませんでした。Jersey Tutorial - Chapter 10. Asynchronous Services and Clientsのチュートリアルに従おうとしています。

私のコードは次のようになります

@GET
@Path("/asynchronous")
public ChunkedOutput<String> getAsyncResponse() {

    final ChunkedOutput<String> output = new ChunkedOutput<String>(String.class);

    new Thread() {
        public void run() {
            try {
                String text;
                for (int i = 0; i < 20; i++) {
                    text = String.valueOf(i);
                    output.write(text);
                    Thread.sleep(1000);
                }
            } catch (Throwable th) {
                th.printStackTrace();
            } finally {
                try {
                    output.close();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }
    }.start();

    return output;
}

curl または Java クライアントを介して呼び出そうとすると、Web サービス側で次の例外が発生しました。

org.glassfish.jersey.server.internal.process.MappableException: java.lang.NullPointerException
    at org.glassfish.jersey.server.internal.MappableExceptionWrapperInterceptor.aroundWriteTo(MappableExceptionWrapperInterceptor.java:96)
    at org.glassfish.jersey.message.internal.WriterInterceptorExecutor.proceed(WriterInterceptorExecutor.java:149)
    at org.glassfish.jersey.message.internal.MessageBodyFactory.writeTo(MessageBodyFactory.java:1139)
    at org.glassfish.jersey.server.ChunkedOutput$1.call(ChunkedOutput.java:148)
    at org.glassfish.jersey.server.ChunkedOutput$1.call(ChunkedOutput.java:121)
    at org.glassfish.jersey.internal.Errors.process(Errors.java:315)
    at org.glassfish.jersey.internal.Errors.process(Errors.java:242)
    at org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:345)
    at org.glassfish.jersey.server.ChunkedOutput.flushQueue(ChunkedOutput.java:121)
    at org.glassfish.jersey.server.ChunkedOutput.write(ChunkedOutput.java:111)
    at jaxrs.prototype.tomcat7.AsyncPrototype$1.run(AsyncPrototype.java:82)
Caused by: java.lang.NullPointerException
    at org.apache.coyote.http11.InternalOutputBuffer.realWriteBytes(InternalOutputBuffer.java:215)
    at org.apache.tomcat.util.buf.ByteChunk.flushBuffer(ByteChunk.java:480)
...

何がうまくいかなかったのですか?もともと Tomcat 6 にデプロイしていたのですが、非同期機能が Servlet 3.0 API で利用可能であり、Tomcat 6 はそれをサポートしていないことに気付き、Tomcat 7 に切り替えました。

4

1 に答える 1

1

web.xml に async-supported を追加すると、うまくいきます。その後、例外は表示されなくなりました。

書き込みが発生するたびにチャンクされた出力を受信しないクライアント側でまだ問題がありますが。代わりに、チャンクされたすべての出力を最後に一度に受け取ります。

  <servlet>
    <servlet-name>Jersey REST Service</servlet-name>
    <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
    <init-param>
      <param-name>jersey.config.server.provider.packages</param-name>
      <param-value>jaxrs.prototype;org.codehaus.jackson.jaxrs</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
    <async-supported>true</async-supported>
  </servlet>
于 2013-10-09T05:17:40.100 に答える