мета-данные страницы
  •  

Это старая версия документа!


Идемпотентность в мобильных приложениях

Последнее изменение 16.07.2020

1. Пишущая транзакция (на сервере)


Агент

  1. Добавлены property
    1. Himstat.IdempotencyText устанавливается на прямую (доступно на чтение и запись)
    2. Himstat.IdempotencyHash устанавливается при установке IdempotencyText (доступно только на чтение)
  2. uErrorRes добавлен тип Exception TIdenpotencyException
    • На примере запроса PayPlanOrders:
  3. THimstatDM.ReplyWithPayPlanOrders
    1. Himstat.IdempotencyText := Srvr.Request.Query.Text; Получаем IdempotencyText IdempotencyHash
  4. Himstat.DoPayPlanOrders
    1. QueryIdempotency Записываем в таблицу Hash и время
      1. Нет таблицы IDEMPOTENCY_QUERY - выходим из проверки
      2. получаем старый ОТВЕТ (предыдущего АНАЛОГИЧНОГО запроса) ИЛИ получаем ОТВЕТ="" - Идет запись
        1. ОТВЕТ=null - пытаемся записать HASH
          1. ERROR Присваиваем ОТВЕТ:="" - Идет запись
      3. FINALY
        1. (1) ЕСЛИ ОТВЕТ=null - то у нас уникальный запрос записанный в таблицу
        2. (2) ЕСЛИ ОТВЕТ<>null - запрос не уникален - возбуждаем исключение TIdenpotencyException.Create(ОТВЕТ);
    2. (1) UpdateIdempotency сохраняем ОТВЕТ в таблицу
    3. (2) TIdenpotencyException
      1. Если исключение содержит НЕ ПУСТОЕ сообщение то это ОТВЕТ и мы его отправляем повторно
      2. Если исключение содержит ПУСТОЕ сообщение то снова возбуждаем TIdenpotencyException и отправляем как ошибку ОДНОВРЕМЕННОГО ЗАПРОСА (ErrorCode = 5)
  5. Если ОШИБКА произошла в теле обработки до сохранения ОТВЕТа то HASH запроса удаляется


Клиент

  1. Организовать уникальность запроса
  2. Обработку ErrorCode = 5

2. Читающая транзакция (на на клиенте)

На примере МП Courier

var
  PayIdempotency: string;
...
 
...
      JSONAnswer := KassaFiscalRegistar.PrintFiscalCheck(JSONResultObj);
      ...
    except
      on E: Exception do
      begin
        PayIdempotency := ''; //  
...
 
...
      ClnDM.GetFiscalCheck(sJSON,
        procedure (AJObject: TJSONObject)
        var CurrentPayIdempotency: string;
        begin
          CurrentPayIdempotency := THashMD5.GetHashString(sJSON + '=' + AJObject.ToString);
          if PayIdempotency = CurrentPayIdempotency then
          begin
            WriteLog('TmoneyPayFramePanel.WorkOfPay PayIdempotency = CurrentPayIdempotency Abort');
          end
          else
          begin
            PayIdempotency := CurrentPayIdempotency;
            AnswerFromWeb('GetFiscalCheck', '', 0, AJObject);
          end;
        end);

Обращаться: Олег Зуев