所以这是几个月前在这个项目上的工作。我正在使用 Google App Engine 的 Channel API 将消息推送到我的 GWT 应用程序。我正在使用http://code.google.com/p/gwt-gae-channel/通过 GWT 进行交互。
假设我向客户端发送了 1 条消息:“第一条消息”
客户端会收到消息,“第一条消息”就好了。
然后假设我向客户端发送另一条消息“第二条消息”。
客户端将再次收到消息“第一条消息”。
这将继续发生。在某些情况下,我会收到第二条消息,这将是重复卡住的消息。
当我最终关闭页面并因此关闭频道时,我再次收到重复的消息,而没有从服务器发送任何内容。
有谁知道发生了什么?我认为几个月前我在做这个工作时不会发生这种情况,而且我看不到 GAE Channel 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();
}
});
}
});
}
});