Обработка недублированных сообщений
Если установлено, что сообщение не является дубликатом ранее полученного, тогда оно обрабатывается. Процедура обработки включает в себя:
o | проверку того, что сервер готов для обработки, если это не так, генерируется переходная ошибка; | |
o | проверку, не находится ли транзакция в режиме ошибки или неаннулирована; | |
o | контроль корректности входного сообщения, который предусматривает: | |
- проверку глубины ошибки сообщения; | ||
- проверку ошибок блочного уровня; | ||
- проверку любых инкапсулированных данных | ||
o | проверку ошибок в последовательности полученных блоков; | |
o | генерацию компонентов ошибки для любых обнаруженных ошибок; | |
o | если никаких серьезных или переходных ошибок не выявлено, производится обработка сообщения и, если требуется, генерация отклика отправителю входного сообщения. |
Этот подход к обработке дублированных входных сообщений означает, что если получены два совершенно идентичных сообщения, будут посланы два идентичнх отклика. Это применимо также к информационным запросам и транзакциям Ping, когда в действительности состояние транзакции или возможность обработки сервером может измениться. Если требуется текущее состояние транзакции или сервера, тогда используется транзакция с новым значением ID-атрибута компонента MsgId.
Процесс обработки входного сообщения должен проверить, свободна ли остальная система. Если сервер слишком занят, он должен выдать компонент Error с атрибутом Severity равным Transient Error и кодом ошибки равным SystemBusy, после чего вернуть отправителю входное сообщение, запрашивая тем самым повторную присылку этого сообщения спустя некоторое время.
Некоторые серверы могут оказаться перегруженными из-за неожиданного всплеска загрузки. Данный подход позволяет преодолевать ситуации с кратковременными пиковыми нагрузками, запрашивая отправителя переслать сообщение несколько позже.
Проверка того, что транзакция не зафиксировала ошибку и не оказалась аннулированной. Предполагается следующий контроль:
o | предыдущие посланные или полученные сообщения не содержат серьезных (Hard) ошибок; |
o | транзакция не была анулирована покупателем или торговой ролью сервера. |
Если это имеет место, сообщение игнорируется.
Транзакция с серьезной ошибкой или аннулированная транзакция не может быть перезапущена. Если с транзакцией все в порядке, производится поиск ошибок на уровне сообщения. Это включает в себя:
- проверку формат XML;
- проверку того, что все элементы, атрибуты и содержимое блока ссылок транзакции не содержат ошибок и соответствуют спецификации IOTP;
- проверку цифровой подписи, которая в свою очередь предполагает:
- проверку того, что корректно вычислена электронная подпись; | |
- проверку того, что значение дайджеста вычислено правильно. |
о | проверку в пределах каждого блока (помимо блока ссылок транзакции) того что: | |
- атрибуты, элементы и содержимое элементов корректно; | ||
- значения атрибутов, элементы и содержимого элементов не противоречат друг другу в пределах блока. | ||
о | проверку того, что комбинации блоков корректны | |
o | проверку того, что значения атрибутов, элементы и содержимое элементов взаимосогласованы на межблочном уровне в пределах входного сообщения с блоками, полученными или отправленными ранее. Это включает проверку уместности данного блока для этого типа транзакции. |