GAE频道重复发送第一条消息

时间:2012-06-15 02:41:00

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

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

假设我向客户发送了1条消息:“First Message”

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

然后让我说我向客户发送另一条消息“第二条消息”。

客户端将再次收到消息“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));
        }

每当我存储特定类型的新项目时(这是在实体更新函数中): 我把它变成了JSON。 然后我记录了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();
                        }
                    });
                }
            });
        }
    });

2 个答案:

答案 0 :(得分:1)

我在SO上看到很多问题,其中有人在代码中有错误,但认为它是框架的一部分。在没有看到任何代码的情况下,我怀疑有一些错误,你认为你正在发送“第二条消息”,但你真的发送了“第一条消息”的缓存版本。

答案 1 :(得分:0)

所以我终于弄清楚了。当我调用

时,似乎在app中的onMessage函数中
eventBus.fireEvent(new MessageReceivedEvent(json));

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