详细解释进一步分析的帖子 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);
}
}
答案 0 :(得分:0)
如果我理解正确,您可以在订阅客户端之前发送一条消息。 如果是这种情况,那么客户端当然不会在那时收到消息。
如果客户端在发送消息后进行订阅,则期望客户端能够接收消息是错误的。消息现在消失了。
CometD不存储消息,因为这是特定于应用程序的行为。
如果您的客户希望收到未订阅时发送的消息,则您的应用程序必须执行特定于应用程序的操作,以存储您希望稍后发送的消息。