2011-10-05 76 views
4

我有一個使用CometD的Java web應用程序。工作流程很簡單:使用CometD Java客戶端發佈消息,可以被Javascript訂閱者使用

  1. 我已經定義了一個在通道「/ service/hello」上接收消息的服務。該服務需要一個參數「名稱」。基於此,它創建一個名爲:"/"+message.getDataAsMap().get("name")的頻道。在這個頻道上,它附加了一個回叫方法,它會向所有用戶發回一條消息。
  2. 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();   } 
    } 
} } 
+0

你能發佈服務器端的代碼嗎? – perissf

+0

我已經添加了服務器端的代碼。這是來自cometd文檔頁面的一個適合我的案例。 – mihaela

回答

3

remote.deliver()發送 「答案」,關於服務信道發佈的remote會話(即,客戶端)。

您應該將未經請求的消息發佈到正常通道(服務器端尚不存在)。所以,你應該寫點類似於

String channelName = "whatever - not beginning with /service"; 
getBayeux().createIfAbsent(channelName); 
getBayeux().getChannel(channelName).publish(getServerSession(), output, null); 
+0

謝謝。有效! – mihaela

相關問題