我正在使用Oracle BPMN(Fusion中间件),使用JDeveloper创建BPMN流程,并为自定义页面编写Java代码以显示正在运行的流程的流程图。遇到的问题是BPMN图在它们遇到某些触发事件(显然是异步事件点)之前不会显示/更新。因此,在许多情况下,在BPMN流程完成之前,图表甚至不会显示在查询中。请注意,我们通常没有用户输入任务,这些任务有资格作为异步事件,并且还会导致图表显示出来。
我们的团队已与Oracle讨论过它,他们的解决方案是将每个BPMN调用(主要是服务调用)包装在异步BPEL包装器中,以便BPMN调用调用服务的异步请求/响应(因此作为两个操作) 。这样做确实有效,但它为开发BPMN流程的工作增加了巨大的开销,因为每个操作都必须被包装。
所以我想知道是否还有其他人已探索或可能解决这个问题。
我们正在做的一些代码片段(仅限部分代码):
获取正在运行的实例ID:
List<Column> columns = new ArrayList<Column>();
columns.add(...); // repeated for all relevant fields
Ordering ...
Predicate ...
IInstanceQueryInput input = new IInstanceQueryInput();
List<IProcessInstance> instances = client.getInstanceQueryService().queryProcessInstances(context, columns, predicate, ordering, input);
// however, instances doesn't return the instance until the first async event, or until completion
之后,AuditProcessDiagrammer用于获取流程图,而DiagramEvents用于更新/突出显示正在进行的流程。 instanceId确实显示在Oracle融合控制面板中,因此它必须至少可用。但是尝试获取图像会导致空图像:
IProcessInstance pi = client.getInstanceQueryService().getProcessInstance(context, instance);
// HERE --> pi is null until the image is available (so the rest of this isn't run)
String compositeDn = pi.getSca().getCompositeDN();
String componentName = pi.getSca().getComponentName();
IProcessModelPackage package = client.getProcessModelService().getProcessModel(context, compositeDn, componentName);
ProcessDiagramInfo info = new ProcessDiagramInfo();
info.setModelPackage(package);
AuditProcessDiagrammer dg = new AuditProcessDiagrammer(info.getModelPackage().getProcessModel().getProcess());
List<IAuditInstance> audits = client.getInstanceQueryService().queryAuditInstanceByProcessId(context, instance);
List<IDiagramEvent> events = // function to get these
dg.highlight(events);
String base64image = dg.getImage();
请参阅此处 - &gt;部分。这就是我需要实例有效的地方。
如果有其他成功使用的好选择(设置,配置等),我很乐意听到。我真的对奇怪的解决方法不感兴趣(在BPEL包装器中已经有了)。我正在寻找一种允许BPMN流程保持简单的解决方案。感谢。