【问题标题】:GAE Channel Sending First Message RepetativelyGAE频道重复发送第一条消息
【发布时间】:2012-06-18 03:05:01
【问题描述】:

所以几个月前这个项目还在工作。我正在使用 Google App Engine 的 Channel API 将消息推送到我的 GWT 应用程序。我正在使用http://code.google.com/p/gwt-gae-channel/ 通过 GWT 进行交互。

假设我向客户端发送了 1 条消息:“第一条消息”

客户端会收到消息,“First Message”就好了。

然后假设我向客户端发送另一条消息“第二条消息”。

客户端将再次收到消息“第一条消息”。

这将继续发生。在某些情况下,我会收到第二条消息,而这将是重复卡住的消息。

当我最终关闭页面并因此关闭频道时,我再次收到重复的消息,而没有从服务器发送任何内容。

有人知道发生了什么吗?我认为几个月前我在做这个工作时不会发生这种情况,而且我看不到 GAE 频道 API 没有任何变化。


这是一些代码:

        String json = AutoBeanHelper.toJson(proxy);
        log.fine("Item's JSON Received: " + json);

        List<ChannelEntity> channels = channelDAO.getByUserId();
        if (channels.size() > 1) {
            log.warning("Multiple channels for single user detected.");
        }

        ChannelService channelService = ChannelServiceFactory.getChannelService();
        for (ChannelEntity channel : channels) {
            channelService.sendMessage(new ChannelMessage(channel.getClientId(), json));
        }

所以每当我存储一个特定类型的新项目时(这是在那个实体更新函数中): 1.我把它转成JSON。 2. 然后我记录那个 JSON。 3. 我得到了那个用户频道。 4. 我把它发送到那个用户频道。

当我查看我的日志时,我看到上面我正在记录的变量显示正确,这意味着 我正在记录正确的 JSON 消息,但是当我在警报中显示 JSON 时在客户端,一旦它到达客户端,前一条消息似乎就被卡住了重复。我真的不知道我在这里做错了什么。

如果您想查看代码的另一部分,请告诉我。为了更好地衡量,这是客户端上的代码:

eventBus.addHandler(ReceivedChannelTokenEvent.TYPE, new ReceivedChannelTokenEventHandler() {
        @Override
        public void onEvent(ReceivedChannelTokenEvent event) {
            ChannelFactory.createChannel(event.getChannelToken(), new ChannelCreatedCallback() {
                @Override
                public void onChannelCreated(Channel channel) {
                    final Socket channelSocket = channel.open(new SocketListener() {
                        @Override
                        public void onOpen() {
                            Window.alert("Channel Opened");
                        }
                        @Override
                        public void onMessage(String json) {
                            Window.alert(json);
                            eventBus.fireEvent(new MessageReceivedEvent(json));

                        }
                        @Override
                        public void onError(SocketError error) {
                            Window.alert("Channel Error: " + error.getDescription());
                            if ( error.getDescription().equals(CHANNEL_ERROR_TOKEN_TIME_OUT) ) {
                                eventBus.fireEvent(new ChannelTimeOutEvent());
                            }
                        }
                        @Override
                        public void onClose() {
                            Window.alert("Channel Closed.");
                        }
                    });

                    Window.addWindowClosingHandler(new Window.ClosingHandler() {
                        @Override
                        public void onWindowClosing(ClosingEvent event) {
                            channelSocket.close();
                        }
                    });
                }
            });
        }
    });

【问题讨论】:

  • 这是发生在开发应用服务器还是生产环境中?
  • 好问题。这发生在生产应用程序上。

标签: google-app-engine gwt channel-api


【解决方案1】:

我看到很多关于 SO 的问题,有人在他们的代码中存在错误,但认为这是框架的一部分。没有看到任何代码,我怀疑存在一些错误,您认为您正在发送“第二条消息”,但实际上您发送的是“第一条消息”的缓存版本。

【讨论】:

    【解决方案2】:

    所以我终于弄明白了。似乎在我调用时应用程序内的onMessage函数中

    eventBus.fireEvent(new MessageReceivedEvent(json));
    

    它似乎永远不会从这里返回,因此永远不会退出代码中的onMessage函数,导致我重复收到相同的消息。

    【讨论】:

      猜你喜欢
      • 2018-12-29
      • 2021-01-19
      • 2019-06-06
      • 2019-05-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-24
      • 1970-01-01
      相关资源
      最近更新 更多