activiti 修改定时器的执行时间

本文介绍如何在Activiti流程引擎中动态修改已启动流程实例的定时器执行时间。通过自定义实现Command接口并利用DbSqlSession执行更新操作,实现了定时器任务执行时间的灵活调整。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在使用activiti5.19过程中,有一个应用场景需要在流程实例启动后,对定时器的执行时间进行修改,但是activiti本身并没有提供现成的api进行操作,需要自己进行处理,处理思路是通过自己实现Command的接口,使用DbSqlSession,来执行update操作,具体操作如下:

1 创建一个修改定时器的命令,实现Command接口,泛型为TimerEntity,表示该命令执行对TimerEntity(对应act_ru_job表)的操作。在execute方法中,获取到DbSqlSession,继而得到具体执行的statement,通过调用sqlSession的udpate方法,执行更新。

    private final class UpdateTimerCommand implements Command<TimerEntity> {
        private final TimerEntity timerEntity;

        public UpdateTimerCommand(TimerEntity timerEntity) {
            this.timerEntity = timerEntity;
        }


        @Override
        public TimerEntity execute(CommandContext commandContext) {
            DbSqlSession dbsqlSession = commandContext.getDbSqlSession();
            String statement = dbsqlSession.getDbSqlSessionFactory()
                    .getUpdateStatement(timerEntity);
            dbsqlSession.getSqlSession().update(statement, timerEntity);
            return timerEntity;
        }
     }

2 通过runtimeService获取到命令执行器 CommandExecutor,执行定时器修改命令

     public void executeUpdate(TimerEntity timerEntity){
        RuntimeServiceImpl rsi  = (RuntimeServiceImpl)runtimeService;
        CommandExecutor commandExecutor = rsi.getCommandExecutor();
        commandExecutor.execute(new UpdateTimerCommand(timerEntity));
     }

3 设置定时器任务新的执行时间

    public void modifyDuedate(Job job,Date duedate){
       if (job != null) {
            if (job instanceof TimerEntity) {
                TimerEntity timer = (TimerEntity) job;
                timer.setDuedate(duedate);
                executeUpdate(timer);
            }
        }
    }

完整代码


import org.activiti.engine.ManagementService;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.impl.RuntimeServiceImpl;
import org.activiti.engine.impl.db.DbSqlSession;
import org.activiti.engine.impl.interceptor.Command;
import org.activiti.engine.impl.interceptor.CommandContext;
import org.activiti.engine.impl.interceptor.CommandExecutor;
import org.activiti.engine.impl.persistence.entity.TimerEntity;
import org.activiti.engine.runtime.Job;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.Date;

/**
 * Created by ct on 2016/10/23 0023.
 */
@Component
public class UpdateTimerService {

    @Autowired
    private RuntimeService runtimeService;

    public void executeUpdate(TimerEntity timerEntity){
        RuntimeServiceImpl rsi  = (RuntimeServiceImpl)runtimeService;
        CommandExecutor commandExecutor = rsi.getCommandExecutor();
        commandExecutor.execute(new UpdateTimerCommand(timerEntity));
    }


    public void modifyDuedate(Job job,Date duedate){
        if (job != null) {
            if (job instanceof TimerEntity) {
                TimerEntity timer = (TimerEntity) job;
                timer.setDuedate(duedate);
                executeUpdate(timer);
            }
        }
    }


    private final class UpdateTimerCommand implements Command<TimerEntity> {
        private final TimerEntity timerEntity;

        public UpdateTimerCommand(TimerEntity timerEntity) {
            this.timerEntity = timerEntity;
        }

        @Override
        public TimerEntity execute(CommandContext commandContext) {
            DbSqlSession dbsqlSession = commandContext.getDbSqlSession();
            String statement = dbsqlSession.getDbSqlSessionFactory()
                    .getUpdateStatement(timerEntity);
            dbsqlSession.getSqlSession().update(statement, timerEntity);
            return timerEntity;
        }
    }
}
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值