以下是我尝试使用 Jersey 1.8 和 Java 6 编写的基本方法。
@GET
@Path("/{teamId}")
@Produces(MediaType.TEXT_PLAIN)
public String getTeamInfo(@PathParam("teamId") final int teamId, @Context HttpServletRequest httpServletRequest) {
if(!updatingCache) {
//do some work
return info;
}
else if(updatingCache) {
//add http request to a queue to be processed once the cache is updated
return info;
}
}
有时候该方法可以作为基本的REST服务,但是如果正在更新缓存,那么一旦缓存更新,传入的请求就会进入队列进行处理。
我考虑过尝试将整个HttpServletRequest
添加到队列中,但在返回信息之前会阻塞,并且在缓存更新时应将所有传入的请求添加到队列中。
当服务启动时,它启动一个后台线程,该线程使用JeroMQ(ZeroMQ的纯java实现)来侦听消息以更新缓存。
处理这种情况的最佳方法是什么?
PS,我是一名有4周经验的实习生:)
更新
我认为@Suspended注释和泽西岛的AsyncResponse
课程将完成我所寻找的目标。不幸的是,这个类是在Jersey 2.0中引入的,我必须使用1.8。任何人都可以提出类似的建议吗?
答案 0 :(得分:0)
我试图做错事。事实证明,我不需要为HTTP请求实现自己的队列,因为这在内部发生。我只需要一个线程安全机制来计算正在处理的请求数,这样我只更新缓存,而当前没有处理请求。由于缓存机制阻止服务器处理更多请求,因此它们会自动排队,当锁定被释放时,它们都会按顺序处理。