我有一個使用CometD的Java web應用程序。工作流程很簡單:使用CometD Java客戶端發佈消息,可以被Javascript訂閱者使用
- 我已經定義了一個在通道「/ service/hello」上接收消息的服務。該服務需要一個參數「名稱」。基於此,它創建一個名爲:
"/"+message.getDataAsMap().get("name")
的頻道。在這個頻道上,它附加了一個回叫方法,它會向所有用戶發回一條消息。 - Javascript客戶端(使用dojo)向頻道 發佈消息「/ service/hello」並訂閱名稱已發送 作爲參數的「/ service/hello」頻道。讓我們舉一個例子:
.... cometd.subscribe('/1234', function(message) { //do smth on message received; }); cometd.publish('/service/hello', { name: '1234' }); ....
這工作得很好。現在,我想要達到的目標如下:讓Javascript客戶端只作爲訂閱者,並使用Java客戶端來完成發佈。 我已經嘗試使用CometD2文檔中給出的Java客戶端API的示例,但它不能按預期工作。看起來該服務被調用,但消費者看不到這些消息。
有沒有可能做到這一點?任何錯誤的想法?謝謝。
這裏是在服務器端的代碼:
公共類HelloService的延伸AbstractService { 公共HelloService中(BayeuxServer貝葉) { 超級(貝葉, 「你好」); addService(「/ service/hello」,「processHello」); }
public void processHello(ServerSession remote, Message message) { Map<String, Object> input = message.getDataAsMap(); String name = (String)input.get("name"); String channelId = "/"+name; addService(channelId, "processId"); processId(remote, message); } public void processId(ServerSession remote, Message message) { Map<String, Object> input = message.getDataAsMap(); String name = (String)input.get("name"); int i = 0; Map<String, Object> output = new HashMap<String, Object>(); while(i<1){ i++; output.put("greeting", "Hello, " + name); remote.deliver(getServerSession(), "/"+name, output, null); try { Thread.sleep(1000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } }
你能發佈服務器端的代碼嗎? – perissf
我已經添加了服務器端的代碼。這是來自cometd文檔頁面的一個適合我的案例。 – mihaela