Мониторинг и обработка сообщений MSGW в задании на IBM i-series (AS/400) из Java

Кто-нибудь знает, как можно автоматически отвечать на сообщения со статусом MSGW, которые блокируют задание на IBM i-series (AS/400)?

Я использую библиотеку jt400/jtopen для доступа к программе на AS/400 с Java. Я использую класс com.ibm.as400.access.ProgramCall, который отлично работает, если только программа не дает сбой по какой-либо причине. Как и почти в любой программе, иногда случаются сбои, но, к сожалению, в этом случае это не приводит к сообщению о состоянии или исключению. Вместо этого вызывающий поток просто зависает. Что еще хуже, любой вызов AS/400 для получения информации о задании (еще один класс в jt400, который в основном делает то, что вы ожидаете), поддерживающий очередь, также будет зависать.

Я мог бы, конечно, отслеживать поток, в котором выполняется вызов, и просто убить его после некоторого ожидания, но это крайний случай. Было бы неплохо получить сообщение об ошибке от системы.


person Confusion    schedule 14.02.2011    source источник
comment
А что, если вы хотите показать пользователю сообщение о задании в MSGW? Как вы должны реагировать на это в java-приложении?   -  person    schedule 20.02.2012
comment
Проблема в том, что вы можете не знать, в какую очередь сообщений отправилось сообщение.   -  person Thorbjørn Ravn Andersen    schedule 04.12.2012


Ответы (3)


Вы можете попробовать выполнить эту команду до вызова вашего pcml с помощью com.ibm.as400.access.CommandCall.run():

CHGJOB INQMSGRPY(*DFT)

Он устанавливает «C» в качестве ответа по умолчанию для всех сообщений.

но вы должны убедиться, что у вас есть журнал сообщений, чтобы узнать проблему, которая генерирует это сообщение

С уважением,

person John Arevalo    schedule 16.03.2011
comment
Разные сообщения имеют разные ответы по умолчанию, поэтому технически нужно посмотреть на конкретное сообщение, чтобы узнать, как на него отреагирует обработчик ошибок по умолчанию. Но обычно этот параметр завершает работу программы, когда она получает необработанную ошибку. - person Buck Calabro; 21.02.2012

Я не верю, что Java может напрямую перехватывать ошибки, возникающие на другой стороне этого API. Что я сделал, так это «закрепил» программу RPG (сторона IBM i), чтобы она отслеживала ошибки, а не позволяла обработчику ошибок по умолчанию получать их. При возникновении ошибки программа RPG корректно завершает работу и возвращает код ошибки или даже все сообщение обратно в приложение Java.

person Buck Calabro    schedule 21.02.2012

Я обнаружил, что вы можете использовать механизм тайм-аута ExecutorService для прерывания ProgramCall в MSGW.

После этого вы должны отказаться от объекта AS400, а задание сервера все еще находится в MSGW, но, по крайней мере, вы можете продолжить работу на стороне Java.

(Вам нужно использовать отдельный объект AS400, если вы хотите исследовать зависшее задание.)

person Thorbjørn Ravn Andersen    schedule 26.06.2012