activiti脚本任务

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

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

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

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

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

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

用例

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

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

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

第一个版本

可以在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中运行它,将会看到类似以下内容:

但是我们可以做得更好

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

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”的静态文件。

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

警告

需要注意的是:当流程引擎重新启动时,将从配置文件中重新加载配置。 因此,不添加从上方插入自定义逻辑的过程。 但是,这可以通过使用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脚本任务

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

  1. activiti脚本任务_Activiti中的安全脚本如何工作

    activiti脚本任务 最近的Activiti 5.21.0版本的突出特点之一是"安全脚本". Activiti用户指南中详细介绍了启用和使用此功能的方法 . 在这篇文章中,我将 ...

  2. Activiti中的高级脚本:自定义配置注入

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

  3. 【Groovy】Groovy 脚本调用 ( Linux 中调用 Groovy 脚本 | Windows 中调用 Groovy 脚本 )

    文章目录 前言 一.Linux 中调用 Groovy 脚本 二.Windows 中调用 Groovy 脚本 前言 在 命令行 , Groovy 脚本 , Groovy 类 , Java 类中 , 可以 ...

  4. aix shell脚本 运行java_Linux中执行shell脚本的4种方法总结

    Linux中执行shell脚本的4种方法总结,即在Linux中运行shell脚本的4种方法: 方法一:切换到shell脚本所在的目录(此时,称为工作目录)执行shell脚本: 复制代码 代码如下: c ...

  5. SpringBoot中通过@Value获取自定义配置的值

    场景 在SpringBoot项目中的application.properties中定义变量,要在 controller中获取自定义配置的值. 实现 打开 application.properties ...

  6. linux logstash启动脚本,在Linux中从bash脚本启动时Logstash shutdown停止

    我写了一个bash脚本,它在指定的文件夹中找到CSV文件,并使用正确的配置文件将它们管道到logstash中.但是,当运行此脚本时,我遇到以下错误,说关闭进程停止,导致无限循环,直到我用ctrl c手 ...

  7. linux一键安装脚本编写,Linux中自动安装脚本

    如何让你的主机自动的完成安装,自动的回答系统提出的问题,编写自动安装脚本即可实现,如下将详细解释自动脚本安装方法. systemd-config-kickstart  ##自动应答脚本制作工具 安装成 ...

  8. activiti 多租户_Activiti中具有独立数据库架构的多租户

    activiti 多租户 我们过去听到的一项功能请求是以多租户方式运行Activiti引擎,使租户的数据与其他数据隔离. 当然,在某些云/ SaaS环境中,这是必须的. 几个月前,波恩大学的学生拉斐尔 ...

  9. lua脚本php,phpStudy中起用lua脚本_PHP教程

    phpStudy集成了多种web服务的综合配置,如经典的apache+mysql.nginx+mysql等,在使用apache+mysql时,希望能够使用lua脚本,于是利用配置选项,启用lua模块, ...

最新文章

  1. 云游戏、VR、AI,云计算给元宇宙提供了哪些想象力?
  2. jstl标签: c:Foreach详解
  3. javascript 值传递与作用域
  4. Apache Storm 实时流处理系统通信机制源码分析
  5. 【数据结构与算法】之深入解析“课程表II”的求解思路与算法示例
  6. CodeForces - 1313B Different Rules(数学+思维)
  7. LoadRunner Interview Questions
  8. [WSE]如何启用WSE2.0的强大的Trace功能
  9. Error: /usr/lib/x86_64-linux-gnu/libstdc++.so.6: version `GLIBCXX_3.4.26‘ not found
  10. DLUTOJ 1033 Matrix
  11. 目标跟踪经典论文阅读(1)MOSSE
  12. 【C语言】malloc,free(),strerror函数
  13. TSL2561 GY2561 模块 MSP430 单片机 程序 STM32 程序 光强传感器 MSP430F5529
  14. mac php pear pecl,MacOSX安装pecl - 米扑博客
  15. 过程试图写入的管道不存在
  16. java具名参数_Spring框架笔记(二十五)——NamedParameterJdbcTemplate与具名参数
  17. VS2017、WPF使用报表工具RDLC完成报表,打印预览和直接打印
  18. linux备份软件rear,linux系统 备份与还原
  19. 软件行业的发展要尊重软件工程的价值规律
  20. 全面配置华为万兆交换机S6700 web网管服务:接线+IP+账号

热门文章

  1. 牛客国庆集训派对Day6
  2. 2016陕西省省赛 ACM Rui and her functions B 二分
  3. SpringCloud Greenwich(一)注册中心之nacos、Zuul和 gateway网关配置
  4. JavaFX鼠标拖拽事件
  5. 16-1 Redis分布式缓存引入与保存缓存功能实现
  6. linux下q和q 的区别,linux命令中q、wq、q!的区别
  7. 八爪鱼 是java做的吗_章鱼扫描仪:Java构建工具和恶意软件
  8. java命令模式_Java中的命令设计模式
  9. corda_使用Spring WebFlux从Corda节点流式传输数据
  10. 迈克尔 杰克逊mv_用杰克逊流式传输大型JSON文件– RxJava常见问题解答