发表于 2016-07-11 17:23
楼主
今天有位朋友提出一个需求,希望能够实现“某个时间段判断文件是否到达来触发流程,如果超过这个时间段就跳过该批次,运行下一个批次逻辑”。初步分析了一下,发现TASKCTL自带的filetwatch是一直等到文件到达后才能触发流程。这就无法满足“在某个时间段内文件到达触发流程”的需求。
其实,我们可以利用condition条件判断来实现该需求,流程模块代码如下:
<serial>
<name>MainModul_rootnode</name>
<begin>
<name>MainModul_beginjob</name>
</begin>
<!-- 用户模块代码自定义区开始 -->
<nulljob>
<name>startctljob</name>
<jobdesc>启动触发控制节点</jobdesc>
<condition>if($(startdatetime)<systime('yyyymmddhhmiss')) CTL_DOIT else CTL_WAIT</condition>
</nulljob>
<sh>
<name>checkfile</name>
<progname>$TASKCTLDIR/demo/shell/fileexist.sh</progname>
<para>$HOME/file/$(systime("yyyymmdd"))/fileexists.flg</para> --这个是文件到达的标记文件
<maxnum>0</maxnum>
<condition>if((systime('hh')>='01') and (systime('hh')<'07')) CTL_DOIT else CTL_IGN</condition>
<jobdesc>每天1~7点判断如果存在文件,则调用实际业务,不存在则发送信息。测试时可改为systime('mi')分钟</jobdesc>
</sh>
<parallel>
<name>MainModul_ParallelNode0</name>
<exe>
<name>MainModul_FlowNode0</name>
<progname>sleep</progname>
<para>30</para>
<condition>if(getjresult("checkfile")==0) CTL_DOIT else CTL_IGN</condition>
<jobdesc>延时30秒模拟实际调用业务子流程</jobdesc>
</exe>
<selfmsg>
<name>file_not_exists_msg</name>
<para>当天文件不存在,请人工干预</para>
<condition>if(getjresult("checkfile")==1) CTL_DOIT else CTL_IGN</condition>
<jobdesc>发送不存在文件的消息</jobdesc>
</selfmsg>
</parallel>
<modivarv>
<name>passflow</name>
<para>varname=startdatetime,varvalue=$(addday('$(startdatetime)', 'yyyymmddhhmiss', 1))</para>
<jobdesc>翻牌:修改变量</jobdesc>
</modivarv>
<!-- 用户模块代码自定义区结束 -->
<end>
<name>MainModul_endjob</name>
</end>
</serial>通过该示例,我们合理利用好condition条件判断,就能实现很多复杂的控制逻辑~
[最后编辑于 2016-07-11 17:24 ]
请登录后评论~