DataStage 在作业批处理中调用用户定义的服务器例程

DataStage calling user-defined server routine in job batch

目前,我想在作业批次处于中止状态时发送一封包含日志信息的邮件。我的通知 activity 工作正常,但我只想尝试通过作业批代码发送它。
我在 DataStage 中创建了一个服务器例程,它将根据通过作业批处理传递的作业名称发送邮件。 下面是我的服务器例程代码 test.

$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 段落。
在我看来,呼叫线路有问题。你们知道我该怎么做吗?

DEFFUN 是一个编译器声明,应该出现在任何可执行语句之前。它只是为实际函数设置调用名称和参数列表。例如

DEFFUN test(Arg1) Calling "DSU.test"

您需要在某处调用“测试”函数。例如

ErrCode = test("JOB_2")

如果邮件参数永远不会改变,您可以将它们保留在您的例程中。 否则,您可以将它们全部作为分隔字符串或作为单独的参数传递。如果您将测试重写为具有多个参数,则需要改进 DEFFUN 声明以包含正确数量的参数,并且必须为这些参数提供那么多值的实际调用。