Java 如何在进程中间提交或刷新REST响应

Java 如何在进程中间提交或刷新REST响应,java,jersey,Java,Jersey,我对爪哇岛和泽西岛都是新手。现在我想使用jersey来实现REST服务,在发送响应后进行额外的处理(具体来说,休眠固定的秒数,然后在相同的servlet上下文中触发不同的REST请求,因此它不同于REST代理)。我在谷歌上搜索了一段时间,但所有人似乎都想当然地认为,在方法末尾隐式刷新响应。下面是我正在努力处理的启用JAXB的当前代码 @Path("/chat") public class LoadSimulator { @Context private UriInfo uriInfo;

我对爪哇岛和泽西岛都是新手。现在我想使用jersey来实现REST服务,在发送响应后进行额外的处理(具体来说,休眠固定的秒数,然后在相同的servlet上下文中触发不同的REST请求,因此它不同于REST代理)。我在谷歌上搜索了一段时间,但所有人似乎都想当然地认为,在方法末尾隐式刷新响应。下面是我正在努力处理的启用JAXB的当前代码

@Path("/chat")
public class LoadSimulator {

    @Context private UriInfo uriInfo;

    @Path("/outbound/{senderAddress}/requests")
    @POST
    @Consumes({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
    @Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
    public Response createOutboundSMSMessage(OutboundSMSMessageRequest inSmsReq, @PathParam("senderAddress") String senderAddress) throws JAXBException {
        String requestId = UUID.randomUUID().toString();
        URI uri = uriInfo.getAbsolutePathBuilder().path(requestId).build();

        ObjectFactory factory = new ObjectFactory();
        ResourceReference resourceReference = new ResourceReference();
        resourceReference.setResourceURL(uri.toString());
        JAXBElement<ResourceReference> inSmsResponse = factory.createResourceReference(resourceReference);
                return Response.created(uri).entity(inSmsResponse).build();
             //// want to flush or commit the response explicitly like:
              //        out.flush();
            //        out.close();
            //// Then sleep for a few second and fire a new REST request
            //        sleep(5);
            //          ....   
            // ClientConfig config = new DefaultClientConfig();
            // String response = r.path("translate").queryParams(params).get(String.class);



    }
}
@Path(“/chat”)
公共类负荷模拟器{
@上下文私有UriInfo-UriInfo;
@路径(“/outbound/{senderAddress}/requests”)
@职位
@使用({MediaType.APPLICATION_JSON,MediaType.APPLICATION_XML})
@产生({MediaType.APPLICATION_JSON,MediaType.APPLICATION_XML})
公共响应createOutboundSMSMessage(OutboundsMSMessageRequestInSMSreq,@PathParam(“senderAddress”)字符串senderAddress)引发JAXBEException{
字符串requestId=UUID.randomUUID().toString();
URI=uriInfo.getAbsolutePathBuilder().path(requestId.build();
ObjectFactory=新的ObjectFactory();
ResourceReference ResourceReference=新的ResourceReference();
setResourceURL(uri.toString());
JAXBElement inSmsResponse=factory.createResourceReference(resourceReference);
返回Response.created(uri).entity(inSmsResponse.build();
////要明确刷新或提交响应,如:
//out.flush();
//out.close();
////然后再睡几秒钟,发出一个新的休息请求
//睡眠(5);
//          ....   
//ClientConfig=newdefaultclientconfig();
//String response=r.path(“translate”).queryParams(params).get(String.class);
}
}

如果你能做你想做的事情,你会耗尽你服务器上的资源,因为每个请求都需要X秒,而且你有有限数量的线程可供选择

没有评论你为什么要这样做;如果对
LoadSimulator
使用
@Singleton
注释,则可以在
@PostConstruct public void init()
中设置一个线程,侦听在servlet启动时调用的(并发)队列

@Singleton
@Path("/chat")
public class LoadSimulator {
    private Thread restCaller;
    private ConcurrentLinkedQueue<MyInfo> queue = new ConcurrentLinkedQueue<MyInfo>();

    ...
    @PostConstruct public void init()
    {
        restCaller = new Thread(new MyRunnable(queue));
        restCaller.start();
    }
    ...
@Singleton
@路径(“/chat”)
公共类负荷模拟器{
私有线程调用方;
私有ConcurrentLinkedQueue=新ConcurrentLinkedQueue();
...
@构造后公共void init()
{
restCaller=新线程(newmyrunnable(queue));
restCaller.start();
}
...

然后在您的REST调用中,您将在该队列上放置进行第二次REST调用所需的任何信息,并让前面提到的线程将其拔出并进行查询。

Brain,感谢您的示例代码。我将研究它以确保完全理解您的意思,因为我的java经验非常有限。