Jersey Web服务有时可以同步处理请求,有时是异步处理请求吗?

时间:2014-07-01 17:57:37

标签: java multithreading rest caching jersey-1.0

以下是我尝试使用 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。任何人都可以提出类似的建议吗?

1 个答案:

答案 0 :(得分:0)

我试图做错事。事实证明,我不需要为HTTP请求实现自己的队列,因为这在内部发生。我只需要一个线程安全机制来计算正在处理的请求数,这样我只更新缓存,而当前没有处理请求。由于缓存机制阻止服务器处理更多请求,因此它们会自动排队,当锁定被释放时,它们都会按顺序处理。