通知应以JSON格式发送。
我的第一个想法是使客户端发送长轮询请求,当有可用的通知时,使用Jetty的Continuation API进行响应,然后重复此过程。
这种方法的问题在于我错过了两个请求之间发生的所有通知。
我找到的唯一解决方案是在服务器上缓冲事件,并使用时间戳机制重新传输丢失的通知,这有效,但看起来对于它所做的事情来说相当繁重...
你有什么更优雅的解决方案吗?
谢谢!
抱歉打扰了,但我相信许多人将会遇到这个帖子和已接受的答案,但我认为它过时了,甚至可以说是误导性的。
按照优先顺序,我的意见如下:
1)现在最好的解决方案是WebSockets。我个人有在企业应用中引入WebSockets的经验。所有主要的浏览器(Chrome,Firefox,IE - 按字母顺序 :)) 都原生支持WebSockets。所有主要的服务器 / servlets(IIS,Tomcat,Jetty)都是一样的,而且在Java中有很多实现JSR 356 API的框架。确实存在代理问题,特别是在云部署中。但WebSockets要求得到高度关注,所以NginX早在1.5年前就支持它们了。无论如何,安全的“wss”协议可以在99.9%(不是100%,只是为了保险起见,我自己从未遇到)情况下解决代理问题。
2)长轮询可能是第二好的解决方案,“可能”部分归因于“短轮询”可替代。当谈到长轮询时,我的意思是来自客户端对服务器重复请求,并在任何数据可用时立即响应的请求。因此,一个轮询可以在几毫秒内完成,另一个轮询可能要等到最大等待时间。 请确保将轮询时间限制在小于2分钟的某个值,否则通常需要在客户端管理超时错误。我建议将轮询时间限制在几十秒钟左右。 确保一次轮询完成之后(及时或在此之前),它会立即重复(但最好建立一些简单的协议,并给予服务器一个机会告诉客户端“挂起”)。 长轮询的缺点,我认为这正义继续列出列表的原因,是它拥有浏览器允许每个页面与服务器建立的仅有的几个连接(4、8个?还不是很多),因此它可能会消耗约12%到25%的您网站客户端流量资源。
3)短轮询并不被许多人所喜爱,但有时我更喜欢它。其主要缺点是,在建立新连接时对浏览器和服务器的负载很高。然而,我认为如果适当地使用连接池,则这种开销要小得多,不像第一眼看起来那么糟糕。
4)HTTP流,无论是通过IFrame还是XHR流式传输页面,都是我认为非常糟糕的解决方案,因为它就像是所有其他方案的缺点和更多缺点的积累:
您将保持打开的连接(浏览器和服务器资源);
您仍将消耗可用客户端流量总限制;
最糟糕的是:您需要设计/实现(或重用设计/实现)实际内容传递,以便能够区分新内容和旧内容(无论是在推动脚本还是跟踪累积内容的长度)。请不要这样做。
更新(2019年2月20日)
如果WebSockets不是一种选择,则Server Sent Events是我认为的第二好选择 - 在这里,浏览器为您实现了HTTP流。
HTTP�媒体�对比HTTP长轮询更好。WebSockets是一个更好的解决方案。
WebSocketsæ��ä¾›äº†ç¬¬ä¸€ä¸ªæ ‡å‡†åŒ–çš„å�Œå�‘å…¨å�Œå·¥è§£å†³æ–¹æ¡ˆï¼Œç”¨äº�在Web上å®�ç�°å®�时通信,å�¯ä»¥åœ¨ä»»ä½•å®¢æˆ·ç«¯ï¼ˆä¸�一定是Webæµ�览器)和æœ�务器之间进行通信。我认为WebSocketsæ˜¯æœ€å¥½çš„é€‰æ‹©ï¼Œå› ä¸ºå®ƒä»¬æ˜¯ä¸€ç§�技术,将会æŒ�ç»å�‘展ã€�得到支æŒ�和需求,并且å�ªä¼šåœ¨ä½¿ç”¨ç�‡å’Œæµ�行度上å¢�长。它们也é��常酷ğŸ‘�。
ä¼¼ä¹�有Javaçš„å‡ ä¸ªWebSocket客户端和Jetty也支æŒ�WebSockets。