java activiti 教程_最近学习工作流 推荐一个activiti 的教程文档「建议收藏」

java activiti 教程_最近学习工作流 推荐一个activiti 的教程文档「建议收藏」异步操作activiti通过事务方式执行流程,可以根据你的需求定制。现在开始看一下activiti通常是如何处理事务的。如果触发了activiti的操作(比如,开始流程,完成任务,触发流程继续执行),activiti会推进流程,直到每个分支都进入等待状态。更抽象的说,它会流程图执行深度优先搜索,如果每个分支都遇到等待状态,就会返回。等待状态是”稍后”需要执行任务,就是说activiti会把…

大家好,又见面了,我是你们的朋友全栈君。

异步操作

activiti通过事务方式执行流程,可以根据你的需求定制。现在开始看一下activiti通常是如何处理事务的。 如果触发了activiti的操作(比如,开始流程,完成任务,触发流程继续执行), activiti会推进流程,直到每个分支都进入等待状态。更抽象的说,它会流程图执行深度优先搜索, 如果每个分支都遇到等待状态,就会返回。等待状态是”稍后”需要执行任务, 就是说activiti会把当前状态保存到数据库中,然后等待下一次触发。 触发可能来自外部,比如用户任务或接收到一个消息,也可能来自activiti本身,比如我们设置了定时器事件。 下面图片展示了这种操作:

5d7bca4cf0c63fc4960725d65a54cbb3.png

我们可以看到包含用户任务,服务任务和定时器事件的流程。完成用户任务,和校验地址是在同一个工作单元中, 所以它们的成功和失败是原子性的。意味着如果服务任务抛出异常,我们要回滚当前事务, 这样流程会退回到用户任务,用户任务就依然在数据库里。 这就是activiti默认的行为。在(1)中应用或客户端线程完成任务。这会执行服务,流程推进,直到遇到一个等待状态, 这里就是定时器(2)。然后它会返回给调用者(3),并提交事务(如果事务是由activiti开启的)。

有的时候,这不是我们想要的。有时我们需要自己控制流程中事务的边界,这样就能把业务逻辑包裹在一起。 这就需要使用异步执行了。参考下面的流程(判断):

ef749718caf4a0999ce3a477a9593ea1.png

这次我们完成了用户任务,生成一个发票,把发票发送给客户。 这次生成发票不在同一个工作单元内了,所以我们不想对用户任务进行回滚,如果生成发票出错了。 所以,我们想让activiti实现的是完成用户任务(1),提交事务,返回给调用者应用。然后在后台的线程中,异步执行生成发票。 后台线程就是activiti的job执行器(其实是一个线程池)周期对数据库的job进行扫描。 所以后面的场景,当我们到达”generate invoice”任务,我们为activiti创建一个稍后执行的job”消息”, 并把它保存到数据库。 job会被job执行器获取并执行。我们也会给本地job执行器一个提醒,告诉它有一个新job,来增加性能。

要想使用这个特性,我们要使用activiti:async=”true”扩展。例子中,服务任务看起来就是这样:

activiti:async可以使用到如下bpmn任务类型中:         task, serviceTask, scriptTask, businessRuleTask, sendTask, receiveTask, userTask, subProcess, callActivity

对于userTask,receiveTask和其他等待装填,异步执行的作用是让开始流程监听器运行在一个单独的线程/事务中。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/162654.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • armv7在哪儿看(armv7s)

    iOS中的armv7,armv7s,arm64,i386,x86_64都是什么在做静态库的时候以及引用静态库的时候经常会遇到一些关于真机模拟器不通用的情况,会报错找不到相应库导致编译失败,这里简单记录一下各种设备支持的架构。iOS测试分为模拟器测试和真机测试,处理器分为32位处理器,和64位处理器,模拟器32位处理器测试需要i386架构,(iphone5,iphone5s以下的模拟器…

  • Java的八种基本数据类型

    Java的八种基本数据类型1.byte:字节1.计算机中,数据传输大多是以“位”(bit,比特)为单位。2.一位就代表一个0或1(二进制),每8个位(bit)组成一个字节(byte),所以,1个字节=8位0101代码。2.short3.int4.long5.float6.double7.char1.char类型占2个字节(16位),用来表示字符。2.char是基本数据类型。String表示字符串,是类类型。一个String是由0~n个char组成。3.字符使用单引号表示,字符串使用双引号表示。8.boolea

  • chmod 命令用法

    chmod 命令用法指令名称:chmod使用权限:所有使用者使用方式:chmod[-cfvR][–help][–version]modefile…说明:Linux/Unix的档案调用权限分为三级:档案拥有者、群组、其他。利用chmod可以藉以控制档案如何被他人所调用。参数:mode:权限设定字串,格式如下:[ugoa…][[±=][rwxX]…][,…],其中u表示该档案的拥有者,g表示与该档案的拥有者属于同一个群体(group)者,o表示其他以外的人,a表示这

  • eclipse卸载android环境插件

    卸载eclipse-preference左侧导航栏中Android模块help-installnewsoftware–whatisalreadyinstalled?在弹出的界面选择android相关的插件卸载,重启eclipse

  • 母版页中ContentPlaceHolder 控件的作用

    母版页中ContentPlaceHolder 控件的作用文章转自http://wenku.baidu.com/link?url=7sLN0ihgZQ1XfX47b_y8qbpIVjS5T75Q1xvaoyIQ6OiKIgvzyVyRccnU9e9fqoOm4DBTxNyPPIpgGlq8n5l4cePZngx1J-va9PNFmdRn2se母版页中ContentPlaceHolder控件的作用。当母版页被一个页面引用时,页面内容…

  • oracle_loader类型外部表

    oracle_loader类型外部表1、创建目录(createanydirectory):   SQL>createuseroracleidentifiedbyoracle;用户已创建。SQL>grantdbatooracle;授权成功。SQL>grantcreateanydirectorytooracle;授权成功。SQL>connoracle/oracle

    2022年10月11日

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号