Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/rest/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Jersey异步服务在关闭输出流以提交响应时抛出错误_Java_Rest_Jersey_Jax Rs - Fatal编程技术网

Java Jersey异步服务在关闭输出流以提交响应时抛出错误

Java Jersey异步服务在关闭输出流以提交响应时抛出错误,java,rest,jersey,jax-rs,Java,Rest,Jersey,Jax Rs,我刚刚尝试解释了异步响应是由不同的线程恢复的,这些线程没有启动资源方法 [使用的环境:tomcat 7,jersey 2.3] 当在get请求之后发出post请求时,如示例所示。我有以下问题: 1) Iam在服务器运行时将响应写入为“错误”时获取NPE,同时关闭输出流以cimmit响应。(请提供一个使用@suspended的jaxrs2.0异步服务器响应概念的工作示例。)。 at org.apache.coyote.http11.InternalOutputBuffer.realWriteByt

我刚刚尝试解释了异步响应是由不同的线程恢复的,这些线程没有启动资源方法

[使用的环境:tomcat 7,jersey 2.3] 当在get请求之后发出post请求时,如示例所示。我有以下问题:


1) Iam在服务器运行时将响应写入为“错误”时获取NPE,同时关闭输出流以cimmit响应。(请提供一个使用@suspended的jaxrs2.0异步服务器响应概念的工作示例。)。
at org.apache.coyote.http11.InternalOutputBuffer.realWriteBytes(InternalOutputBuffer.java:215)
at org.apache.tomcat.util.buf.ByteChunk.flushBuffer(ByteChunk.java:462)
at org.apache.coyote.http11.InternalOutputBuffer.endRequest(InternalOutputBuffer.java:159)
at org.apache.coyote.http11.AbstractHttp11Processor.action(AbstractHttp11Processor.java:749)
at org.apache.coyote.Response.action(Response.java:173)
at org.apache.coyote.Response.finish(Response.java:279)
at org.apache.catalina.connector.OutputBuffer.close(OutputBuffer.java:293)
at org.apache.catalina.connector.CoyoteOutputStream.close(CoyoteOutputStream.java:108)
at org.glassfish.jersey.message.internal.CommittingOutputStream.close(CommittingOutputStream.java:275)
at org.glassfish.jersey.message.internal.OutboundMessageContext.close(OutboundMessageContext.java:835)
at org.glassfish.jersey.server.ContainerResponse.close(ContainerResponse.java:411)
at org.glassfish.jersey.server.ServerRuntime$Responder.writeResponse(ServerRuntime.java:625)
at org.glassfish.jersey.server.ServerRuntime$Responder.processResponse(ServerRuntime.java:357)
at org.glassfish.jersey.server.ServerRuntime$Responder.process(ServerRuntime.java:347)
at org.glassfish.jersey.server.ServerRuntime$AsyncResponder$3.run(ServerRuntime.java:759)
at org.glassfish.jersey.internal.Errors$1.call(Errors.java:271)
at org.glassfish.jersey.internal.Errors$1.call(Errors.java:267)
at org.glassfish.jersey.internal.Errors.process(Errors.java:315)
at org.glassfish.jersey.internal.Errors.process(Errors.java:297)
at org.glassfish.jersey.internal.Errors.process(Errors.java:267)
at org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:295)
at org.glassfish.jersey.server.ServerRuntime$AsyncResponder.resume(ServerRuntime.java:797)
at org.glassfish.jersey.server.ServerRuntime$AsyncResponder.resume(ServerRuntime.java:754)
import java.text.DateFormat;
import java.util.Date;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;

import javax.ws.rs.GET;
import javax.ws.rs.HEAD;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.container.AsyncResponse;
import javax.ws.rs.container.Suspended;

import org.glassfish.jersey.server.ManagedAsync;

@Path("/messages/next")
public class MessagingResource {
    private static final BlockingQueue<AsyncResponse> suspended =
        new ArrayBlockingQueue<AsyncResponse>(5, Boolean.TRUE);

@GET
@ManagedAsync
public void readMessage(@Suspended AsyncResponse ar) throws InterruptedException {
    echo(" readMessage: before put");
    synchronized (MessagingResource.class) {
        echo(" readMessage: before put, count :"+suspended.size());
        suspended.put(ar);
        echo(" readMessage: after put, count :"+suspended.size());
    }
    echo(" readMessage: after put");
}

@POST
@ManagedAsync
public String postMessage() throws InterruptedException {

    AsyncResponse ar = null; 
    echo(" postMessage: before take, resume");
    synchronized (MessagingResource.class) {
        echo(" postMessage: before put, count :"+suspended.size());
        ar = suspended.take();
        echo(" postMessage: after put, count :"+suspended.size());
    }
    String message = " TEST TEST";
    ar.resume(message ); // resumes the processing of one GET request
    echo(" postMessage: after take , resume");
    return "Message sent";
}

private void echo(String string) {
    String dtStr = DateFormat.getTimeInstance(DateFormat.LONG).format(new Date());
    System.out.println( dtStr + " : " +string );
}