0

这是我尝试使用Jersey 1.8Java 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 注释以及 Jersey 的AsyncResponse课程将完成我正在寻找的东西。不幸的是,该类是在 Jersey 2.0 中引入的,我必须使用 1.8。任何人都可以提出类似的建议吗?

4

1 回答 1

0

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

于 2014-07-03T17:09:38.567 回答