在使用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;
}
}
}