Как я могу сохранить программу RPG в памяти? - PullRequest
3 голосов
/ 21 октября 2010

Я написал программу мониторинга в RPG, которая проверяет, работает ли факс / 400.

А теперь я хочу, чтобы эта программа проверялась каждые 15 минут.

Вместо того, чтобы помещать задание каждые 15 минут в планировщик заданий (которым было бы некрасиво управлять), я заставил программу ждать между проверками, используя DLYJOB.

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

(я думал об использовании SBMJOB, но не могу понять, в какую очередь заданий я мог бы его поместить.)

Ответы [ 3 ]

2 голосов
/ 22 октября 2010

Хорошей очередью заданий, которую можно использовать для бесконечно запущенного задания, будет QSYSNOMAX.Это позволяет выполнять неограниченное количество заданий.

Вы можете отправить задание в эту очередь в вашей программе QSTRTUP , и оно просто будет работать постоянно.

2 голосов
/ 25 января 2016

Я знаю 3 пути к этому.

1) используя очередь данных, есть параметр, который предписывает ей ждать бесконечно и через определенный промежуток времени.
2) используя OVRDBF cmd, там есть parm, чтобы сказать, что он не должен заканчиваться или EOF, заставляя ваш pgm продолжать ждать.
3) простейший в реализации, sbmjob для вызова pgm, который зацикливается навсегда, например, с DOW 1 = 1, вы можете вставить код для проверки на определенный интервал времени, прежде чем он будет повторяться Вы можете иметь свою логику внутри цикла, который проверяет факс, обрабатывает его и затем возвращается к ожиданию.

2 голосов
/ 21 октября 2010

Вот что я сделал в прошлом. Есть два подхода к этому.

  1. Отправляйте новое задание каждый раз, когда программа запускается с DLYJOB, прежде чем она запустится.
  2. Создать цикл и завершить его только при определенных условиях.

То, что я сделал с программой Monitor MSGW, было следующим:

         PGM     
         DCL        VAR(&TIME) TYPE(*CHAR) LEN(6)
         DCL        VAR(&STOPTIME) TYPE(*CHAR) LEN(6) +
                      VALUE('200000')   
         /* Setup my program (run only once) */
START:
         /* Perform my actions */

         RTVSYSVAL  SYSVAL(QTIME)  RTNVAR(&TIME)
         IF         COND(&TIME *GE &STOPTIME) THEN(GOTO CMDLBL(END))
         DLYJOB     DLY(180)
         GOTO       CMDLBL(START)
END:
         ENDPGM

Это будет работать непрерывно до 8:00 вечера. Затем я добавляю это в планировщик заданий для отправки каждое утро.

Насколько задание. Я использую QINTER, но он действительно может быть запущен где угодно. Убедитесь, что вы выбрали подсистему с достаточным количеством доступных рабочих мест, так как она займет одно.

Недостаток работы в QINTER, если программа начинает загружать 100% CPU, это израсходует весь ваш интерактивный процессор и эффективно блокирует вашу систему.

...