1、禁用批量插入

默认情况下,引擎将在批量插入中将同一数据库表的多个插入语句组合在一起,从而提高性能。已经针对所有支持的数据库进行了测试和实施。

但是,它可能是受支持和测试过的数据库的特定版本,不允许批量插入(例如,我们在z / OS上有一个关于DB2的报告,虽然DB2一般工作),但可以在流程引擎上禁用批量插入组态:

<property name="bulkInsertEnabled" value="false" />

2、安全脚本

默认情况下,使用脚本任务时,被执行的脚本与Java委托具有相似的功能。它具有对JVM的完全访问权限,可以永久运行(由于无限循环)或耗尽大量内存。但是,Java委托需要被写入并放在jar中的classpath中,并且与流程定义有不同的生命周期。最终用户通常不会编写Java委托,因为这是开发人员的典型工作。

另一方面,脚本是流程定义的一部分,其生命周期也是一样的。脚本任务不需要jar部署的额外步骤,但是可以在部署流程定义的那一刻执行。有时脚本任务的脚本不是由开发人员编写的。但是,如上所述,这带来了问题:脚本可以完全访问JVM,并且在执行脚本时可以阻止很多系统资源。从几乎任何人都允许脚本是不是一个好主意。

为了解决这个问题,可以启用安全的脚本功能。目前,该功能仅针对JavaScript脚本执行。要启用它,请将flowable-secure-javascript依赖项
添加到您的项目中。当使用maven时:

<dependency>
<groupId>org.flowable</groupId>
<artifactId>flowable-secure-javascript</artifactId>
<version>${flowable.version}</version>
</dependency>

添加这个依赖关系将会传递Rhino的依赖 https://developer.mozilla.org/en-US/docs/Mozilla/Projects/Rhino)。犀牛是一个JDK的JavaScript引擎。它曾经被包含在JDK版本6和7中,并被Nashorn引擎所取代。然而,犀牛项目被纳入JDK后继续发展。随后添加了许多功能(包括Flowable用于实现安全脚本的功能)。在撰写本文时,Nashorn引擎没有实现安全脚本功能所需的功能。

这意味着脚本之间可能会有(通常很小的)差异(例如importPackage在Rhino上运行,但在Nashorn上必须使用load())。这些更改将类似于从JDK 7切换到8个脚本。

配置安全脚本是通过在实例化流程引擎之前传递给流程引擎配置的专用Configurator对象完成的:

SecureJavascriptConfigurator configurator = new SecureJavascriptConfigurator()
.setWhiteListedClasses(new HashSet<String>(Arrays.asList("java.util.ArrayList")))
.setMaxStackDepth(10)
.setMaxScriptExecutionTime(3000L)
.setMaxMemoryUsed(3145728L)
.setNrOfInstructionsBeforeStateCheckCallback(10);
processEngineConfig.addConfigurator(configurator);

以下设置是可能的:

  • enableClassWhiteListing:如果为true,所有类将被列入黑名单,所有想要使用的类将需要单独列入白名单。这可以严格控制暴露给脚本的内容。默认为false。
  • whiteListedClasses:一组字符串,与允许在脚本中使用的类的完全限定类名相对应。例如,要在脚本中公开执行对象,需要将org.flowable.engine.impl.persistence.entity.ExecutionEntityImpl字符串添加到此Set中。默认为空。
  • maxStackDepth:在脚本中调用函数时限制堆栈深度。这可以用来避免在递归调用脚本中定义的方法时发生堆栈溢出异常。默认情况下是-1(禁用)。
  • maxScriptExecutionTime:脚本允许运行的最长时间。默认情况下是-1(禁用)。
  • maxMemoryUsed:允许脚本允许使用的最大内存(以字节为单位)。请注意,脚本引擎本身也会占用一定数量的内存。默认情况下是-1(禁用)。
  • nrOfInstructionsBeforeStateCheckCallback:脚本的最大执行时间和内存使用量是使用脚本的每x个指令调用的回调来实现的。请注意,这些不是脚本指令,而是java字节码指令(这意味着一个脚本行可能是数百个字节的代码指令)。默认为100。

注意:该maxMemoryUsed设置只能由支持com.sun.management.ThreadMXBean#getThreadAllocatedBytes()方法的JVM使用。Oracle
JDK有这个。
ScriptExecutionListener和ScriptTaskListener还有一个安全的变体:
org.flowable.scripting.secure.listener.SecureJavascriptExecutionListener和
org.flowable.scripting.secure.listener.SecureJavascriptTaskListener。
它的用法如下:

<flowable:executionListener event="start"
class="org.flowable.scripting.secure.listener.SecureJavascriptExecutionListener">
<flowable:field name="script">
<flowable:string>
<![CDATA[
execution.setVariable('test');
]]>
</flowable:string>
</flowable:field>
<flowable:field name="language" stringValue="javascript" />
</flowable:executionListener>

上面文章来自盘古BPM研究院:http://vue.pangubpm.com/
文章翻译提交:https://github.com/qiudaoke/flowable-userguide
了解更多文章可以关注微信公众号:在这里插入图片描述

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐