2


我用cometd实现通知推送,但是发现如下问题:
登录系统后,一开始客户端可以接收到服务器的消息,但是等了很久或者做一些其他操作,客户端可能就收不到了不再接收来自服务器的消息。有没有其他人遇到过这个问题?提前致谢。
Blow 是我的代码:
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);
}
4

0 回答 0