2014-02-10 92 views
0

詳細解釋後的進一步分析 Cometd javascript client doesn't subscribe to broadcast channelcometd javascript客戶端可以在客戶端訂閱和服務器重啓時收到廣播消息

如果Cometd-Spring程序開始廣播新消息並且稍後訂閱cometd javascript客戶端,則客戶端無法接收新廣播消息。但是,客戶端在啓動cometd服務器後開始接收廣播消息。

廣播信道:/通知

客戶端代碼:

function _metaHandshake(handshake) 
    { 
     if (handshake.successful === true)  
     { 
     cometd.batch(function(){   
     cometd.subscribe('/notification', function(message){ 
          console.log("Received Data ::"+JSON.stringify(message.data)); 
          }); 
      }); 

     } 

    } 

服務器代碼:

@javax.inject.Named 
@javax.inject.Singleton 
@Service("notificationService") 
public class NotificationService { 


    @Inject 
    private BayeuxServer bayeuxServer; 

    @Session 
    private LocalSession session; 


    @Configure("/notification") 
      public void configureServiceChannel(ConfigurableServerChannel channel) 
      { 
       channel.setPersistent(true);// channel persistent 
       channel.addAuthorizer(GrantAuthorizer.GRANT_ALL); 
      } 


     public void onExternalEvent(Map<String, Object> data) 
     { 

     this.bayeuxServer.getChannel("/notification").publish(this.session, data); 

     } 

} 

回答

0

如果我理解正確的話,你之前的客戶端發送一個消息認購。 如果是這樣的話,那麼客戶當然不會在那個時候收到消息。

如果客戶端在消息發送後訂閱,那麼期望客戶端將能夠接收消息是錯誤的。消息現在消失了。

CometD不存儲消息,因爲這是一個特定於應用程序的行爲。

如果您的客戶端想要接收未訂閱時發送的消息,則應用程序必須執行特定於應用程序的操作,以存儲稍後要發送的消息。

+0

欲瞭解更多信息 - 訂閱後客戶端不會收到新的廣播消息... – user2263197

+0

啓用調試日誌記錄並仔細檢查是否沒有實例化2個BayeuxServer實例。請參閱http://docs.cometd.org/reference/troubleshooting.html。 Spring文檔位於http://docs.cometd.org/reference/java_server.html#java_server_services_integration_spring。服務器和客戶端調試日誌是您最好的工具。您可以在CometD郵件列表(https://groups.google.com/forum/#!forum/cometd-users)中報告它們以進行更詳細的分析。 – sbordet

相關問題