2


通知のプッシュを実現するために 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);
}
4

0 に答える 0