#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 необходимо будет уточнить, чтобы включить правильное количество аргументов, и фактический вызов должен быть снабжен таким количеством значений для этих аргументов.