我是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);
}
}
答案 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调用所需的任何信息,并让上述线程将其拉出并进行查询。