目前我有一个使用 fork/join 机制来创建并行流的子流程。以免假设有两个流:A, B。每个流都将复杂对象CONTEXT作为输入变量。此外,每个流程都会进行一些计算并更新内部的CONTEXT。作为输出,每个流都返回更新的CONTEXT。这里的问题是在加入点,CONTEXT 的最后一个结果覆盖了前一个。让我们假设流程A填充首先以结果CONTEXT_1完成,流程B将返回CONTEXT_2。所以最终结果将是CONTEXT_2并且流A 的所有更改都将丢失。
更新: 根据我的观察,从 SuperProcess 到 SubProcess 的传递变量 (CONTEXT) 被复制 (CONTEXT'),并且在 subProcess 完成后,传递变量 (CONTEXT') 的新值将取代原始 (CONTEXT)。
在下面的示例中,我的意思是所有传递的变量都具有相同的名称。
例子:
SubProcess P2 (Variable: CONTEXT' ) 创建两个并行流(Tasks)A , B(变量通过副本传递);
一个任务(变量:CONTEXT_1)更新变量的值,完成执行并返回变量;
3.1. CONTEXT_1代替了变量CONTEXT',因此P2只能看到这个新值,因为该变量的名称相同;
同时B任务(变量: …
我们正在尝试在新项目中使用Activiti.我已经创建了一个使用Hibernate通过JPA的设置,用于持久化参与该过程的实体,JPA与Activiti互连,因此我们可以将这些实体用作JPA变量.请参阅:Activiti文档的JPA章节
我发现Activiti不允许我在涉及JPA变量的进程上创建查询,我想在JPA实体字段上进行过滤.例如,如果我的进程具有引用Book实体的变量,则无法为具有特定标题的书籍的进程创建查询.
克服这个问题的最佳方法是什么?我虽然单独使用Hibernate查询实体,然后在Activiti上进行第二次查询以获得所涉及的过程但是我担心它会很慢.另外,如果我正在反过来(首先查询进程然后在实体上使用Hibernate进行第二次查询)Activiti做了不必要的JPA变量填充,我无法找到如何只获取实体ID保存到我的数据库的Activiti变量表中.
我们正在使用Activiti框架构造分离的业务流程,以处理特定的消息。
BPMN有一个表示法Parallel Gateway
,它使我们能够创建“并行”执行的任务流。但是,是否有一种机制(网关)启动并行流,但是一旦并行流之一完成,该机制就会杀死其他流?
例如:
StartEvent -> ParallelGateway (fork) -> {FlowA, FlowB, FlowC} -> ParallelGateway (join) -> EndEvent
Run Code Online (Sandbox Code Playgroud)
如果FlowB
首先完成,则加入网关一定不要等待其他对象完成,将它们停止(这样就不必执行到最后)并继续进行下一个流程(在示例中为EndEvent)。
有什么想法要实现吗?
编辑
找到了这个线程,但是不幸的是,该解决方案并没有阻止其他流程。
我有一个关于 Activiti/Camunda 中用户任务的计时器边界事件的特殊问题:
启动流程时,我使用流程变量设置计时器持续时间,并使用边界定义中的表达式来解析变量。边界事件是在用户任务上定义的。
<bpmn2:timerEventDefinition id="_TimerEventDefinition_11">
<bpmn2:timeDuration xsi:type="bpmn2:tFormalExpression">${hurry}</bpmn2:timeDuration>
</bpmn2:timerEventDefinition>
Run Code Online (Sandbox Code Playgroud)
在某些情况下,当计时器已经在运行时,可能会出现截止日期 (dueDate),因为受让人请求了更多时间。为此,我想更改定义截止日期的流程变量的值。
碰巧的是,该变量已经在流程开始时解析并设置为边界事件。
变量的任何进一步更改都不会影响边界计时器的 DueDate,因为它存储在数据库中,并且不会在变量值更改时更新。
我知道如何通过 Java API 更新作业元素的 DueDate,但我想提供一种通用方法,例如通过更改变量的值来设置它。
延长期限的最常见用例是边界计时器已经在运行时。
任何想法如何处理这个问题?
任何提示都非常受欢迎。干杯克里斯
no processes deployed with key 'Process_MohitWorkflow'
执行时出现异常:
ProcessInstance instance =
runtimeService.startProcessInstanceByKey(workflowName, businessKey, variables);
Run Code Online (Sandbox Code Playgroud)
我的act_re_procdef
表中有此工作流程的条目
"Process_MohitWorkflow:1:14";1;" http://www.activiti.org/processdef ";"Mohit Trust";"Process_MohitWorkflow";1;"11";"MyBPMN.bpmn20.xml";"MyBPMN. Process_MohitWorkflow.png";"";FALSE;TRUE;1;"603"
我MyBPMN.bpmn20.xml
使用以下代码部署了我的文件:
public void deployProcessFile(String name, InputStream io, long tenantId) {
RepositoryService repositoryService = processEngine.getRepositoryService();
repositoryService.createDeployment()
.addInputStream(name, io)
.name(name.substring(0, name.indexOf(".")))
.enableDuplicateFiltering()
.tenantId(String.valueOf(tenantId))
.deploy();
}
Run Code Online (Sandbox Code Playgroud)
堆栈跟踪:
Caused by: org.activiti.engine.ActivitiObjectNotFoundException: no processes deployed with key 'Process_MohitWorkflow'
at org.activiti.engine.impl.persistence.deploy.DeploymentManager.findDeployedLatestProcessDefinitionByKey(DeploymentManager.java:125)
at org.activiti.engine.impl.cmd.StartProcessInstanceCmd.execute(StartProcessInstanceCmd.java:79)
at org.activiti.engine.impl.cmd.StartProcessInstanceCmd.execute(StartProcessInstanceCmd.java:37)
at org.activiti.engine.impl.interceptor.CommandInvoker.execute(CommandInvoker.java:24)
at org.activiti.engine.impl.interceptor.CommandContextInterceptor.execute(CommandContextInterceptor.java:57)
at org.activiti.engine.impl.interceptor.LogInterceptor.execute(LogInterceptor.java:31)
at org.activiti.engine.impl.cfg.CommandExecutorImpl.execute(CommandExecutorImpl.java:40)
at org.activiti.engine.impl.cfg.CommandExecutorImpl.execute(CommandExecutorImpl.java:35)
at org.activiti.engine.impl.RuntimeServiceImpl.startProcessInstanceByKey(RuntimeServiceImpl.java:81)
at com.vernuso.trust.server.service.ProcessService.startWorkFlowInstanceForEntity(ProcessService.java:265)
at com.vernuso.trust.server.service.ProcessService.startOnboardingForOrganisation(ProcessService.java:221)
at com.google.inject.persist.jpa.JpaLocalTxnInterceptor.invoke(JpaLocalTxnInterceptor.java:70) …
Run Code Online (Sandbox Code Playgroud) 例如,我有一个可以立即启动或延迟(startTime
变量)的工作流程.
在startEvent
我有一个exclusiveGateway
地方,我检查流程应该继续或等到startTime
.
<exclusiveGateway id="startGateway" default="startSequenceFlow3"/>
<sequenceFlow id="startSequenceFlow1" sourceRef="startGateway" targetRef="startTimer">
<conditionExpression xsi:type="tFormalExpression"><![CDATA[${startTime != null}]]></conditionExpression>
</sequenceFlow>
Run Code Online (Sandbox Code Playgroud)
启动传递变量的工作流startTime
可以正常工作,但不传递startTime
抛出异常:
无法解析标识符'startTime'
什么是检查是否startTime
设置的最佳方法,因为startTime != null
不起作用?我宁愿不传球startTime
(不是startTime=null
).
我使用的代码包括变量:
variables.put("startTime", startTime);
ProcessInstance instance = runtimeService.startProcessInstanceByKey(processKey, variables);
Run Code Online (Sandbox Code Playgroud)
或没有:
ProcessInstance instance = runtimeService.startProcessInstanceByKey(processKey, variables);
Run Code Online (Sandbox Code Playgroud) 作为可行性研究的一部分,我正在对 Camunda 和其他替代方案(例如 Activiti)进行比较。
如果您可以通过提供 Camunda 和 Activiti 之间的快速比较来加强我的研究,我将不胜感激,但我也想了解更多关于其他替代方案的信息。
我更喜欢一个非常简短的比较,只列出重要的功能(区分功能,比如一个人可能的而不是其他人的,许可,与其他产品的依赖关系,如 tomcat、JBoss 和操作系统等)。
activiti中setVariable和setVariableLocal方法有什么区别?以及什么时候会使用这些方法。
我正在尝试使用 javascript 演示 api 调用以获取 Json 结果。这是我所做的:
<!DOCTYPE html>
<html>
<head>
</head>
<script src="https://canvasjs.com/assets/script/jquery-1.11.1.min.js"></script>
<body>
<div class="render-form">
<script>
$(document).ready(function() {
$.ajax({
type: 'GET',
headers:{
'Accept': 'application/json',
'Content-Type': 'application/json',
'Access-Control-Allow-Origin': '*'
},
url: 'http://127.0.0.1:8080/activiti-rest/service/form/form-data?taskId=21159',
dataType: 'json',
success: function (data) {
alert(JSON.stringify(data));
}
});
})
</script>
</div>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
但是当我运行它时,我得到了一个错误:
CORS 政策已阻止在“ http://127.0.0.1:8080/activiti-rest/service/form/form-data?taskId=21159 ”处访问 XMLHttpRequest来自源“ http://localhost ”:响应预检请求未通过访问控制检查:请求的资源上不存在“Access-Control-Allow-Origin”标头。
在这里搜索了很多帖子后,我补充说:
headers:{
'Accept': 'application/json',
'Content-Type': 'application/json',
'Access-Control-Allow-Origin': '*'
},
Run Code Online (Sandbox Code Playgroud)
但它仍然无法处理该错误。我应该如何解决这个问题?
任何答复将不胜感激!
非常感谢!
在我们的项目中,我们使用 Vertx并希望使用工作流引擎处理我们的请求因为我们的请求中有不同的任务。
我经历了activiti WFE,但只找到了 spring 集成示例。
如何将其与 Vertx 集成?