2011-06-22 59 views
2

我很努力去理解一種有效的方式來通知客戶而不浪費線程。當客戶端連接到CometD servlet時,我想要開始監視客戶端的服務器端事件,並在客戶端可用時將其發佈到客戶端。這應該在線程池或不使用servlet線程的東西中完成。我看到的所有示例都是針對客戶端發起的事件以及服務器上的偵聽器。我需要相反的...我是否將Client/ServerSession對象交給我自己的機器?這似乎是一種常見模式,但我找不到任何例子。用於通知客戶端服務器端事件的java cometd模式是什麼?

+0

如果您使用的是weblogic,則內置了所有內容:http://download.oracle.com/docs/cd/E15051_01/wls/docs103/webapp/pubsub.html – RealHowTo

回答

0

看看Servlet 3.0異步API。特別是,ServletRequest.startAsync()會返回一個AsyncContext對象,你可以「交給你自己的機器」,然後從你的servlet doGet()/ doPost()/ etc返回。而不終止連接。

然後有各種模式發送數據回客戶端。我相信你的「自己的機器」只能從AsyncContext獲取ServletResponse並寫入它。另一種方法是在AsyncContext上調用dispatch(),這將導致您的doGet()/ doPost()方法再次被調用。

+0

謝謝。我正在嘗試使用bayeux/cometd,並將​​其中的一些內容抽象出來,所以如何處理它並不那麼明顯。我最終使用了我自己的線程池,並使用Bayeux提供的subscribe/unsubscribe回調函數來安排我的池中的作業。 –