如何在进程中提交或刷新其余响应

时间:2011-11-06 15:38:15

标签: java jersey

我是java和jersey的新手。现在,我希望在发送响应后使用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);



    }
}

1 个答案:

答案 0 :(得分:0)

如果你可以做你想要做的事情,那么你就会耗尽服务器上的资源,因为每个请求都需要X秒,并且在盒子哭泣叔叔之前你有一定数量的线程可用。

没有评论为什么你想要这样做;如果您为@Singleton使用LoadSimulator注释,则可以设置一个侦听@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();
    }
    ...

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