Блокировки

Зачем нужны блокировки

Блокировка запрещает выполнять действия с черновиком, DraftsBuilder или документооборотом, пока не закончил выполняться запрос, который вызвал блокировку. Блокируется при этом объект, для которого вызван метод (черновик, документ, подпись и т.д.). Это уберегает от возможных коллизий при одновременном, параллельном выполнении запросов, связанных с одним объектом, или при ошибках и повторной отправке запроса. При выполнении запросов, ограниченных блокировками, возвращается ошибка с кодом 409.

Блокировки в черновиках

Блокировки в черновиках запрещают одновременно выполнять:

Блокировки в документооборотах

Блокировки в документооборотах запрещают одновременно выполнять:

  • печать одного и того же документа из документооборота;

  • подписание сертификатом разных ответных документов (с разными reply-id) в одном документообороте;

  • дешифрование сертификатом разных документов в одном документообороте .

Блокировки в DraftsBuilder

Блокировки в DraftsBuilder запрещают:

  • одновременно выполнять метод POST Build одного и того же конструктора черновиков (сборка DraftsBuilder в черновик).

  • выполнять POST, PUT, DELETE запросы по завершении работы метода POST Build.

    Данные ограничения можно отслеживать по статусу DraftsBuilder. Пока статус в значении New — можно выполнять любые операции. Когда запускается сборка, статус меняется на Building, запрещаются любые запросы к собираемому DraftsBuilder кроме GET.

    Если по завершении сборки попробовать запустить любой метод на изменение сущностей DraftsBuilder, вернется ошибка. Исключение: повторное выполнение запроса сборки, если метод завершился ошибкой с кодом 500.

Ошибка 409 Conflict

При попытке одновременного выполнения запросов, ограниченных блокировками, API возвращает ошибку с кодом 409 Conflict. Тело ответа содержит ошибку с идентификатором urn:error:externapi:concurrentApiTaskActive. Дополнительно ошибка может содержать идентификатор и тип параллельно выполняющейся операции.

Пример ошибки

{
    "id": "urn:error:externapi:concurrentApiTaskActive",
    "status-code": 409,
    "track-id": "m4n3ggqtoxgge78q93go",
    "message": "There is an active concurrent operation",
    "trace-id": "[T-587660f5(-)] ",
    "context": {
        "concurrent-task": {
        "id": "5b35fae5-e429-43c5-befe-6a4aa3cfceda",
        "task-type": "urn:task-type:send"
        }
    }
}