在作业完成时向客户端发送通知



我正在使用SpringMVC编写一个内部web应用程序,其中用户将提交一组作业,以便通过RESTful web服务完成。每个作业只需要几秒钟就可以完成,但用户可以提交几十个作业。我希望该选项在每个作业完成时通知用户。这将被部署到Tomcat6安装中,这在一定程度上限制了我的选择,因为我将无法访问Servlet 3。

我以前从来没有写过这样的东西,我也不完全确定该怎么做。我想我想做一些长时间的民意调查,但虽然这在概念上很容易,但我不确定如何用Spring实现它。

我最初的计划是简单地保持连接打开(如果用户设置了接收通知的选项),在一个单独的线程中启动作业,当作业完成时,通过BlockingQueue向请求线程发送消息,并将消息转发给用户。然而,我认为让这种联系保持那么长时间可能不是一个好主意。我也看不出jQuery有什么方法可以在AJAX响应完成之前开始处理它。

另一种选择是长轮询。我看到Spring 3.2引入了一个新功能来实现这里描述的这一点,但1)我不确定这是否依赖于Servlet 3中的异步支持,2)我不清楚如何从该示例中使用它(如果有人能给我指一个更彻底的,那将不胜感激),3)这可能会带来一个问题,因为我将使用Spring Security来锁定这个应用程序。

因此,我可以实现自己的长轮询机制。关于如何处理这个问题,有什么最佳实践吗?我想我可以保留一个以会话ID为键、以BlockingQueue中的消息为值的单例ConcurrentMap。工作线程会将消息放入相应的BlockingQueue中,当对消息的请求进入会话时,它会从阻塞队列中删除,直到发布一些终端消息。但是,还有一个问题,如果客户端再也没有回来耗尽消息队列,该怎么办。它将如何清理?我有一种直觉,认为有更好的方法来实现这一点,但我不确定那是什么。有人能在这里给我一些指导吗?

请参阅我昨天发布的以下帖子。

堆栈溢出站点中的更新消息如何显示

在回复中,@Werner Vesterås提到了DWR

在另一个回应中,@Nambari也提到了彗星

似乎对你有用。

我还遇到了Kaazing

它也在做一些类似推送通知的事情

希望它能帮助

最新更新