activiti脚本任务_Activiti中的高级脚本:自定义配置注入

activiti脚本任务

脚本任务可能是Activiti代码库中“最古老的”类之一,但是我认为它仍然未被许多人使用。 (感知到的)缺点当然是性能(解释还是编译),并且从IDE角度来看支持较少。

但是,好处(imo)超过了这一点:

  • 脚本在流程xml本身中定义。 不再担心版本控制和类路径上的库问题。
  • 过去我们看到的是,技术水平较低的人敢于尝试脚本。 但是从来没有Java。

无论如何,很少有人知道或已经意识到,您可以在Activiti中的脚本中做得非常出色,并可以提高工作效率。 由于此类脚本是在流程引擎中执行的,因此您可以访问该引擎的所有功能。 是的...一切...这使其既非常强大,又(潜在)危险(如果您不知道自己在做什么)。

让我为您讲解这样的例子。 我喜欢将其称为“自定义配置注入”概念 ,因为它有效地允许您在运行时添加自定义逻辑,从而显着改变流程的执行。 如果您的名字更酷,请告诉我。

所有代码都可以在我的Github页面上找到: https : //github.com/jbarrez/activiti-advanced-scripting

很棒的代码648x303

用例

现在我想做什么。 好吧,我想有一个流程,执行时

  • 向执行的每个用户任务添加“任务完成事件处理程序”
  • 此事件处理程序必须向远程URL触发自定义事件,在该URL上可能有事件处理器正在执行其工作

因此,基本上,我们希望每当任务完成时就将自定义事件触发到某个远程URL。 一个很好的用例是商业智能报告/复杂事件处理,例如使用Esper之类的东西。

Screen-Shot-2013-07-23-at-10.03.112

第一个版本

可以在https://github.com/jbarrez/activit-advanced-scripting/blob/master/src/test/resources/org/activiti/test/my-process.bpmn20.xml中找到该功能的第一版 。 执行此过程时,将发生以下情况:

var config = Context.getProcessEngineConfiguration();
var bpmnParser = config.getBpmnParser();

我们只需获取当前的ProcessEngineConfiguration实例。 我们将从此配置中获取BpmnParser实例,因为我们想更改整个引擎的常规用户任务解析。

接下来,我们构建脚本:

var script = "";
script = script + "importPackage(java.net);";
script = script + "importPackage(java.io);";
script = script + "var url = new URL('http://localhost:8182/echo');";
script = script + "var connection = url.openConnection();";
script = script + "connection.setRequestMethod('POST');";
script = script + "connection.setDoOutput(true);";
script = script + "var outputStream = new BufferedOutputStream(connection.getOutputStream());";
script = script + "outputStream.write(new java.lang.String(\"{'eventType':'task-complete'}\").bytes);";
script = script + "outputStream.flush();";
script = script + "connection.connect();";
script = script + "var respCode = connection.getResponseCode();";
script = script + "if (respCode != 200) ";
script = script + "println('Response code : ' + respCode);";
script = script + "outputStream.close();";
script = script + "connection.disconnect();";

显然,这不是执行此操作的最有效方法,但可以肯定地说明发生了什么。 消息'eventType:task-complete'通过标准java.net和java.io类发送到localhost:8182 url。

接下来是棘手的部分:

var handler = new ExecuteScriptOnTaskCompleteBpmnParseHandler("JavaScript");
handler.setUserTaskCompleteScript(script);
bpmnParser.getBpmnParserHandlers().addHandler(handler);// reset the deployment cache such that the new listener gets picked up on a new redeploy
config.getProcessDefinitionCache().clear();

在这里,我们将BpmnParseHandler类添加到引擎配置中。 解析处理程序会将上面定义的脚本的执行添加到引擎发出的“任务完成事件”的每次接收中。 每次对用户任务进行解析时,该解析处理程序都会启动,从而有效地将我们的“将事件发送到远程服务”添加到您的Activiti环境中现在发生的每个用户任务中!

有一个单元测试以了解其工作原理: https : //github.com/jbarrez/activiti-advanced-scripting/blob/master/src/test/java/org/activiti/test/ExecuteScriptInProcessTest.java 。 在测试中,我们设置了一个非常简单的“回显服务”,只要接收到这样的事件,它就会简单地打印出来。 如果在IDE中运行它,将会看到类似以下内容:

Screen-Shot-2013-07-23-at-09.53.00

但是我们可以做得更好

但是我们可以做得更好。 检查以下代码。

var handler = new ExecuteScriptOnTaskCompleteBpmnParseHandler("JavaScript");
handler.setUserTaskCompleteScript("http://localhost:8182/scripts/task-complete.js");
handler.setExecuteScriptInJob(true);
bpmnParser.getBpmnParserHandlers().addHandler(handler);// Update the configuration to use the correct job handler
var jobHandler = new ExecuteScriptJobHandler();
config.getJobHandlers().put(jobHandler.type,jobHandler);

该代码与上一节中的代码相同。 为每个用户任务附加一个“完成”事件的侦听器。 但是,此实现:

  • 异步执行脚本
  • 没有在流程xml中定义脚本,但是它是从远程URL获取的
  • 更新作业处理程序配置

如果您问我,那太棒了! 因此,这意味着向远程服务实际发送消息不会影响流程实例的执行性能 。 显然,从这里您可以发疯,添加持久队列和所有奇特功能。 最重要的是,总是从远程服务器获取脚本。 如果要更新执行的逻辑,只需更改返回的脚本。 这意味着您可以在不影响实际流程的情况下影响运行时的流程执行。

在https://github.com/jbarrez/activiti-advanced-scripting/blob/master/src/test/java/org/activiti/test/ExecuteScriptWithJobTest.java有一个单元测试

如果运行此测试,则会看到以下内容。 请注意,我们在测试服务器上将完成脚本托管为名为“ task-complete.js”的静态文件。

Screen-Shot-2013-07-23-at-09.50.362-1024x171

在测试中,您可以看到我们必须专门执行异步作业才能查看测试的输出。

警告

需要注意的是:当流程引擎重新启动时,将从配置文件中重新加载配置。 因此,不添加从上方插入自定义逻辑的过程。 但是,这可以通过使用ProcessEngineLifeCycleListener实现轻松完成,该实现在引擎启动后执行特定类别的流程定义。 例如,如果将所有这些进程的“ config-processes”都设为类别,则可以在启动时轻松执行它们。

结论

BPMN 2.0流程中的脚本编写是一项非常强大的功能。 它使您可以在几行之内更改整个引擎的流程执行。 当然,以上所有代码都可以使用Java完成。 但是以上示例仅使用标准BPMN 2.0和每次JDK安装中捆绑的javascript引擎。

谢谢阅读。 编码愉快!

参考: Activiti中的高级脚本: JCG合作伙伴 Joram Barrez在小脚步博客上的自定义配置注入 。

翻译自: https://www.javacodegeeks.com/2013/07/advanced-scripting-in-activiti-custom-configuration-injection.html

activiti脚本任务

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/347360.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【锁相环系列3】QPSK+基带+Costas锁相环载波同步(重点环路滤波器参数设置和迭代核心代码详解)

引言 假设在QPSK信号解调中,完成匹配滤波、定时抽样后的星座如下所示 而画出基带信号部分点的星座图如下所示 由以上两幅图可以看出,基带信号中还存在微小的频偏,导致星座图旋转,而这种微小的频偏很难通过FFT估计出来,由此想到了用锁相环解决,锁相环锁定后的星座如下 …

线性移位寄存器序列(m序列)之MATLAB实现

移位寄存器的结构 nnn级线性移位寄存器的结构如下图 当生成多项式g(x)g(x)g(x)为本原多项式时,产生的序列为m序列。例如 g(x)x5x21g(x)x^5x^21g(x)x5x21的本原多项式,初态为10000的5级m序列,其周期为25−1312^5-13125−131,结构如…

scala和java像不像_关于Java和Scala同步的五件事你不知道

scala和java像不像实际上,所有服务器应用程序都需要在多个线程之间进行某种同步。 大多数同步工作是在框架级别为我们完成的,例如通过我们的Web服务器,数据库客户端或消息传递框架。 Java和Scala提供了许多组件来编写可靠的多线程应用程序。 …

BPSK调制下(2,1,6)标准卷积码及打孔生成2/3、3/4、4/5、5/6删余码Viterbi译码误码率曲线图(MATLAB实现)

关注公号【逆向通信猿】更精彩!!! 目录 仿真结果卷积码原理图删余后性能比较常用的删余码仿真代码根据码率生成打孔参数(子函数)将标准(2, 1, 6)编码后的序列进行打孔,生成删余码(子函数)对接收到的序列进行反打孔,将原来打孔删除的比特进行补零(子函数)BPSK调制下(2,1,6…

江南大学物联网工程学院数据库课程实验三作业3vb.net实验报告

一、开发环境 语言环境:Microsoft.NET Framework 4.6 SDK IDE:Microsoft Visual Studio Community 2015 二、代码及配置 1、Form1 Public Class Form1Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.LoadEnd SubPrivate …

[2021.07.25更新]循环冗余校验(CRC)的MATLAB实现

欢迎同步关注公众号【逆向通信猿】 CRC校验(循环冗余校验) 在计算CRC校验的时候,发现一个网站如下 http://www.ip33.com/crc.html 于是,想自己动手实现该网站计算CRC校验的功能,网站提供的在线计算工具是以十六进制来表示输入参数和结果的,为了方便MATLAB实现,本文提供…

江南大学物联网工程学院数据库课程实验四作业4vb.net实验报告

一、开发环境 语言环境:Microsoft.NET Framework 4.6 SDK IDE:Microsoft Visual Studio Community 2015 二、代码 Imports System.Data.SqlClient Public Class Form1 连接本机数据库并获取test_one数据库中的sc表数据 Dim mybind As BindingManagerB…

MATLAB库函数hilbert(希尔伯特变换)的C语言实现(FFT采用FFTW库)

目录希尔伯特变换原理公式MATLAB官方帮助文档中希尔伯特变换算法常量和结构体定义C语言实现(FFTW库的float版,double版类似)希尔伯特变换原理公式 MATLAB官方帮助文档中希尔伯特变换算法 hilbert uses a four-step algorithm: Calculate the FFT of the input sequ…

netbeans7.4_NetBeans 7.4 Beta提示警告无效的异常处理

netbeans7.4有许多例子说明Java异常处理可能比首次出现时要困难得多,Josh Bloch专门将一整章的《 Effective Java》 (两个版本)专门用于异常处理。 Java中的检查异常模型 仍然 “ 有争议” 。 我很高兴看到我最近下载的NetBeans 7.4 beta有一…

在厚度仅十几微米的电池隔膜找缺陷?人工智能说,能行(人工智能应用案例)

原文链接:https://www.paddlepaddle.org.cn/support/news?actiondetail&id2104 “我们的质检要做的是在厚度仅十几微米的电池隔膜上找出所有微小缺陷,如果没有检测出来,就很可能使新能源汽车的电池在使用过程中出现问题,甚至…

准确率超90%、1秒发出报警,人工智能助国网山东实现无人巡检(人工智能应用案例)

原文链接:https://mp.weixin.qq.com/s/Jh2YLY-4um79ucdHIs5NTg 众所周知,深度学习框架是人工智能的基础技术“底座”,在各大传统产业上也有着巨大的潜力尚待挖掘。5月20日,由深度学习技术及应用国家工程实验室与百度联合主办的“…

基于PaddlePaddle实现高尔夫球场的遥感检测(人工智能应用案例)

原文链接:https://www.paddlepaddle.org.cn/support/news?actiondetail&id2103 1 . 背景及意义 随着高尔夫球运动在我国的兴起,关于高尔夫球场大量占用土地资源、污染环境、耗水量大且公益性差的争议越来越多。国家从2004年开始制定一系列相关政策…

MATLAB库函数firls(最小二乘线性相位FIR滤波器设计)的C语言实现

firls函数功能 FILS设计了一种线性相位FIR滤波器,它可以最小化理想分段线性函数与滤波器在一组期望频带上的幅值响应之间的加权积分平方误差。 b = firls(n,f,a) b = firls(n,f,a,w) b = firls(n,f,a,ftype) b = firls(n,f,a,w,ftype)f是在0和1之间的范围内指定的频率点对的…

数电实验一-初识Multisim和Basys3

特别说明:该系列内容均是本人实验记录,无盗取侵权之嫌,仅供参考,请多动手实践! 一、实验目的 详见报告 二、实验仪器设备 详见报告 三、实验设计过程 使用Multisim为Basys3板卡创建一个PLD设计并进行验证。 1.创建P…

自动化学科前沿讲座作业 基于深度学习的工厂人员监测系统设计

1 背景及应用场景 在工业复杂生产环境下,作业人员的安全问题至关重要。大多数工业企业采用人眼观察视频的方式对作业人员位置进行判断,这种方式长时间会使管理者出现疲劳问题,效率非常低下,遇到安全问题也不能进行及时的处理。采用…

多重继承java_Java中的多重继承与组合vs继承

多重继承java有时我写了几篇有关Java 继承 , 接口和组成的文章。 在这篇文章中,我们将研究多重继承,然后了解组成优于继承的好处。 Java中的多重继承 多重继承是创建具有多个超类的单个类的能力。 与其他一些流行的面向对象的编程语言&#…

数电实验二-点亮一个数码管(Multisim和Basys3 )

特别说明:该系列内容均是本人实验记录,无盗取侵权之嫌,仅供参考,请多动手实践。 一、实验目的 详见报告 二、实验环境 详见报告 三、实验内容 (1)基本要求:以Basys3四位拨码开关SW3~SW0为输入…

倍福(Beckhoff)嵌入式控制器PLC

前些天发现了十分不错的人工智能学习网站,通俗易懂,风趣幽默,没有广告,分享给大家,大家可以自行看看。(点击跳转人工智能学习资料) 摘要:与家喻户晓的西门子相比,倍福&am…

fftw-3.3.8库在linux下的的编译和配置

关注公号【逆向通信猿】更精彩!!! 运行环境 Ubuntu 14.04版本以上,64位系统 FFTW库的下载 首先在官网上下载fftw-3.3.8.tar.gz压缩包,解压。本人下载好的压缩包地址:https://download.csdn.net/download/wlwdecs_dn/12904577 FFTW库的生成 首先,将压缩包进行解压,…

Spring Security with Spring Boot 2.0:密码编码器

在上一篇文章中,我们使用了用户详细信息服务,以便提供一种基于给定用户名从函数加载数据的方法。 用户详细信息的实现可能由内存机制,sql / no-sql数据库等支持。 选项是无限的。 关于密码存储,我们必须注意的是密码哈希。 出…