1

それで、これは数ヶ月前にこのプロジェクトに取り組んでいました。Google AppEngineのChannelAPIを使用して、メッセージをGWTアプリにプッシュしています。http://code.google.com/p/gwt-gae-channel/を使用してGWTを介して対話しています。

クライアントに「最初のメッセージ」という1つのメッセージを送信するとします。

クライアントは「最初のメッセージ」というメッセージを問題なく受信します。

次に、別のメッセージ「SecondMessage」をクライアントに送信するとします。

クライアントは再び「最初のメッセージ」というメッセージを受け取ります。

これは引き続き発生します。2番目のメッセージを受信する場合がありますが、繰り返しスタックするメッセージになります。

最終的にページを閉じてチャネルを閉じると、サーバーから何かを送信せずに、繰り返しメッセージを再度受信します。

誰かが何が起こっているのか分かりますか?数か月前にこれに取り組んでいたとき、これは起こっていなかったと思います。GAEChannelAPIに変更はありません。


ここにいくつかのコードがあります:

        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();
                        }
                    });
                }
            });
        }
    });
4

2 に答える 2

1

誰かが自分のコードにバグを持っているが、それはフレームワークの一部だと思う SO に関する多くの質問を目にします。コードを確認せずに、「2 番目のメッセージ」を送信していると思われるバグがあると思われますが、実際には「最初のメッセージ」のキャッシュ バージョンを送信しています。

于 2012-06-15T04:15:47.493 に答える
0

それでようやく理解できました。私が呼び出すと、アプリ内のonMessage関数にあるようです

eventBus.fireEvent(new MessageReceivedEvent(json));

これから戻ることはないようです。したがって、コード内のonMessage関数を終了することはなく、同じメッセージを繰り返し受信することになります。

于 2012-06-24T20:50:27.467 に答える