当客户端订阅和服务器重启时,cometd javascript客户端可以接收广播消息

时间:2014-02-10 18:20:19

标签: javascript spring cometd

详细解释进一步分析的帖子 Cometd javascript client doesn't subscribe to broadcast channel

如果Cometd-Spring程序开始广播新消息并且稍后订阅了cometd javascript客户端,则客户端无法接收新广播消息。但是,客户端在cometd服务器重新启动后开始接收广播消息。

广播频道: / notification

客户代码:

  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);

        }

}

1 个答案:

答案 0 :(得分:0)

如果我理解正确,您可以在订阅客户端之前发送一条消息。 如果是这种情况,那么客户端当然不会在那时收到消息。

如果客户端在发送消息后进行订阅,则期望客户端能够接收消息是错误的。消息现在消失了。

CometD不存储消息,因为这是特定于应用程序的行为。

如果您的客户希望收到未订阅时发送的消息,则您的应用程序必须执行特定于应用程序的操作,以存储您希望稍后发送的消息。