それで、これは数ヶ月前にこのプロジェクトに取り組んでいました。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();
}
});
}
});
}
});