Cometd:似乎ServerChannel失去了一些订阅者

时间:2012-11-09 15:19:03

标签: cometd


我用cometd来实现通知推送,但我发现了以下问题:
登录系统后,客户端可以从服务器接收消息,但是等待很长时间或进行其他操作后,客户端可能无法再接收来自服务器的消息。有没有其他人遇到过这个问题?在此先感谢。
打击是我的代码:
1.客户代码

var cometd = dojox.cometd;cometd.websocketEnabled = false;
    cometd.init(url);
    cometd.subscribe("/foo/new", function(message) {
            ......The business logic......
        }
    );

2。与AbstractService集成的ServletContextAttributeListener

public class BayeuxInitializerListener implements ServletContextAttributeListener {
private static final String CLIENT_CHANNEL = "/foo/new";
@Override
public void attributeAdded(ServletContextAttributeEvent event) {
    if(BayeuxServer.ATTRIBUTE.equals(event.getName())) {
        BayeuxServer bayeuxServer = (BayeuxServer) event.getValue();
        boolean isCreated = bayeuxServer.createIfAbsent(CLIENT_CHANNEL, new ConfigurableServerChannel.Initializer() {
            @Override
            public void configureChannel(ConfigurableServerChannel channel) {
                channel.setPersistent(true);
            }
        });
        new MyService(bayeuxServer);

    }
}


3.服务

public class MyService extends AbstractService {
private static final Logger logger = Logger.getLogger(MyService .class);

private static final String CLIENT_CHANNEL = "/foo/new";
private static final String LISTENER_CHANNEL = "/service/notification";

public MyService(BayeuxServer bayeuxServer) {
    super(bayeuxServer, "notification");
    this.addService(LISTENER_CHANNEL, "processNotification");
}

public void processNotification(ServerSession serverSession, Map<String, Object> data) {
    LocalSession localSession = this.getLocalSession();
    if(logger.isDebugEnabled()) {
        logger.debug("Local Session : " + localSession.getId() + ".");
    }
    ServerChannel serverChannel = this.getBayeux().getChannel(CLIENT_CHANNEL)
    Set<ServerSession> subscribers = serverChannel.getSubscribers();
    if(0 == subscribers.size()) {
        logger.info("There are no subcribers for " + CLIENT_CHANNEL + ".");
    }
    for(ServerSession subscriber : subscribers) {
        logger.info("The subscriber for " + CLIENT_CHANNEL + " : " + subscriber.getId() + ".");
    }
    serverChannel.publish(localSession, data, null);
}

0 个答案:

没有答案