我很难理解一种在不浪费线程的情况下通知客户端的有效方法。当客户端连接到CometD servlet时,我希望开始监视客户端的服务器端事件,并在它们可用时将它们发布到客户端。这应该在线程池或不使用servlet线程的地方完成。我看到的所有示例都是源于客户端的事件和服务器上的侦听器。我需要相反的。。。我只是将Client/ServerSession对象交给我自己的机器吗?这似乎是一种常见的模式,但我找不到任何例子。
查看Servlet 3.0 Async API。特别是,ServletRequest.startAsync()
将返回一个AsyncContext
对象,您可以将其"交给自己的机器",然后从servlet doGet()/doPost()等返回。而不终止连接。
然后有各种模式用于将数据发送回客户端。我相信你的"自己的机器"可以从AsyncContext
中获取ServletResponse
并向其写入。另一种方法是在AsyncContext
上调用dispatch()
,这将导致你的doGet()/doPost()方法再次被调用。