activiti的job设计浅析

activiti自己弄了一个job的机制,解决了集群中job的的若干问题:

  • 集群中如何保证一个job只有一个机器执行

  • job在处理过程中失败了(其他异常或server重启),这个时候如何处理这些failed job,重新跑起来

ACT_RU_JOB表结构

字段名称字段描述数据类型主键为空说明
ID_ varchar(64)
REV_ integer
TYPE_ varchar(255)
LOCK_EXP_TIME_锁定释放时间timestamp(3)
LOCK_OWNER_挂起者varchar(255)
EXCLUSIVE_ boolean
EXECUTION_ID_ varchar(64)
PROCESS_INSTANCE_ID_ varchar(64)
PROC_DEF_ID_ varchar(64)
RETRIES_ integer
EXCEPTION_STACK_ID_异常idvarchar(64)
EXCEPTION_MSG_异常信息varchar(4000)
DUEDATE_到期时间timestamp(3)
REPEAT_重复varchar(255)
HANDLER_TYPE_处理类型varchar(255)
HANDLER_CFG_ varchar(4000)
TENANT_ID_ varchar(255)

查询待处理job

SELECT RES.* FROM
ACT_RU_JOB RES
LEFT OUTER JOIN
ACT_RU_EXECUTION PI ON PI.ID_ = RES.PROCESS_INSTANCE_ID_ 
WHERE (RETRIES_ > 0)
AND (DUEDATE_ is null or DUEDATE_ <= ?)
AND (LOCK_OWNER_ is null or LOCK_EXP_TIME_ <= ?)
AND ( (RES.EXECUTION_ID_ is null) or (PI.SUSPENSION_STATE_ = 1) );

查询条件为

  • retries值>0

  • duedate为空或者duedate小于当前

  • lock_owner为空或者lock_exp_time小于当前

抢占任务

AcquireJobsCmd

protected void lockJob(CommandContext commandContext, JobEntity job, String lockOwner, int lockTimeInMillis) {    
    job.setLockOwner(lockOwner);
    GregorianCalendar gregorianCalendar = new GregorianCalendar();
    gregorianCalendar.setTime(commandContext.getProcessEngineConfiguration().getClock().getCurrentTime());
    gregorianCalendar.add(Calendar.MILLISECOND, lockTimeInMillis);
    job.setLockExpirationTime(gregorianCalendar.getTime());    
  }

设置lock_owner以及lock_exp_time
lockTimeInMillis比如5 60 1000,5分钟

job执行成功

private void removeJobs() {
    for (Job job: getJobs()) {
      ((JobEntity) job).delete();
    }
  }

从job表中删除

job执行失败

if (activity == null || activity.getFailedJobRetryTimeCycleValue() == null) {
      log.debug("activitiy or FailedJobRetryTimerCycleValue is null in job " + jobId + "'. only decrementing retries.");
      job.setRetries(job.getRetries() - 1);
      job.setLockOwner(null);
      job.setLockExpirationTime(null);
      if (job.getDuedate() == null) {
        // add wait time for failed async job
        job.setDuedate(calculateDueDate(commandContext, processEngineConfig.getAsyncFailedJobWaitTime(), null));
      } else {
        // add default wait time for failed job
        job.setDuedate(calculateDueDate(commandContext, processEngineConfig.getDefaultFailedJobWaitTime(), job.getDuedate()));
      }
      
    }
  • retries减1

  • 清空lock_owner

  • 清空lock_exp_time

  • 重新设置due_date,延时重试

/** define the default wait time for a failed async job in seconds */
  protected int asyncFailedJobWaitTime = 10;
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue3 Vite 是一个用于构建Web界面的渐进式JavaScript框架,而 Activiti 是一个流程引擎和业务流程管理(BPM)解决方案。要将 Activiti 前端设计器集成到 Vue3 Vite 中,需要进行一些步骤。 首先,需要下载并安装 Activiti 前端设计器的相关文件。可以从 Activiti 官方网站下载设计器的压缩包,然后将其解压到项目的特定目录中。 然后,在 Vue3 Vite 项目中创建一个新的组件,用于加载 Activiti 前端设计器。可以使用 Vue 的 `import` 来引入设计器的相关文件,然后在组件中使用 `import` 或者 `require` 来引入设计器的样式和脚本文件。 接下来,可以在 Vue3 Vite 项目的路由配置中添加一个新的路由,用于展示 Activiti 前端设计器的页面。可以将这个路由配置为一个独立的路由路径,比如 `/activiti-designer`。 在创建的路由页面中,可以使用设计器的接口或者组件来渲染设计器的界面。可以通过本地或者远程的方式加载设计器的配置文件,并将设计器的相关属性和方法绑定到 Vue 组件的数据和方法中。 最后,可以通过修改 Vue3 Vite 项目的打包配置,将 Activiti 前端设计器的相关文件打包到最终的项目中。可以使用 Vite 的插件或者配置项来实现这个功能。 总的来说,要将 Activiti 前端设计器集成到 Vue3 Vite 中,需要下载和解压设计器的文件,创建一个新的组件用于加载设计器,配置一个新的路由来展示设计器的界面,并通过数据绑定和方法绑定将设计器的功能集成到 Vue3 Vite 项目中。最后,调整打包配置,将设计器文件打包到最终项目中。这样就可以在 Vue3 Vite 中使用 Activiti 前端设计器来设计和管理业务流程。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值