Нотификации во внешние системы
Навигация: Главная страница/Система ejudge/Использование/Нотификации во внешние системы
Поддерживается с версии 3.10.4.
Механизм нотификаций об изменении состояния посылки позволяет
избавиться от периодического опроса состояния посылки. После
выполнения запроса API:priv:submit-run или API:priv:submit-run-input
внешняя система, которая использует API ejudge для проверки задач,
должна была периодически проверять состояние отправленной посылки
с помощью запросов run-status-json
или get-submit
,
чтобы дождаться завершения проверки и отобразить результат проверки
своему пользователю. Это увеличивает время от отправки конечным пользователем
решения на проверку до получения им ответа и увеличивает нагрузку на
саму тестирующую систему ejudge.
Вместо этого при отправке в ejudge решения на проверку можно задать
информацию об очереди сообщений, в которую будут отправляться сообщения
об изменении состояния посылок. Сообщение содержит много информации
о посылке, поэтому внешней системе может не потребоваться
выполнять запросы run-status-json
или get-submit
для обновления состояния посылок на своей стороне.
Отправка на проверку
Для использования нотификаций об изменении состояния посылок в запросах API:priv:submit-run или API:priv:submit-run-input необходимо дополнительно передать три параметра:
notify_driver
— задает идентификатор драйвера очереди сообщений на стороне ejudge, который будет использоваться для отправки сообщений.notify_kind
— это тип идентификатора очереди сообщений.notify_queue
— это идентификатор очереди сообщений.
В настоящее время ejudge поддерживает redis в качестве брокера очередей
сообщений, идентификатор драйвера redis равен 1
.
Если требуется создание очереди сообщений, это должна сделать внешняя
система заблаговременно.
Для хранения идентификатора очереди сообщений в базе посылок отводится
128 бит (16 байт) во внутреннем представлении. Перевод
идентификатора очереди сообщений из строкового (внешнего)
представления во внутреннее возможен одним из 4 способов,
который задается в параметре notify_kind
.
str
- строка длиной до 16 символов включительно. В строке допускаются только символы с кодами 32-126 (десятичное), кроме символов требующих специального кодирования в форматах XML и JSON:'
,"
,\
,<
,>
,&
.u64
- 64-битное беззнаковое целое число в десятичной записи. Старшие 8 байт значения обнуляются.uuid
- 128-битное значение в формате UUIDulid
- 128-битное значение в формате ULID
Примеры (URL-encoded):
notify_driver=1¬ify_kind=str¬ify_queue=ExternalQueue notify_driver=1¬ify_kind=u64¬ify_queue=2737281 notify_driver=1¬ify_kind=uuid¬ify_queue=d9ab67dc-3398-4a62-bcac-fb2becd09cc8 notify_driver=1¬ify_kind=ulid¬ify_queue=01H448PDFDAY1ZMD3BAFSDT9FH
Сообщение об изменении статуса посылки
После отправки посылки на проверку с помощью API:priv:submit-run с указанием параметров нотификации в указанную очередь сообщений при изменении состояния посылки будут отправляться сообщения следующего вида в формате JSON:
{ "server_time_us" : SERVER-TIME-WITH-MICROSEC-PRECISION, "type" : "run", "run" : { "run_id" : RUN-ID, "run_uuid" : RUN-UUID, "contest_id" : CONTEST-ID, "serial_id" : SERIAL-ID, "status" : STATUS, "status_str" : STATUS-SHORT-STR, "status_desc" : STATUS-DESCRIPTION, "run_time" : RUN-SUBMIT-TIME-SEC, "nsec" : NSEC-PART-OF-RUN-SUBMIT-TIME, "run_time_us" : RUN-SUMBIT-TIME-WITH-MICROSEC-PRECISON, "user_id" : USER-ID, "user_login" : USER-LOGIN, "user_name" : USER-NAME, "ext_user_kind" : EXT-USER-KIND, "ext_user" : EXT-USER, "notify_driver" : NOTIFY-DRIVER, "notify_kind" : NOTIFY-KIND, "notify_queue" : NOTIFY-QUEUE, "prob_id" : PROBLEM-ID, "prob_name" : PROBLEM-SHORT-NAME, "prob_internal_name" : PROBLEM-INTERNAL-NAME, "prob_uuid" : PROBLEM-UUID, "raw_variant" : VARIANT-STORED-IN-DB, "variant" : ACTUAL-VARIANT, "lang_id" : LANGUAGE-ID, "lang_name" : LANGUAGE-NAME, "size" : SOURCE-CODE-SIZE, "ipv6_flag" : IPV6-FLAG, "ip" : IP-ADDRESS, "ssl_flag" : SSL-FLAG, "sha256" : SOURCE-CODE-SHA256, "sha1" : SOURCE-CODE-SHA1, "locale_id" : LOCALE-ID, "eoln_type" : EOLN-TYPE, "mime_type" : MIME-TYPE, "store_flags" : STORE-FLAGS, "is_imported" : IS-IMPORTED, "is_hidden" : IS-HIDDEN, "is_readonly" : IS-READONLY, "passed_mode" : PASSED-MODE, "raw_score" : SCORE-STORED-IN-DB, "raw_test" : TEST-STORED-IN-DB, "is_marked" : IS-MARKED, "score_adj" : SCORE-ADJUSTMENT, "judge_uuid" : JUDGE-UUID, "judge_id" : JUDGE-ID, "pages" : PAGES, "token_flags" : TOKEN-FLAGS, "token_count" : TOKEN-COUNT, "is_saved" : IS-SAVED, "saved_status" : SAVED-STATUS, "saved_status_str" : SAVED-STATUS-SHORT-STR, "saved_score" : SAVED-SCORE, "saved_test" : SAVED-TEST, "is_checked" : IS-CHECKED, "is_vcs" : IS-VCS, "verdict_bits" : VERDICT-BITS, "last_change_us" : LAST-CHANGE-TIME-WITH-MICROSECOND-PRECISION } }
Сообщение об изменении статуса посылки с пользовательскими данными
После отправки посылки на проверку с помощью API:priv:submit-run-input с указанием параметров нотификации в указанную очередь сообщений при изменении состояния посылки будут отправляться сообщения следующего вида в формате JSON:
{ "server_time_us" : SERVER-TIME-WITH-MICROSEC-PRECISION, "type" : "submit", "submit" : { "submit_id" : ID, "user_id" : USER-ID, "prob_id" : PROB-ID, "lang_id" : LANG-ID, "ext_user_kind" : EXT-USER-KIND, "ext_user" : EXT-USER, "notify_driver" : NOTIFY-DRIVER, "notify_kind" : NOTIFY-KIND, "notify_queue" : NOTIFY-QUEUE, "status" : STATUS, "status_str" : STATUS-SHORT-STR, "compiler_output" : COMPILER-MESSAGES, "test_checker_output" : TEST-CHECKER-MESSAGES, "time" : CPU-TIME, "real_time" : REAL-TIME, "exit_code" : PROCESS-EXIT-CODE, "term_signal" : TERMINATION-SIGNAL, "max_memory_used" : VIRT-MEM-USE, "max_rss" : MEMORY-USE, "input" : INPUT, "output" : OUTPUT-TEXT, "error" : ERROR-TEXT } }