Сегодня впервые столкнулся с этой проблемой. Терминал версии 9.3.3.3. Проблема выглядит серьезной, поэтому хотелось бы привлечь внимание разработчиков терминала.
Согласно документации терминала, функция sendTransaction() возвращает сообщение с текстом ошибки, если транзакция не была отправлена на сервер, иначе транзакция считается отправленной. Это создает необходимые условия для построения надежной логики обработки результатов транзакций:
1. Вызываем sendTransaction()
2. Если возникла ошибка, реагируем (например, посылаем транзакцию повторно или отказываемся от нее)
3. Если ошибки не возникло, от ждем срабатывания OnTransReply() с соответствующим значением поля trans_id, чтобы получить состояние отправленной транзакции в поле status
4. Если значение status сигнализирует об ошибке, реагируем (например, посылаем транзакцию повторно или отказываемся от нее)
5. Иначе транзакция успешно отправлена.
Скрипт, использующий эту логику, сегодня впервые дважды завис на этапе ожидания OnTransReply(), т.к. событие терминалом просто не было сгенерировано. При этом предшествующий вызов sendTransaction() прошел без ошибок и вернул пустую строку.
В обоих случаях, речь шла о транзакции для перемещения ордера (MOVE_ORDERS). Такие транзакции периодически генерируют ошибки, т.к. передвигаемый ордер может быть исполнен в момент перемещения. Однако эти ошибки возвращаются через OnTransReply() со следующими сообщениями:
- "Не найдена активная заявка для перестановки"
- "Ошибка перестановки заявок. [GW][50] "Не найдена заявка для перестановки."
Но в обоих проблемных случаях сегодня, в окне сообщений терминала я видел сообщение вида: "Вы не можете заменить заявку 1892947247341804353. Повторите попытку позже."
Таким образом, возникает ситуация, когда код не получает никакой возможности обработать ошибку (sendTransaction() выполняется успешно, OnTransReply() не приходит).
Хотел бы услышать комментарии разработчиков.
Согласно документации терминала, функция sendTransaction() возвращает сообщение с текстом ошибки, если транзакция не была отправлена на сервер, иначе транзакция считается отправленной. Это создает необходимые условия для построения надежной логики обработки результатов транзакций:
1. Вызываем sendTransaction()
2. Если возникла ошибка, реагируем (например, посылаем транзакцию повторно или отказываемся от нее)
3. Если ошибки не возникло, от ждем срабатывания OnTransReply() с соответствующим значением поля trans_id, чтобы получить состояние отправленной транзакции в поле status
4. Если значение status сигнализирует об ошибке, реагируем (например, посылаем транзакцию повторно или отказываемся от нее)
5. Иначе транзакция успешно отправлена.
Скрипт, использующий эту логику, сегодня впервые дважды завис на этапе ожидания OnTransReply(), т.к. событие терминалом просто не было сгенерировано. При этом предшествующий вызов sendTransaction() прошел без ошибок и вернул пустую строку.
В обоих случаях, речь шла о транзакции для перемещения ордера (MOVE_ORDERS). Такие транзакции периодически генерируют ошибки, т.к. передвигаемый ордер может быть исполнен в момент перемещения. Однако эти ошибки возвращаются через OnTransReply() со следующими сообщениями:
- "Не найдена активная заявка для перестановки"
- "Ошибка перестановки заявок. [GW][50] "Не найдена заявка для перестановки."
Но в обоих проблемных случаях сегодня, в окне сообщений терминала я видел сообщение вида: "Вы не можете заменить заявку 1892947247341804353. Повторите попытку позже."
Таким образом, возникает ситуация, когда код не получает никакой возможности обработать ошибку (sendTransaction() выполняется успешно, OnTransReply() не приходит).
Хотел бы услышать комментарии разработчиков.