我正在使用Spring MVC编写一个内部Web应用程序,用户将通过RESTful Web服务提交一组要完成的作业。每个作业只需几秒钟即可完成,但用户可以提交数十个作业。我想要选项在每个作业完成时通知用户。这将被部署到Tomcat 6安装,这在某种程度上限制了我的选择,因为我无法访问Servlet 3。
我以前从未写过这样的东西,我不完全确定如何去做。我想我想做一些长时间的轮询,但是,虽然它在概念上很容易,但我不确定如何用Spring实现它。
我的初步计划是简单地保持连接打开(如果用户设置接收通知的选项),在单独的线程中启动作业,并在作业完成时通过BlockingQueue向请求线程发送消息并转发给用户的消息。但是,我认为将连接保持打开可能不是一个好主意。我也没有看到jQuery在完成之前开始处理AJAX响应的方法。
另一个选择是长轮询。我看到Spring 3.2引入了一个新功能来执行此操作here,但是1)我不确定这是否依赖于Servlet 3中的异步支持,2)我不清楚如何使用它来自那个例子(如果有人能指出我更加彻底,我将不胜感激),3)this可能会起草一个问题,因为我将使用Spring Security来锁定这个应用程序。
所以,我可以实现自己的长轮询机制。有没有关于如何处理这个问题的最佳做法?我当时认为我可以使用会话ID作为键和消息在BlockingQueue中保持单个ConcurrentMap作为值。工作线程会将消息放入相应的BlockingQueue中,并且当消息请求进入会话时,它将从阻塞队列中删除,直到发布了一些终端消息。但是,如果客户端永远不会回来耗尽消息队列,那就会出现问题。怎么会被清理干净?我有一种直觉,认为有更好的方法来实现这一点,但我不确定那是什么。有人可以给我一些指导吗?
答案 0 :(得分:0)
参考我昨天发布的以下帖子。
how the update messages in stack overflow site are being shown
在回复中,@WernerVesterås提到了DWR
另一个回复@Nambari也提到了彗星。
似乎对你有用。
我也遇到了Kaazing
也在做推送通知
之类的事情希望有所帮助