如何通过Timer将等待时间参数化

本文介绍了一种通过创建workflow变量$$Time来实现从taskA执行结束后,等待至指定时间点后再执行taskB的方法。具体步骤包括定义一个date/time类型的变量$$Time、设置assignmenttask将$$Time值设为指定时间点,并在Timertask中使用此变量。

场景:当taskA执行结束后,等待到指定时间点后(该时间点是参数化的,而非固定写死的时间点),再执行下一个taskB

解决方案:

  1) 在创建一个workflow变量,如$$Time, 它的必须类型是date/time类型

        

      2) taskA之后创建一个assignment task,将$$Time值设定为指定的时间点

          注意:指定的时间点的表达式返回值必须是date/time类型,并且格式必须是MM-DD-YYYY HH24:MI:SS

       

      3)  在Timer task里使用变量$$Time

       

  整体流程:

        taskA --> assginment --> timer --> taskB

参考链接:https://kb.informatica.com/howto/6/Pages/1/150704.aspx

Timer等待机制与任务调度密切相关。Timer只能以在延迟一段时间或在指定时间点后运行一次任务或周期性地运行任务的方式进行调度,其内部使用`Object#wait(long time)`进行任务时间调度,不过这种机制不能保证任务的实执行,只是一个粗略的近似值[^1]。 在任务计划制定方面,不同参数的`schedule`方法涉及不同的等待规则。2个参数的`schedule`在制定任务计划,如果指定的计划执行时间`scheduledExecutionTime <= systemCurrentTime`,则任务会被立即执行,且`scheduledExecutionTime`不会因为某一个任务的过度执行而改变。3个参数的`schedule`在制定反复执行一个任务的计划,每一次执行这个任务的计划执行时间随着前一次的实际执行时间而变,即`scheduledExecutionTime(第n + 1次)=realExecutionTime(第n次)+periodTime`。若第n次执行任务,由于某种原因这次执行时间过长,执行完后的`systemCurrentTime >= scheduledExecutionTime(第n + 1次)`,则此不做隔等待,立即执行第n + 1次任务,接下来的第n + 2次任务的`scheduledExecutionTime(第n + 2次)`就变为`realExecutionTime(第n + 1次)+periodTime`,该方法更注重保持间隔时间的稳定。3个参数的`scheduleAtFixedRate`在制定反复执行一个任务的计划,每一次执行这个任务的计划执行时间在最初就被定下来了,即`scheduledExecutionTime(第n次)=firstExecuteTime + n * periodTime`;若第n次执行任务,由于某种原因这次执行时间过长,执行完后的`systemCurrentTime >= scheduledExecutionTime(第n + 1次)`,则此不做`period`间隔等待,立即执行第n + 1次任务,而接下来的第n + 2次的任务的`scheduledExecutionTime(第n + 2次)`依然还是`firstExecuteTime+(n + 2)*periodTime`,此方法更注重保持执行频率的稳定[^5]。 Timer在构造函数中会启动一个单独的线程,任务完成会结束线程,或者使用`cancel`方法结束。当使用`schedule`方法执行后即开始`run`方法中的任务任务执行过程中遵循上述的等待和调度规则[^3]。 此外,需要注意的是,被执行了`cancel()`方法之后的`TimerTask`,在重新启动定器的候,必须重新实例化`TimerTask`,不然会报“`java.lang.IllegalStateException: TimerTask is scheduled already`”的错误,因为每个定任务`TimerTask`只能被放置一次[^4]。 以下是一个使用`Timer`和`TimerTask`的示例代码: ```java import java.util.Timer; import java.util.TimerTask; public class TimerExample { public static void main(String[] args) { Timer timer = new Timer(); timer.schedule(new TimerTask() { @Override public void run() { System.out.println("Task is running."); } }, 1000, 2000); } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值