我对爪哇和泽西都很陌生。现在,我想使用这个jersey来实现在发送响应后具有额外处理的REST服务(具体来说,在同一个servlet上下文中睡眠固定的秒,然后触发一个不同的REST请求,所以它与REST代理不同)。我在googled上搜索了一段时间,但所有的人似乎都想当然地认为,在方法的末尾隐式地刷新响应是理所当然的。下面是启用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);
}
}发布于 2011-11-06 16:13:57
如果你能做你想做的事情,你会耗尽你的服务器上的资源,因为每一个请求都需要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调用所需的任何信息放入该队列,并让前面提到的线程完成它并进行查询。
https://stackoverflow.com/questions/8028122
复制相似问题