В моем приложении я хочу иметь функцию чата - в которой несколько человек (возможно, 5 или более) могут одновременно общаться вместе.Как создать надежный чат с помощью Google App Engine Data Store (HRE)?
Я использую Java-приложение на основе Java - это действительно первый раз, когда я пытался использовать хранилище данных GAE, я так привык использовать Oracle/MySQL, поэтому считаю, что моя стратегия неверна.
Примечание: Для простоты я опуская любые проверки проверки/безопасности В некоторых сервлета называется WriteMessage
я следующий код
Entity entity = new Entity("ChatMessage");
entity.setProperty("userName", request.getParameter("userName"));
entity.setProperty("message", request.getParameter("message"));
entity.setProperty("time", new Date());
DatastoreService datastore = DatastoreServiceFactory.getDatastoreService();
datastore.put(entity);
В какой-то другой сервлет называется ReadMessages
я следующий код
String id = request.getParameter("id");
DatastoreService datastore = DatastoreServiceFactory.getDatastoreService();
Query query = new Query("ChatMessage");
if (id != null) {
// Client requested only messages with id greater than this id
Filter idFilter = new FilterPredicate(Entity.KEY_RESERVED_PROPERTY,
FilterOperator.GREATER_THAN,
KeyFactory.createKey("ChatMessage", Long.parseLong(id)));
query.setFilter(idFilter);
}
PreparedQuery pq = datastore.prepare(query);
JsonArray messages = new JsonArray();
for (Entity result : pq.asIterable()) {
JsonObject jmsg = new JsonObject();
// Client will use this id on the next request to read to poll only
// "new" messages
jmsg.addProperty("id", result.getKey().getId());
jmsg.addProperty("userName", (String) result.getProperty("userName"));
jmsg.addProperty("message", (String) result.getProperty("message"));
jmsg.addProperty("time", ((Date) result.getProperty("time")).getTime());
messages.add(jmsg);
}
PrintWriter out = response.getWriter();
out.print(messages.toString());
В коде клиента javascript - сервлет WriteMessage
вызывается в любое время, когда пользователь отправляет новое сообщение - d ReadMessages
Сервлет вызывается каждую секунду для получения новых сообщений.
Для того, чтобы оптимизировать, javascript отправит идентификатор последнего сообщения, которое он получил (или, возможно, самый высокий идентификатор, полученный до сих пор), на последующие запросы до ReadMessage
, так что ответ содержит только сообщения, Раньше я видел.
Это, кажется, работает сначала, но я думаю, что, возможно, в этом коде есть пара ошибок.
Вот что я думаю, что это не так:
Некоторые сообщения не могут быть истолкованы, потому что я полагаться на идентификатор ключа ChatMessage, чтобы отфильтровать сообщения о том, что клиент JS уже видел раньше - я не думайте, что будет надежным?
Некоторые записи могут потерпеть неудачу, так как в то же время может быть 5 или 6 входящих записей - и я понимаю, что это может привести к
ConcurrentModificationException
, если слишком много записей в секунду.Дата, переданная сущностью, является текущей датой JRE на сервере приложений - может быть, я должен использовать что-то вроде «sysdate()» в SQL? Я не знаю, действительно ли это проблема или нет.
Как я могу исправить код так, что:
Все сообщения чата будет написано - что он просто лучше иметь отказоустойчивость, так что если запрос не на JavaScript будет просто повторить попытку до тех пор, не
Все сообщения чата будут прочитаны (без исключения)
Чистые старые сообщения, так что только 1000 или около того сообщения сохраняются
Посмотрите на: http://googcloudlabs.appspot.com/codelabexercise4.html –