Я использую Channel API (Java) с Google App Engine для своего веб-приложения. Я реализовал механизм повторного использования токенов, который быстро не превысил Channel API Quotas. Это означает, что моя реализация повторно использует существующий канал для пользователя, который обновляет страницу до тех пор, пока время истечения токена, полученного вызовом ChannelService.createChannel()
, еще не закончено.GAE/Java LocalChannelFailureException на сервере разработки
При обновлении моей страницы я получаю следующее исключение (с x
, начиная с 0 и увеличиваясь для каждого обновления). Однако моя страница продолжает работать по назначению. Есть ли способ избежать исключения? Или я могу просто игнорировать исключение?
com.google.appengine.api.channel.dev.LocalChannelFailureException: Client connection with ID connection-x not found.
at com.google.appengine.api.channel.dev.Channel.getClientMessageQueue(Channel.java:79)
at com.google.appengine.api.channel.dev.ChannelManager.getNextClientMessage(ChannelManager.java:300)
at com.google.appengine.api.channel.dev.LocalChannelServlet.doGet(LocalChannelServlet.java:120)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:617)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:511)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1166)
...
Im повторное использование маркеров со следующими классами:
При вызове ChannelService.createChannel()
я сохранить дату истечения и сгенерированный маркер в Сущности под названием «Канал»
public class Channel {
private String id;
private String token;
private Date expiration;
}
Тогда у меня есть ChannelService класс, который возвращает действительный канал с его get()
. КаналDAO - это класс, который просто использует карту для хранения каналов. Таким образом, нет стойкости к базе данных, которая бы сохраняла токен при перезагрузке сервера.
public Channel get(String clientId) {
Calendar calendar = Calendar.getInstance();
Channel channel = channelDAO.get(clientId);
if (channel == null || calendar.getTime().after(channel.getExpiration())) {
com.google.appengine.api.channel.ChannelService channelService = ChannelServiceFactory
.getChannelService();
calendar.add(Calendar.MINUTE, CHANNEL_UPTIME);
String token = channelService.createChannel(player.toString(), CHANNEL_UPTIME);
channel = new Channel(clientId, token, calendar.getTime());
channelDAO.persist(channel);
}
return channel;
}
работал для меня, очень здорово! спасибо –
Видимо, работает в Safari, Firefox, но не в Chrome? – cloudsurfin