flowable 6.5.0在linux环境实例化异常问题
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了flowable 6.5.0在linux环境实例化异常问题相关的知识,希望对你有一定的参考价值。
参考技术A 1、oracle数据库当flowable用户存在工作流相关表的时候,ftest用户初始化失败(自动建表失败)。2、删除flowable用户,ftest初始化成功。
3、再次新建flowable用户,使用flowable用户连接,初始化失败。同时发现,yml文件中,存在flowable。database,schema属性,(解释为:In,some,situations,you,want,to,set,the,schema,to,use,for,table,checks,/,generation,if,the,database,metadata,doesn\'t,return,that,correctly。)。将其设置为flowable后,启动时抛出异常(SQLFeatureNotSupportedException),异常抛出点为setSchema。查看Druid源码,当调用setSchema会无条件抛出异常。
4、因此可以确定的是,目前遇到的工作流无法初始化,是因为同一个原因引起:数据库中,存在其他已经初始化过的用户/域。
Flowable入门系列文章18 - 部署Flowable
1、商业档案
要部署Flowable,必须将其打包到业务档案(BAR)中。业务档案是部署到Flowable引擎的单元。业务档案相当于一个ZIP文件。它可以包含BPMN 2.0进程,表单定义,DMN规则和任何其他类型的文件。通常,业务档案包含一组命名资源。
当一个业务归档部署,它会扫描与BPMN文件.bpmn20.xml或.bpmn扩展。其中每个将被处理,并可能包含多个流程定义。当DMN引擎被激活时, .dmn文件也被解析,并且在表单引擎被激活的.form情况下处理文件。
存在于业务归档中的Java类将不会被添加到类路径中。业务归档中的流程定义中使用的所有定制类(例如,Java服务任务或事件侦听器实现)必须在Flowable引擎类路径上可用,才能运行这些流程。
1.1、以编程方式进行部署
从ZIP文件部署业务档案可以这样做:
String barFileName = "path/to/process-one.bar";
ZipInputStream inputStream = new ZipInputStream(new FileInputStream(barFileName));
repositoryService.createDeployment()
.name("process-one.bar")
.addZipInputStream(inputStream)
.deploy();
也可以从单个资源构建部署。有关更多详细信息,请参阅javadocs。
2、外部资源
流程定义存在于Flowable数据库中。这些流程定义可以在Flowable配置文件中使用服务任务或执行监听器或Spring bean时引用委托类。这些类和Spring配置文件必须对所有可能执行流程定义的流程引擎都可用。
2.1、Java类
在进程实例启动时,在进程中使用的所有自定义类(例如,在服务任务或事件侦听器中使用的JavaDelegates,TaskListeners等等)应该出现在引擎的类路径中。
但是,在部署业务档案的过程中,这些类不必位于类路径中。这意味着,例如,在使用Ant部署新业务归档文件时,您的委托类不必位于类路径中。
当您使用演示设置并且想要添加自定义类时,您应该将包含您的类的JAR添加到可流动任务或可流动休息Web应用程序库中。不要忘记包含自定义类的依赖关系(如果有的话)。或者,您可以将您的依赖关系包含在Tomcat安装的库目录中${tomcat.home}/lib。
2.2、从一个进程使用Spring bean
当表达式或脚本使用Spring bean时,在执行流程定义时,这些bean必须可供引擎使用。如果您正在构建自己的Web应用程序,并且按照Spring集成部分中的描述在您的上下文中配置了流程引擎,那很简单。但是要记住,如果你使用它,你也应该更新Flowable任务并且用这个上下文来休息webapps。
2.3、创建一个应用程序
与其确保所有流程引擎在其classpath中包含所有委托类并使用正确的Spring配置,都可以考虑在自己的Web应用程序中包含Flowable REST Web应用程序,以便只有一个ProcessEngine。
3、流程定义的版本
BPMN没有版本控制的概念。这实际上是好的,因为可执行的BPMN流程文件可能作为开发项目的一部分存在于版本控制系统存储库(如Subversion,Git或Mercurial)中。但是,流程定义的版本是作为部署的一部分在引擎中创建的。在部署期间,Flowable将在将ProcessDefinition其存储在Flowable DB中之前为其分配一个版本。
对于在业务归档的每个流程定义,执行以下步骤来初始化属性key,version,name和id:
- 流程定义id的XML文件中的属性作为流程定义key属性。
- 流程定义name的XML文件中的属性作为流程定义name属性。如果没有指定name属性,则使用id属性作为名称。
- 在第一次部署具有特定密钥的进程时,版本1被分配。对于所有后续使用相同密钥的流程定义部署,版本将设置为比当前部署的最高版本高1。关键属性用于区分流程定义。
- id属性设置为{processDefinitionKey}:{processDefinitionVersion}:{generated-id},其中generated-id是添加的唯一编号,以保证集群环境中流程定义缓存的进程ID的唯一性。
以下面的过程为例
<definitions id="myDefinitions" >
<process id="myProcess" name="My important process" >
...
在部署此流程定义时,数据库中的流程定义如下所示:
ID | 键 | 名称 | 版 |
---|---|---|---|
myProcess:1:676 | myProcess | 我重要的过程 | 1 |
假设我们现在部署相同流程的更新版本(例如,更改某些用户任务),但是id流程定义的保持不变。流程定义表现在将包含以下条目:
ID | 键 | 名称 | 版 |
---|---|---|---|
myProcess:1:676 | myProcess | 我重要的过程 | 1 |
myProcess:2:870 | myProcess | 我重要的过程 | 2 |
当runtimeService.startProcessInstanceByKey(“myProcess”)被调用时,它将使用带有版本的流程定义2,因为这是流程定义的最新版本。我们是否应该创建第二个流程,如下所述,并将其部署到Flowable中,第三行将被添加到表中。
<definitions id="myNewDefinitions" >
<process id="myNewProcess" name="My important process" >
...
表格如下所示:
ID | 键 | 名称 | 版 |
---|---|---|---|
myProcess:1:676 | myProcess | 我重要的过程 | 1 |
myProcess:2:870 | myProcess | 我重要的过程 | 2 |
myNewProcess:1:1033 | myNewProcess | 我重要的过程 | 1 |
注意新流程的关键是如何不同于我们的第一个流程。即使名称是相同的(我们也可能已经改变了),Flowable只id在判别进程时考虑属性。新流程因此与版本1一起部署。
4、提供一个流程图
流程图图像可以添加到部署中。该图像将存储在Flowable存储库中,并可通过API访问。此图像也用于可视化Flowable应用程序中的过程。
假设我们的类路径org/flowable/expenseProcess.bpmn20.xml上有一个进程,它有一个进程键的开销。适用于流程图图像的以下命名约定
(按此特定顺序):
- 如果部署中存在具有与进程密钥和图像后缀连接的BPMN 2.0 XML文件名称的名称的映像资源,则使用此映像。在我们的例子中,这将是org/flowable/expenseProcess.expense.png(或.jpg / gif)。如果您在一个BPMN 2.0 XML文件中定义了多个图像,则此方法非常有用。每个图表图像将在其文件名中包含进程密钥。
- 如果不存在这样的图像,则搜索与BPMN 2.0 XML文件的名称匹配的部署中的图像资源。在我们的例子中,这将是org/flowable/expenseProcess.png。请注意,这意味着在同一个BPMN 2.0文件中定义的每个流程定义都具有相同的流程图图像。如果每个BPMN 2.0 XML文件中只有一个流程定义,这显然不是问题。
以编程方式部署时的示例:
repositoryService.createDeployment()
.name("expense-process.bar")
.addClasspathResource("org/flowable/expenseProcess.bpmn20.xml")
.addClasspathResource("org/flowable/expenseProcess.png")
.deploy();
之后可以通过API检索图像资源:
ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery()
.processDefinitionKey("expense")
.singleResult();
String diagramResourceName = processDefinition.getDiagramResourceName();
InputStream imageStream = repositoryService.getResourceAsStream(
processDefinition.getDeploymentId(), diagramResourceName);
5、生成过程图
如果在部署中没有提供图像,如前一节所述,如果流程定义包含必要的图交换信息,则Flowable引擎将生成流程图图像。资源可以以与在部署中提供图像时完全相同的方式检索。
如果出于某种原因,在部署过程中生成图表并不是必需或不可取的,则isCreateDiagramOnDeploy可以在流程引擎配置上设置该属性:
<property name="createDiagramOnDeploy" value="false" />
6、类别
部署和流程定义都具有用户定义的类别。流程定义类别使用BPMN XML中的targetNamespace属性的值进行初始化:<definitions …
targetNamespace=“yourCategory” …
部署类别也可以在API中指定,如下所示:
repositoryService
.createDeployment()
.category("yourCategory")
...
.deploy();
上面文章来自盘古BPM研究院:http://vue.pangubpm.com/
文章翻译提交:https://github.com/qiudaoke/flowable-userguide
了解更多文章可以关注微信公众号:
以上是关于flowable 6.5.0在linux环境实例化异常问题的主要内容,如果未能解决你的问题,请参考以下文章
flowable ProcessEngine和ProcessEngineConfiguration