HttpServletResponse подтверждает, что клиент получил ответ - PullRequest
0 голосов
/ 03 ноября 2018

У меня есть приложение для Android, которое выполняет синхронизацию нескольких данных с сервлетом Java, и мне нужно убедиться, что ответ передан на устройство Android, прежде чем вносить изменения в базу данных.

Проблема сейчас в том, что пользователь отправляет запрос, сервер вносит некоторые изменения, фиксирует их и затем отправляет ответ пользователю. Иногда пользователь никогда не получает ответ (ненадежная сеть), а затем через некоторое время пользователь снова отправляет тот же запрос (теперь у меня есть дублированные данные).

Мне не нужно знать, правильно ли обрабатывает ответ Android, мне просто нужно убедиться, что он получил ответ.

Как мне убедиться, что клиент получил ответ?

protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    String data = IOUtils.toString(request.getInputStream(), "UTF-8");
    JSONObject dataJson = new JSONObject(data);
    Transaction trx = new Transaction(true);
    JSONObject responseJson = SyncService.processSync(trx, dataJson);

    response.setContentType("application/json");
    response.setCharacterEncoding("UTF-8");
    response.getWriter().write(responseJson.toString());
    // Here the transaction to the database is commited regardless if the client receives response (no error thrown)
    trx.commit();
    trx.close();
}

1 Ответ

0 голосов
/ 04 ноября 2018

Я могу предложить вам следующие способы, и последний мой любимый:

  1. блокирует пользовательский интерфейс Android до получения ответа, который может быть не тем, что вы хотите
  2. , поскольку вы упомянули, что вам не нужен клиент для анализа ответа, делайте то, что вы делаете в потоке в сервлете, чтобы быстрее отвечать и не блокировать клиента

    new Thread(()->{
    String data =    
    IOUtils.toString(request.getInputStream(), "UTF-8");
    JSONObject dataJson = new JSONObject(data);
    Transaction trx = new Transaction(true);
    JSONObject responseJson =  SyncService.processSync(trx, dataJson);
    }).start();
    
  3. отслеживать ваши запросы в Android с помощью etag

  4. не используйте http, вместо этого используйте GRPC протокол, который дает вам двунаправленное соединение между вашим android и сервером

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...