我有一个Talend作业(称之为A),我希望在Oracle存储过程(未由Talend执行)完成时运行。我有一个Oracle控制表,我可以检查一下Oracle SP是否已经完成。
我想象我的Talend工作A按计划运行 - 可能每15分钟一次 - 而它要做的第一件事就是确定A是否已经执行了今天。如果它今天已经运行,它将立即停止执行。如果它今天还没有运行,它将检查Oracle SP是否已完成,如果没有,它将立即停止执行。这应该导致Talend作业A每天只执行一次,并且只在Oracle SP完成后才执行。
有更优雅的方法来实现这个目标吗?
感谢。
答案 0 :(得分:0)
正如您在评论中所述,Oracle SP有一个CronJob。 您应该创建一个Talend Job(A),它将在Oracle SP启动后不久执行。这将有一个Iterate + tOracleInput -tJavaRow + tRunJob + tJava
Iterate (i<=80 && somevalue==1 --> tOracleInput - row1 - tJava --
--IF--> row1.field.equals("true") --> tJava i = 101; --> tRunJob(JobB)
--IF--> !row1.field.equals("true") --> tJava Thread.Sleep(15*60*1000);
这样,当您执行JobB时,您将退出循环。您的Talend Job也将每天运行一次,并且每天进行一次计算。我知道它似乎有点脏,但它会起作用。
如果设置为80,那么在最坏的情况下,最终不会计算查询运行时间,最终会有20小时15分钟的81次尝试。
Thread.Sleep接受毫秒数,这就是为什么你需要乘以1000得到秒数和60得到分钟
答案 1 :(得分:0)
You can also think below options
1) export/build your talend job (A) as shell/batch file and execute it via same unix crontab job which executes your SP. You have to set dependency may be based on exit code of SP job.
OR
2) you can run your SP from talend job either using tOracleSP or even you can run your unix shell if any existing using tSystem and onSubJobOk run your talend job (A).