Этап данных, вызывающий пользовательскую серверную процедуру в пакете заданий

#datastage

#datastage

Вопрос:

В настоящее время я хочу отправлять электронное письмо с информацией журнала внутри пакета заданий всякий раз, когда оно получает статус прервано. Мое действие с уведомлением работает нормально, но я просто хочу попытаться отправить его с помощью пакетного кода задания.
Я создал серверную процедуру в DataStage, которая будет отправлять почту на основе имени задания, переданного через пакет заданий. Ниже приведен мой код для проверки процедуры сервера.

 $INCLUDE DSINCLUDE JOBCONTROL.H
MailArg<-1> = "From: sender@gmail.com"
MailArg<-1> = "To: receiver@gmail.com"
MailArg<-1> = "Subject: Test"
MailArg<-1> = "Body: Job " : Input : " aborted."
mail = DSSendMail(MailArg)
ErrorCode = 0      ;* set this to non-zero to stop the stage/job
  

Когда я проверяю эту серверную процедуру с помощью DSRoutineChecker, электронное письмо успешно отправлено. Затем я выполняю некоторый поиск, и люди говорят, что я могу вызвать свою собственную определенную процедуру с помощью DEFFUN в пакетном коде задания.

Но у меня это не сработало. Ниже приведен код в пакете заданий.

 * Setup job_2, run it, wait for it to finish, and test for success
      hJob1 = DSAttachJob("job_2", DSJ.ERRFATAL)
      If NOT(hJob1) Then
         Call DSLogFatal("Job Attach Failed: job_2", "JobControl")
         Abort
      End
      ErrCode = DSSetDisableProjectHandler(hJob1, @FALSE)
      ErrCode = DSSetDisableJobHandler(hJob1, @FALSE)
      Call DSSetJobQueue(ErrCode, hJob1, "MediumPriorityJobs")
      ErrCode = DSRunJob(hJob1, DSJ.RUNNORMAL)
      ErrCode = DSWaitForJob(hJob1)
      Status = DSGetJobInfo(hJob1, DSJ.JOBSTATUS)
      If Status = DSJS.RUNFAILED Or Status = DSJS.CRASHED Then
         * Fatal Error - No Return
         DEFFUN test("JOB_2") CALLING "DSU.test"
         Call DSLogFatal("Job Failed: job_2", "JobControl")
      End
  

Все строки автоматически генерируются при добавлении задания job_2, за исключением строки DEFFUN в конце. Если бы я заменил код серверной процедуры на строку DEFFUN и отправил почту напрямую, это тоже сработало бы.

Но я хочу вызывать одну строку каждый раз для каждого добавленного задания, если заданий много, поэтому я использую серверную процедуру, чтобы не копировать / вставлять абзац MailArg для каждого кода задания.

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

Ответ №1:

DEFFUN — это объявление компилятора, и оно должно появляться перед любым исполняемым оператором. Это просто настройка вызывающего имени и списка аргументов для фактической функции. Например

 DEFFUN test(Arg1) Calling "DSU.test"
  

Где-то вам нужно вызвать вашу функцию «test». Например

ErrCode = test("JOB_2")

Комментарии:

1. Спасибо, это работает как заклинание. Мой побочный вопрос заключается в том, смогу ли я записать все строки Mailarg в 1 функцию прямо в верхней части пакетного кода задания? И поэтому всякий раз, когда я хочу, чтобы задание отправляло почту, мне просто нужно вызвать эту функцию с обработчиком задания в качестве параметра?

Ответ №2:

Если аргументы почты никогда не изменятся, вы можете оставить их в своей программе. В противном случае вы можете передать их все как строку с разделителями или как отдельные аргументы. Если вы перепишете test, чтобы иметь более одного аргумента, то объявление DEFFUN необходимо будет уточнить, чтобы включить правильное количество аргументов, и фактический вызов должен быть снабжен таким количеством значений для этих аргументов.