Инструменты пользователя

Инструменты сайта


sharixopen:knowledge:scenarios:st_request_waiting

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


Ожидание новой заявки ST_REQUEST: обработчик и очередь

Область: ShariX Open. Основание: реализация обработчика open_st_request_new и планировщика очереди, проверенная 28.10.2026 по указанным ниже версиям Git. Это описание реализованного механизма ожидания, а не проект будущего процесса.

Встроенный Python и workspace: обнаруженное расхождение

У встроенного Python указанной Git-версии есть две ветви: при отключённом STREQ_AUTOACCEPT он ожидает ручного назначения, а при включённом пытается перевести заявку в ASSIGNED, передать следующему обработчику и сохранить комнату. Первоначальная схема ниже была построена только по workspace и показывала лишь ожидание. Этот workspace в той же Git-версии не содержит автоматической ветви; считать его полным описанием встроенного Python нельзя.

Подготовлено исправление канонического workspace/генерации с сохранением автоматической ветви. Это описание найденного расхождения и требуемого контракта; оно не является подтверждением применения патча на конкретной установке. Для фактической работы нужно отдельно проверить выбранную локальную Python-версию.

Маршрутизация встроенного Python (BPMN)

Схема BPMN

Загрузка схемы…

Исходник схемы
<?xml version="1.0" encoding="UTF-8"?>
<bpmn:definitions xmlns:bpmn="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:dc="http://www.omg.org/spec/DD/20100524/DC" xmlns:di="http://www.omg.org/spec/DD/20100524/DI" id="Definitions_open_st_request_new_routing" targetNamespace="urn:sharix:knowledge:processes">
  <bpmn:process id="Process_open_st_request_new_routing" name="Маршрутизация встроенного open_st_request_new" isExecutable="false">
    <bpmn:documentation>{"notes": ["Это описание built-in Python указанного Git; локально выбранная версия требует отдельной проверки. Детальный цикл ручного ожидания показан следующей схемой."], "sources": [{"commit": "624709bdbc9756e5c507ba318e987a12f1710a37", "path": "handlers/open_st_request_new.py", "repository": "handlers_examples", "sha256": "54f4706624cf3cc3a3d923af4c227150ddfa3c32bbfcb16b49df940ceea129d0"}]}</bpmn:documentation>
    <bpmn:laneSet id="Lanes_open_st_request_new_routing">
      <bpmn:lane id="Lane_handler" name="Python обработчика">
        <bpmn:flowNodeRef>received</bpmn:flowNodeRef>
        <bpmn:flowNodeRef>status</bpmn:flowNodeRef>
        <bpmn:flowNodeRef>auto</bpmn:flowNodeRef>
        <bpmn:flowNodeRef>manual</bpmn:flowNodeRef>
        <bpmn:flowNodeRef>manual_end</bpmn:flowNodeRef>
        <bpmn:flowNodeRef>wrong_cleanup</bpmn:flowNodeRef>
        <bpmn:flowNodeRef>wrong_end</bpmn:flowNodeRef>
        <bpmn:flowNodeRef>assign</bpmn:flowNodeRef>
        <bpmn:flowNodeRef>success</bpmn:flowNodeRef>
        <bpmn:flowNodeRef>failed</bpmn:flowNodeRef>
        <bpmn:flowNodeRef>handoff</bpmn:flowNodeRef>
        <bpmn:flowNodeRef>cleanup</bpmn:flowNodeRef>
        <bpmn:flowNodeRef>done</bpmn:flowNodeRef>
      </bpmn:lane>
    </bpmn:laneSet>
    <bpmn:startEvent id="received" name="Ticket передан обработчику">
      <bpmn:outgoing>Flow_0</bpmn:outgoing>
    </bpmn:startEvent>
    <bpmn:exclusiveGateway id="status" name="Статус NEW?">
      <bpmn:incoming>Flow_0</bpmn:incoming>
      <bpmn:outgoing>Flow_1</bpmn:outgoing>
      <bpmn:outgoing>Flow_2</bpmn:outgoing>
    </bpmn:exclusiveGateway>
    <bpmn:exclusiveGateway id="auto" name="STREQ_AUTOACCEPT включён?">
      <bpmn:incoming>Flow_1</bpmn:incoming>
      <bpmn:outgoing>Flow_4</bpmn:outgoing>
      <bpmn:outgoing>Flow_6</bpmn:outgoing>
    </bpmn:exclusiveGateway>
    <bpmn:task id="manual" name="Цикл ручного ожидания (подробно ниже)">
      <bpmn:incoming>Flow_4</bpmn:incoming>
      <bpmn:outgoing>Flow_5</bpmn:outgoing>
    </bpmn:task>
    <bpmn:endEvent id="manual_end" name="Текущий проход завершён; повтор по событию/сроку">
      <bpmn:incoming>Flow_5</bpmn:incoming>
    </bpmn:endEvent>
    <bpmn:serviceTask id="wrong_cleanup" name="Убрать из очереди и удалить комнату">
      <bpmn:incoming>Flow_2</bpmn:incoming>
      <bpmn:outgoing>Flow_3</bpmn:outgoing>
    </bpmn:serviceTask>
    <bpmn:endEvent id="wrong_end" name="Обработка этим handler прекращена">
      <bpmn:incoming>Flow_3</bpmn:incoming>
    </bpmn:endEvent>
    <bpmn:serviceTask id="assign" name="Запросить переход в ASSIGNED через API">
      <bpmn:incoming>Flow_6</bpmn:incoming>
      <bpmn:outgoing>Flow_7</bpmn:outgoing>
    </bpmn:serviceTask>
    <bpmn:exclusiveGateway id="success" name="Переход подтверждён?">
      <bpmn:incoming>Flow_7</bpmn:incoming>
      <bpmn:outgoing>Flow_8</bpmn:outgoing>
      <bpmn:outgoing>Flow_9</bpmn:outgoing>
    </bpmn:exclusiveGateway>
    <bpmn:endEvent id="failed" name="Прекратить текущий проход без handoff">
      <bpmn:incoming>Flow_8</bpmn:incoming>
    </bpmn:endEvent>
    <bpmn:serviceTask id="handoff" name="Передать в open_st_request_assigned">
      <bpmn:incoming>Flow_9</bpmn:incoming>
      <bpmn:outgoing>Flow_10</bpmn:outgoing>
    </bpmn:serviceTask>
    <bpmn:serviceTask id="cleanup" name="Убрать из очереди; комнату сохранить">
      <bpmn:incoming>Flow_10</bpmn:incoming>
      <bpmn:outgoing>Flow_11</bpmn:outgoing>
    </bpmn:serviceTask>
    <bpmn:endEvent id="done" name="Дальше обрабатывает ASSIGNED">
      <bpmn:incoming>Flow_11</bpmn:incoming>
    </bpmn:endEvent>
    <bpmn:sequenceFlow id="Flow_0" sourceRef="received" targetRef="status" name="" />
    <bpmn:sequenceFlow id="Flow_1" sourceRef="status" targetRef="auto" name="Да" />
    <bpmn:sequenceFlow id="Flow_2" sourceRef="status" targetRef="wrong_cleanup" name="Нет" />
    <bpmn:sequenceFlow id="Flow_3" sourceRef="wrong_cleanup" targetRef="wrong_end" name="" />
    <bpmn:sequenceFlow id="Flow_4" sourceRef="auto" targetRef="manual" name="Нет" />
    <bpmn:sequenceFlow id="Flow_5" sourceRef="manual" targetRef="manual_end" name="" />
    <bpmn:sequenceFlow id="Flow_6" sourceRef="auto" targetRef="assign" name="Да" />
    <bpmn:sequenceFlow id="Flow_7" sourceRef="assign" targetRef="success" name="" />
    <bpmn:sequenceFlow id="Flow_8" sourceRef="success" targetRef="failed" name="Нет" />
    <bpmn:sequenceFlow id="Flow_9" sourceRef="success" targetRef="handoff" name="Да" />
    <bpmn:sequenceFlow id="Flow_10" sourceRef="handoff" targetRef="cleanup" name="" />
    <bpmn:sequenceFlow id="Flow_11" sourceRef="cleanup" targetRef="done" name="" />
  </bpmn:process>
  <bpmn:collaboration id="Collaboration_open_st_request_new_routing">
    <bpmn:participant id="Pool_open_st_request_new_routing" name="Маршрутизация встроенного open_st_request_new" processRef="Process_open_st_request_new_routing" />
  </bpmn:collaboration>
  <bpmndi:BPMNDiagram id="Diagram_open_st_request_new_routing">
    <bpmndi:BPMNPlane id="Plane_open_st_request_new_routing" bpmnElement="Collaboration_open_st_request_new_routing">
      <bpmndi:BPMNShape id="DI_Pool_open_st_request_new_routing" bpmnElement="Pool_open_st_request_new_routing" isHorizontal="true">
        <dc:Bounds x="0" y="0" width="1420" height="560" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="DI_Lane_handler" bpmnElement="Lane_handler" isHorizontal="true">
        <dc:Bounds x="30" y="0" width="1390" height="560" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="DI_received" bpmnElement="received">
        <dc:Bounds x="142.0" y="82.0" width="36" height="36" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="DI_status" bpmnElement="status">
        <dc:Bounds x="335.0" y="75.0" width="50" height="50" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="DI_auto" bpmnElement="auto">
        <dc:Bounds x="555.0" y="75.0" width="50" height="50" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="DI_manual" bpmnElement="manual">
        <dc:Bounds x="745.0" y="65.0" width="150" height="70" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="DI_manual_end" bpmnElement="manual_end">
        <dc:Bounds x="1022.0" y="82.0" width="36" height="36" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="DI_wrong_cleanup" bpmnElement="wrong_cleanup">
        <dc:Bounds x="285.0" y="245.0" width="150" height="70" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="DI_wrong_end" bpmnElement="wrong_end">
        <dc:Bounds x="342.0" y="402.0" width="36" height="36" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="DI_assign" bpmnElement="assign">
        <dc:Bounds x="505.0" y="245.0" width="150" height="70" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="DI_success" bpmnElement="success">
        <dc:Bounds x="795.0" y="255.0" width="50" height="50" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="DI_failed" bpmnElement="failed">
        <dc:Bounds x="1022.0" y="262.0" width="36" height="36" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="DI_handoff" bpmnElement="handoff">
        <dc:Bounds x="745.0" y="425.0" width="150" height="70" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="DI_cleanup" bpmnElement="cleanup">
        <dc:Bounds x="965.0" y="425.0" width="150" height="70" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="DI_done" bpmnElement="done">
        <dc:Bounds x="1242.0" y="442.0" width="36" height="36" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNEdge id="DI_Flow_0" bpmnElement="Flow_0">
        <di:waypoint x="178.0" y="100.0" />
        <di:waypoint x="335.0" y="100.0" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="DI_Flow_1" bpmnElement="Flow_1">
        <di:waypoint x="385.0" y="100.0" />
        <di:waypoint x="555.0" y="100.0" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="DI_Flow_2" bpmnElement="Flow_2">
        <di:waypoint x="360.0" y="125.0" />
        <di:waypoint x="360.0" y="245.0" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="DI_Flow_3" bpmnElement="Flow_3">
        <di:waypoint x="360.0" y="315.0" />
        <di:waypoint x="360.0" y="402.0" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="DI_Flow_4" bpmnElement="Flow_4">
        <di:waypoint x="605.0" y="100.0" />
        <di:waypoint x="745.0" y="100.0" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="DI_Flow_5" bpmnElement="Flow_5">
        <di:waypoint x="895.0" y="100.0" />
        <di:waypoint x="1022.0" y="100.0" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="DI_Flow_6" bpmnElement="Flow_6">
        <di:waypoint x="580.0" y="125.0" />
        <di:waypoint x="580.0" y="245.0" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="DI_Flow_7" bpmnElement="Flow_7">
        <di:waypoint x="655.0" y="280.0" />
        <di:waypoint x="795.0" y="280.0" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="DI_Flow_8" bpmnElement="Flow_8">
        <di:waypoint x="845.0" y="280.0" />
        <di:waypoint x="1022.0" y="280.0" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="DI_Flow_9" bpmnElement="Flow_9">
        <di:waypoint x="820.0" y="305.0" />
        <di:waypoint x="820.0" y="425.0" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="DI_Flow_10" bpmnElement="Flow_10">
        <di:waypoint x="895.0" y="460.0" />
        <di:waypoint x="965.0" y="460.0" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="DI_Flow_11" bpmnElement="Flow_11">
        <di:waypoint x="1115.0" y="460.0" />
        <di:waypoint x="1242.0" y="460.0" />
      </bpmndi:BPMNEdge>
    </bpmndi:BPMNPlane>
  </bpmndi:BPMNDiagram>
</bpmn:definitions>

При неподтверждённом переходе обработчик возвращает None и не делает handoff. При успешном переходе он вызывает send_to_handler и удаляет Ticket из своей локальной очереди с delete_room=False. End events обозначают окончание текущего прохода/обработки этим handler, а не безусловное завершение всей заявки.

Назначение и границы ручного ожидания

Процесс начинается, когда Ticket уже передан обработчику open_st_request_new. Он показывает, как обработчик проверяет свой рабочий статус, фиксирует причину ожидания и передаёт повторную проверку планировщику. Две дорожки обозначают программные компоненты: обработчик и планировщик его очереди. Действия заявителя или сотрудника сюда не включены: из значения support_assignment нельзя вывести полный сценарий ручного согласования.

BPMN используется для описания. Просмотр схемы в Wiki не запускает обработчик и не создаёт таймер. В XML установлен isExecutable=false; scheduled_recheck_at — условное обозначение вычисленного срока, а не имя настройки установки.

Подробный цикл ручного ожидания (BPMN)

Схема BPMN

Загрузка схемы…

Исходник схемы
<?xml version="1.0" encoding="UTF-8"?>
<bpmn:definitions xmlns:bpmn="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:dc="http://www.omg.org/spec/DD/20100524/DC" xmlns:di="http://www.omg.org/spec/DD/20100524/DI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" id="Definitions_open_st_request_new" targetNamespace="urn:sharix:knowledge:processes">
  <bpmn:process id="Process_open_st_request_new" name="Ожидание заявки: open_st_request_new" isExecutable="false">
    <bpmn:documentation>{"notes": ["Схема описывает указанный обработчик ожидания; действия сотрудника вне этого workspace не выводятся из имени waiting_reason.", "Таймер — ожидание элемента очереди, а не блокирующий sleep обработчика. Новое внешнее событие снимает defer досрочно. Срок берётся из действующей настройки; числовое значение не предполагается. scheduled_recheck_at — символическое обозначение рассчитанного срока. После перезапуска локальная очередь восстанавливается из backend."], "sources": [{"commit": "624709bdbc9756e5c507ba318e987a12f1710a37", "path": "generated_handler_blocks/open_st_request_new.json", "repository": "sharix-open-handlers-examples", "sha256": "f58eda1b10a41713efecc12cd49105da30368c1e8d278b6fb74411c3be38f6ea"}, {"commit": "b13d7f455b44968785bfda5b8488b1d5adff0f5f", "path": "core/blockly_runtime.py", "repository": "sharix-open-handlers-backend", "sha256": "3e222150cbff315077c6c9b160d46e59856cedf6d6591d213e958c63cb2f2428"}]}</bpmn:documentation>
    <bpmn:laneSet id="Lanes_open_st_request_new">
      <bpmn:lane id="Lane_handler" name="Обработчик open_st_request_new">
        <bpmn:flowNodeRef>received</bpmn:flowNodeRef>
        <bpmn:flowNodeRef>status</bpmn:flowNodeRef>
        <bpmn:flowNodeRef>reason</bpmn:flowNodeRef>
        <bpmn:flowNodeRef>defer</bpmn:flowNodeRef>
        <bpmn:flowNodeRef>remove</bpmn:flowNodeRef>
        <bpmn:flowNodeRef>removed</bpmn:flowNodeRef>
      </bpmn:lane>
      <bpmn:lane id="Lane_queue" name="Планировщик очереди (handlers_backend)">
        <bpmn:flowNodeRef>waiting</bpmn:flowNodeRef>
        <bpmn:flowNodeRef>due</bpmn:flowNodeRef>
        <bpmn:flowNodeRef>changed</bpmn:flowNodeRef>
      </bpmn:lane>
    </bpmn:laneSet>
    <bpmn:startEvent id="received" name="Ticket передан обработчику">
      <bpmn:outgoing>Flow_0</bpmn:outgoing>
    </bpmn:startEvent>
    <bpmn:exclusiveGateway id="status" name="Статус NEW?">
      <bpmn:incoming>Flow_0</bpmn:incoming>
      <bpmn:incoming>Flow_8</bpmn:incoming>
      <bpmn:incoming>Flow_9</bpmn:incoming>
      <bpmn:outgoing>Flow_1</bpmn:outgoing>
      <bpmn:outgoing>Flow_3</bpmn:outgoing>
    </bpmn:exclusiveGateway>
    <bpmn:serviceTask id="reason" name="Указать причину ожидания">
      <bpmn:documentation>waiting_reason=support_assignment</bpmn:documentation>
      <bpmn:incoming>Flow_1</bpmn:incoming>
      <bpmn:outgoing>Flow_2</bpmn:outgoing>
    </bpmn:serviceTask>
    <bpmn:serviceTask id="defer" name="Запланировать повторную проверку">
      <bpmn:documentation>Настройка: ST_REQUEST_NEW_RECHECK_SECONDS</bpmn:documentation>
      <bpmn:incoming>Flow_2</bpmn:incoming>
      <bpmn:outgoing>Flow_5</bpmn:outgoing>
    </bpmn:serviceTask>
    <bpmn:serviceTask id="remove" name="Убрать Ticket из очереди и удалить комнату">
      <bpmn:incoming>Flow_3</bpmn:incoming>
      <bpmn:outgoing>Flow_4</bpmn:outgoing>
    </bpmn:serviceTask>
    <bpmn:endEvent id="removed" name="Обработка прекращена">
      <bpmn:incoming>Flow_4</bpmn:incoming>
    </bpmn:endEvent>
    <bpmn:eventBasedGateway id="waiting" name="Ожидать событие">
      <bpmn:incoming>Flow_5</bpmn:incoming>
      <bpmn:outgoing>Flow_6</bpmn:outgoing>
      <bpmn:outgoing>Flow_7</bpmn:outgoing>
    </bpmn:eventBasedGateway>
    <bpmn:intermediateCatchEvent id="due" name="Срок повторной проверки">
      <bpmn:documentation>Настройка: ST_REQUEST_NEW_RECHECK_SECONDS</bpmn:documentation>
      <bpmn:incoming>Flow_6</bpmn:incoming>
      <bpmn:outgoing>Flow_8</bpmn:outgoing>
      <bpmn:timerEventDefinition>
        <bpmn:timeDate xsi:type="bpmn:tFormalExpression">scheduled_recheck_at</bpmn:timeDate>
      </bpmn:timerEventDefinition>
    </bpmn:intermediateCatchEvent>
    <bpmn:intermediateCatchEvent id="changed" name="Новое внешнее событие Ticket">
      <bpmn:incoming>Flow_7</bpmn:incoming>
      <bpmn:outgoing>Flow_9</bpmn:outgoing>
      <bpmn:messageEventDefinition />
    </bpmn:intermediateCatchEvent>
    <bpmn:sequenceFlow id="Flow_0" sourceRef="received" targetRef="status" name="" />
    <bpmn:sequenceFlow id="Flow_1" sourceRef="status" targetRef="reason" name="Да" />
    <bpmn:sequenceFlow id="Flow_2" sourceRef="reason" targetRef="defer" name="" />
    <bpmn:sequenceFlow id="Flow_3" sourceRef="status" targetRef="remove" name="Нет" />
    <bpmn:sequenceFlow id="Flow_4" sourceRef="remove" targetRef="removed" name="" />
    <bpmn:sequenceFlow id="Flow_5" sourceRef="defer" targetRef="waiting" name="" />
    <bpmn:sequenceFlow id="Flow_6" sourceRef="waiting" targetRef="due" name="" />
    <bpmn:sequenceFlow id="Flow_7" sourceRef="waiting" targetRef="changed" name="" />
    <bpmn:sequenceFlow id="Flow_8" sourceRef="due" targetRef="status" name="Вернуть в готовую очередь" />
    <bpmn:sequenceFlow id="Flow_9" sourceRef="changed" targetRef="status" name="Разбудить досрочно" />
  </bpmn:process>
  <bpmn:collaboration id="Collaboration_open_st_request_new">
    <bpmn:participant id="Pool_open_st_request_new" name="Ожидание заявки: open_st_request_new" processRef="Process_open_st_request_new" />
  </bpmn:collaboration>
  <bpmndi:BPMNDiagram id="Diagram_open_st_request_new">
    <bpmndi:BPMNPlane id="Plane_open_st_request_new" bpmnElement="Collaboration_open_st_request_new">
      <bpmndi:BPMNShape id="DI_Pool_open_st_request_new" bpmnElement="Pool_open_st_request_new" isHorizontal="true">
        <dc:Bounds x="0" y="0" width="1190" height="550" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="DI_Lane_handler" bpmnElement="Lane_handler" isHorizontal="true">
        <dc:Bounds x="30" y="0" width="1160" height="275.0" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="DI_Lane_queue" bpmnElement="Lane_queue" isHorizontal="true">
        <dc:Bounds x="30" y="275.0" width="1160" height="275.0" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="DI_received" bpmnElement="received">
        <dc:Bounds x="152.0" y="82.0" width="36" height="36" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="DI_status" bpmnElement="status">
        <dc:Bounds x="345.0" y="75.0" width="50" height="50" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="DI_reason" bpmnElement="reason">
        <dc:Bounds x="495.0" y="65.0" width="150" height="70" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="DI_defer" bpmnElement="defer">
        <dc:Bounds x="715.0" y="65.0" width="150" height="70" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="DI_remove" bpmnElement="remove">
        <dc:Bounds x="495.0" y="185.0" width="150" height="70" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="DI_removed" bpmnElement="removed">
        <dc:Bounds x="692.0" y="202.0" width="36" height="36" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="DI_waiting" bpmnElement="waiting">
        <dc:Bounds x="765.0" y="335.0" width="50" height="50" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="DI_due" bpmnElement="due">
        <dc:Bounds x="1012.0" y="312.0" width="36" height="36" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="DI_changed" bpmnElement="changed">
        <dc:Bounds x="1012.0" y="432.0" width="36" height="36" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNEdge id="DI_Flow_0" bpmnElement="Flow_0">
        <di:waypoint x="188.0" y="100.0" />
        <di:waypoint x="345.0" y="100.0" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="DI_Flow_1" bpmnElement="Flow_1">
        <di:waypoint x="395.0" y="100.0" />
        <di:waypoint x="495.0" y="100.0" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="DI_Flow_2" bpmnElement="Flow_2">
        <di:waypoint x="645.0" y="100.0" />
        <di:waypoint x="715.0" y="100.0" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="DI_Flow_3" bpmnElement="Flow_3">
        <di:waypoint x="395.0" y="100.0" />
        <di:waypoint x="445.0" y="100.0" />
        <di:waypoint x="445.0" y="220.0" />
        <di:waypoint x="495.0" y="220.0" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="DI_Flow_4" bpmnElement="Flow_4">
        <di:waypoint x="645.0" y="220.0" />
        <di:waypoint x="692.0" y="220.0" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="DI_Flow_5" bpmnElement="Flow_5">
        <di:waypoint x="790.0" y="135.0" />
        <di:waypoint x="790.0" y="335.0" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="DI_Flow_6" bpmnElement="Flow_6">
        <di:waypoint x="815.0" y="360.0" />
        <di:waypoint x="913.5" y="360.0" />
        <di:waypoint x="913.5" y="330.0" />
        <di:waypoint x="1012.0" y="330.0" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="DI_Flow_7" bpmnElement="Flow_7">
        <di:waypoint x="815.0" y="360.0" />
        <di:waypoint x="913.5" y="360.0" />
        <di:waypoint x="913.5" y="450.0" />
        <di:waypoint x="1012.0" y="450.0" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="DI_Flow_8" bpmnElement="Flow_8">
        <di:waypoint x="1048.0" y="330.0" />
        <di:waypoint x="1150" y="330" />
        <di:waypoint x="1150" y="40" />
        <di:waypoint x="370" y="40" />
        <di:waypoint x="370.0" y="75.0" />
        <bpmndi:BPMNLabel>
          <dc:Bounds x="800" y="14" width="180" height="26" />
        </bpmndi:BPMNLabel>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="DI_Flow_9" bpmnElement="Flow_9">
        <di:waypoint x="1048.0" y="450.0" />
        <di:waypoint x="1200" y="450" />
        <di:waypoint x="1200" y="10" />
        <di:waypoint x="370" y="10" />
        <di:waypoint x="370.0" y="75.0" />
        <bpmndi:BPMNLabel>
          <dc:Bounds x="800" y="-16" width="180" height="26" />
        </bpmndi:BPMNLabel>
      </bpmndi:BPMNEdge>
    </bpmndi:BPMNPlane>
  </bpmndi:BPMNDiagram>
</bpmn:definitions>

Как проходит ожидание

  1. Обработчик получает Ticket и проверяет соответствие статусу NEW, указанному в его workspace.
  2. Если статус соответствует и STREQ_AUTOACCEPT отключён, обработчик записывает локальную причину ожидания support_assignment и назначает повторную проверку через ST_REQUEST_NEW_RECHECK_SECONDS. Число секунд берётся из действующей конфигурации handlers; по одной схеме его определить нельзя. Реализация требует положительное целое значение, минимум одна секунда.
  3. Текущий проход обработчика завершается. Отложенный Ticket не занимает рабочий поток ожиданием; очередь может обрабатывать другие готовые элементы.
  4. При наступлении срока планировщик снимает отсрочку и возвращает Ticket в готовую очередь. Следующий проход снова проверяет статус. Истечение таймера означает готовность к запуску, а не гарантию запуска в ту же секунду: учитываются доступные workers и готовность XMPP.
  5. Распознанное внешнее событие может сделать Ticket готовым раньше срока. Например, request_ticket_ready снимает локальную отсрочку и будит планировщик. События обновления Ticket обрабатываются с получением актуального состояния из backend. После пробуждения заново проверяется статус, решение прежнего прохода не считается вечным.
  6. Если Ticket дошёл до проверки обработчика уже с другим статусом, ветка ELSE убирает его из локальной очереди и запрашивает удаление комнаты уведомлений. Это прекращение обработки данным обработчиком; оно не означает удаления самого Ticket из backend или завершения всей заявки.

Дополнительные пути runtime

Схема показывает основной цикл одного Ticket. Периодическая сверка очереди с backend также может обновить снимок, снять отсрочку либо исключить Ticket, который больше не входит в область данного обработчика. Поэтому не каждое изменение статуса обязательно дойдёт до ветки ELSE на картинке: runtime может убрать элемент раньше при сверке или событии удаления.

Отсрочка и причина ожидания хранятся в памяти процесса. После перезапуска прежний срок таймера не восстанавливается как сохранённое бизнес-обязательство: очередь загружает актуальные Ticket из backend и оценивает их заново. Не следует использовать этот локальный механизм как доказательство долговечного SLA-таймера или как журнал решений сотрудника.

Ошибки загрузки из backend, повторные события, остановка процесса и исчерпание попыток относятся к общему runtime и не развёрнуты в отдельные ветки этой компактной схемы. Отказ API при сверке не доказывает исчезновения Ticket: runtime сохраняет локальный снимок и пишет диагностику. Эти пути нужно учитывать при поиске неисправности.

Что проверять при диагностике

  • Соответствует ли Ticket типу и рабочему статусу обработчика; не был ли он исключён из очереди после актуальной сверки backend.
  • Какое значение ST_REQUEST_NEW_RECHECK_SECONDS действительно настроено у запущенного экземпляра handlers.
  • Есть ли причина ожидания и локальный срок defer; получал ли планировщик событие, снимающее отсрочку раньше срока.
  • Есть ли свободный worker и готово ли XMPP-соединение. Готовность Ticket и фактический запуск — разные моменты.
  • Не перезапускался ли процесс: локальные признаки предыдущего ожидания после этого нельзя считать сохранёнными.
  • Соответствуют ли установленные workspace и runtime версиям ниже. Схема подтверждает изученный код, но сама по себе не подтверждает состав конкретной работающей установки.

Проверенные источники

В workspace проверены ветки PROCESS/DO/ELSE и параметры ожидания. В runtime проверены start_handler, promote_due_deferred, request_ticket_ready, defer_ticket_for_setting, defer_ticket_for_seconds, set_waiting_reason и обработка событий/сверки. Git-источники обновлены перед публикацией; актуальные вершины совпали с указанными версиями.

Связанные материалы

sharixopen/knowledge/scenarios/st_request_waiting.1793200154.txt.gz · Последнее изменение: — sx_knowledge_api_open

© 2022 ShariX