快速指南:剖析JBoss BPM跨进程通信

技巧和窍门 (文章来宾与北美红帽公司高级解决方案架构师杰伊·保拉杰共同撰写)

几周的提示与技巧文章将深入探讨JBoss BPM Suite,特别是有关如何在两个流程之间进行通信的问题。 在进入解决方案详细信息之前,让我们首先约束将要讨论的用例。


关于两个进程之间的通信方式可能会有很多解释,但是我们将从这里开始,以一种简单的方式让一个进程调用另一个进程。 我们还将通过提供的RestAPI展示这种简单用法,我们将利用该API提供可部署的工件,您可以将其用作任何BPM流程中的自定义工作处理程序。

该工件是一个我们标记为RestApi.java的类,它包含设置和详细信息,使您可以从现有过程中启动另一个过程。

在本文结尾处,我们提供了完整的课程,但首先,我们仔细研究了各个活动部分。

每个类的顶部包括将要使用的各种导入的对象或类,我们对“知识就是一切”(KIE)API组件最感兴趣,您会在其中找到它们以及代表我们的医疗保健示例领域模型的一些对象。

package org.jboss.demo.heathcare;import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;// JBoss BPM Suite API 
import org.kie.api.runtime.KieSession;
import org.kie.api.runtime.manager.RuntimeEngine;
import org.kie.api.runtime.process.ProcessInstance;
import org.kie.services.client.api.RemoteRestRuntimeEngineFactory;// Domain model.
import com.redhat.healthcare.CaseContext;
import com.redhat.healthcare.Doctor;
import com.redhat.healthcare.PatientInfo;
import com.redhat.healthcare.Prescription;
import com.redhat.healthcare.Rxdetail;

接下来,我们将找到RestAPI类的实际开始,我们在其中设置使用API​​所需的一些属性以及一个构造函数,以确保JBoss BPM Suite服务器正在运行。 请注意,流程部署ID以及用户名和密码都是虚构的,因此与实际流程数据的任何相似之处都是偶然的。

String deploymentId = "com.redhat.healthcare:patients:1.0";
String bpmUrl = "http://localhost:8080/business-central";
String userId = "admin";
String password = "bpmsuite1!";
URL deploymentUrl;// Constructor to check for availability of BPM server.
//
public RestApi()  {super();try {this.deploymentUrl = new URL();} catch (MalformedURLException e) {e.printStackTrace();}
}

测试的URL假定是基本的默认本地安装,因此,如果您的安装使用其他设置,则需要对此进行调整。

下一个代码片段重点介绍了一种核心帮助程序方法,该方法为我们提供了对运行时引擎的引用。 这是通过RestAPI将我们绑定到特定部署com.redhat.healthcare:Patients:1.0的引擎,使我们可以启动该部署中的流程。

// Get a runtime engine based on RestAPI and our deployment.
//
public RuntimeEngine getRuntimeEngine() {RemoteRestRuntimeEngineFactory restSessionFactory = new RemoteRestRuntimeEngineFactory(deploymentId, deploymentUrl, userId, password);// create REST requestRuntimeEngine engine = restSessionFactory.newRuntimeEngine();return engine;
}

有了运行时引擎,我们现在可以访问和创建会话,然后我们就可以在其中启动流程实例。

调用以下方法来启动流程实例,并且仅出于清楚起见,该方法包含创建要提交到我们的流程中的数据集合。 您应该很容易看到可以根据需要将其抽象出来,以便将过程变量映射到您的类中。

// Setup our session, fill the data needed for process 
// instances and starting our process.
//
public void startProcess() {String taskUserId = userId;// create REST request.RuntimeEngine engine = getRuntimeEngine();KieSession ksession = engine.getKieSession();// setup data for submission to process instance.Doctor doctor = new Doctor();doctor.setAddress("3018 winter");doctor.setCity("madison");doctor.setGender("M");doctor.setGroupId("UW1001");doctor.setHospital("1001");doctor.setName("jey");doctor.setState("WI");PatientInfo pat = new PatientInfo();pat.setAge(12);pat.setName("jey");pat.setSymbtom("Diabetes Insipidus");pat.setType("Diabetes");Rxdetail rxdetail = new Rxdetail();List<rxdetail> details = new ArrayList<rxdetail>();rxdetail.setDrugName("xx");rxdetail.setOther("red");rxdetail.setQty(11);rxdetail.setRxNum(11);details.add(rxdetail);CaseContext cont = new CaseContext();cont.setApprovalReq("N");cont.setApprovalReq("Supervisor");Prescription prescription = new Prescription();prescription.setDoctor(doctor);prescription.setPatientInfo(pat);prescription.setRxdetails(details);// collect all data in our map.Map<string object=""> params = new HashMap<string object="">();params.put("prescription", prescription);params.put("caseContext", cont);// start process.ProcessInstance processInstance = ksession.startProcess("healthcare.patientCaseProcess", params);// verify process started.System.out.println("process id " + processInstance.getProcessId());System.out.println("process id " + processInstance.getId());
}

通过这种方法,我们可以设置流程所需的医生,患者和其他医疗详细信息,将它们收集到地图中,然后将其提交给流程实例以将其全部启动。

现在,我们可以将所有这些联系在一起,以便在调用此方法时运行的主类将设置我们的RestAPI,并在每次调用它时启动一个新的流程实例。

// Start our process by using RestAPI.
//
public static void main(String[] ar) {RestApi api = new RestApi();api.startProcess();
}

我们希望通过本医学示例的简单介绍可以使您了解如何利用提供的JBoss BPM Suite RestAPI来发挥自己的优势。 在这种情况下,我们将其用于与BPM服务器上部署的任何其他进程与特定部署中的特定进程进行通信。

这是RestApi类:

package org.jboss.demo.heathcare;import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;// JBoss BPM Suite API 
import org.kie.api.runtime.KieSession;
import org.kie.api.runtime.manager.RuntimeEngine;
import org.kie.api.runtime.process.ProcessInstance;
import org.kie.services.client.api.RemoteRestRuntimeEngineFactory;// Domain model.
import com.redhat.healthcare.CaseContext;
import com.redhat.healthcare.Doctor;
import com.redhat.healthcare.PatientInfo;
import com.redhat.healthcare.Prescription;
import com.redhat.healthcare.Rxdetail;String deploymentId = "com.redhat.healthcare:patients:1.0";
String bpmUrl = "http://localhost:8080/business-central";
String userId = "admin";
String password = "bpmsuite1!";
URL deploymentUrl;// Constructor to check for availability of BPM server.
//
public RestApi()  {super();try {this.deploymentUrl = new URL();} catch (MalformedURLException e) {e.printStackTrace();}
}// Get a runtime engine based on RestAPI and our deployment.
//
public RuntimeEngine getRuntimeEngine() {RemoteRestRuntimeEngineFactory restSessionFactory = new RemoteRestRuntimeEngineFactory(deploymentId, deploymentUrl, userId, password);// create REST requestRuntimeEngine engine = restSessionFactory.newRuntimeEngine();return engine;
}// Setup our session, fill the data needed for process 
// instances and starting our process.
//
public void startProcess() {String taskUserId = userId;// create REST request.RuntimeEngine engine = getRuntimeEngine();KieSession ksession = engine.getKieSession();// setup data for submission to process instance.Doctor doctor = new Doctor();doctor.setAddress("3018 winter");doctor.setCity("madison");doctor.setGender("M");doctor.setGroupId("UW1001");doctor.setHospital("1001");doctor.setName("jey");doctor.setState("WI");PatientInfo pat = new PatientInfo();pat.setAge(12);pat.setName("jey");pat.setSymbtom("Diabetes Insipidus");pat.setType("Diabetes");Rxdetail rxdetail = new Rxdetail();List<rxdetail> details = new ArrayList<rxdetail>();rxdetail.setDrugName("xx");rxdetail.setOther("red");rxdetail.setQty(11);rxdetail.setRxNum(11);details.add(rxdetail);CaseContext cont = new CaseContext();cont.setApprovalReq("N");cont.setApprovalReq("Supervisor");Prescription prescription = new Prescription();prescription.setDoctor(doctor);prescription.setPatientInfo(pat);prescription.setRxdetails(details);// collect all data in our map.Map<string object=""> params = new HashMap<string object="">();params.put("prescription", prescription);params.put("caseContext", cont);// start process.ProcessInstance processInstance = ksession.startProcess("healthcare.patientCaseProcess", params);// verify process started.System.out.println("process id " + processInstance.getProcessId());System.out.println("process id " + processInstance.getId());
}// Start our process by using RestAPI.
//
public static void main(String[] ar) {RestApi api = new RestApi();api.startProcess();
}

翻译自: https://www.javacodegeeks.com/2014/12/quick-guide-dissecting-jboss-bpm-cross-process-communication.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/361447.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用命令行工具创建WildFly OpenShift应用程序

通过使用快速入门&#xff0c;可以在OpenShift上轻松配置WildFly的新实例。 只需单击一下&#xff0c;您就可以准备就绪&#xff01; 通常&#xff0c;OpenShift的高级用户使用命令行工具 。 但是&#xff0c;您无法使用CLI工具创建WildFly墨盒。 但现在已解决错误1134134 。 …

word-break属性和css换行显示

这几天在做项目的时候&#xff0c;遇到了比较棘手的问题&#xff0c;便是在一个标签里边展示内容&#xff0c;如果说展示中文汉字&#xff0c;一点问题都没有&#xff0c;但是只要连续展示英文字母或者中文的标点符号&#xff08;中间不带空格&#xff09;&#xff0c;那么所渲…

第四种行转列

--动态处理 select A.StuName,A.BZKTypeName,cast(A.BKCODE as varbinary(MAX)) even, row_number() over (partition by StuName,BZKTypeName order by getdate()) ID into #t1 from BKLIST A --where StuName林健辉 declare sql1 varchar(max) declare sql2…

React-router的基本使用

1、安装使用 $ npm install -S react-router import { Router, Route, hashHistory } from react-router;render((<Router history{hashHistory}><Route path"/" component{App}/></Router> ), document.getElementById(app)); 1.1、版本问题 reac…

九宫格有规律高亮滚动效果

前几天朋友去面试&#xff0c;面试官要求当场用九宫格写出一个滚动有规律的大转盘滚动高亮效果&#xff0c;结果可想而知。如下图&#xff1a; 也就是说当页面刚进来的时候&#xff0c;红色方块在左上角&#xff0c;接下来按照图上所标注的箭头方向来依次循环。当我听说了这个面…

使用Maven原型高效创建Eclipse模块

Maven Archetype是一个项目模板工具包&#xff0c;可为开发人员提供生成内置或自定义脚手架工件的参数化版本的方法。 最近&#xff0c;我将其应用于我们的Xiliary P2存储库&#xff0c;以实现Eclipse模块存根创建的自动化。 由于效果很好&#xff0c;所以我认为值得在这篇文章…

framelayout

编写的mail.xml文件: <?xml version"1.0" encoding"utf-8"?><FrameLayout xmlns:android"http://schemas.android.com/apk/res/android" android:id"id/frame" android:layout_width"fill_parent" android:layou…

扩展Asterisk1.8.7的CLI接口

我之前有一篇文章&#xff08;http://www.cnblogs.com/MikeZhang/archive/2012/04/14/asteriskCLIAppTest20120414.html&#xff09;介绍过如何扩展asterisk的cli接口&#xff0c;本篇是它的继续&#xff0c;总结下&#xff0c;也方便我以后查阅。 大部分情况下&#xff0c;配置…

CSS中的 ',' 、''、'+'、'~'

1、群组选择器&#xff08;,&#xff09; /* 表示既h1&#xff0c;又h2 */ h1, h2 {color: red; } 2、后代选择器&#xff08;空格&#xff09; /* 表示 h1 下面的所有 span 元素&#xff0c;不管是否以 h1 为直接父元素 */ h1 span {} 3、子元素选择器&#xff08;>&#x…

单片机第三季-第七课:STM32中断体系

目录 1&#xff0c;NVIC 2&#xff0c;中断和事件的区别 3&#xff0c;优先级的概念 4&#xff0c;如何实际编程使用外部中断 5&#xff0c;STM32开发板通过按键控制LED 5.1&#xff0c;打开相应GPIO模块时钟 5.2&#xff0c;NVIC设置 5.3&#xff0c;外部中断线和配套…

【学亮IT手记】angularJS select2多选下拉框实例

永远保持对大部分知识的好奇心&#xff0c;学习从不枯燥&#xff0c;也没有被逼学习一说&#xff0c;乐此不疲才是该有的心态和境界&#xff01;&#xff01;&#xff01; 引入相关js库&#xff1a; html部分代码&#xff1a; angularJS定义数据源变量&#xff1a; 更多专业前端…

Devoxx Hackergarten的企业Web应用程序原型

我已经连续10年参加DevoxxBe了 。 这是我最喜欢的Java会议&#xff0c;但是谈话时间表并不总是最佳的&#xff1a;有时我想同时看2个精彩的谈话&#xff01; 因此&#xff0c;在Devoxx的Hackergarten&#xff0c;在参加讲座之间&#xff0c;我们中的一些人开始构建Web应用程序以…

谈一谈Http Request 与 Http Response

谈一谈Http Request 与 Http Response   写在前面的话&#xff1a;最近帮朋友弄弄微信商城&#xff0c;对于微信的基础开发&#xff0c;基本上就是各种post、get&#xff0c;有时是微信服务器向我们的服务器post、get数据&#xff0c;有时需要我们自己的服务器向微信服务器各…

增压的jstack:如何以100mph的速度调试服务器

使用jstack调试实时Java生产服务器的指南 jstack就像U2一样-从时间的黎明就一直在我们身边&#xff0c;我们似乎无法摆脱它 。 除了笑话&#xff0c;到目前为止&#xff0c;jstack是您调试军用生产服务器中最方便的工具之一。 即便如此&#xff0c;我仍然认为它在情况恶化时能够…

Zabbix监控多个JVM进程

一、场景说明&#xff1a; 我们这边的环境用的是微服务&#xff0c;每个程序都是有单独的进程及单独的端口号&#xff0c;但用jps查询出来的结果有些还会有重名的情况&#xff0c;所以某些脚本不太适用本场景&#xff1b; 二、需求说明&#xff1a; 需使用Zabbix-server监控每个…

Android 4.0 Launcher源码分析系列(二)

原文&#xff1a;http://mobile.51cto.com/hot-314700.htm 上一节我们研究了Launcher的整体结构&#xff0c;这一节我们看看整个Laucher的入口点&#xff0c;同时Laucher在加载了它的布局文件Laucher.xml时都干了些什么。 我们在源代码中可以找到LauncherApplication&#xff0…

使用JFace Viewer延迟获取模型元素

Eclipse JFace Viewers显示的模型元素有时需要花费大量时间来加载。 因此&#xff0c; 工作台提供了IDeferredWorkbenchAdapter类型以在后台获取此类模型元素。 不幸的是&#xff0c;似乎仅通过DeferredTreeContentManager派生的AbstractTreeViewer支持此机制。 因此&#xff…

Eclipse扩展的轻量级集成测试

最近&#xff0c;我为Eclipse扩展点评估引入了一个小助手。 辅助程序努力减少通用编程步骤的样板代码&#xff0c;同时增加开发指导和可读性。 这篇文章是希望的后续文章&#xff0c;展示了如何将实用程序与AssertJ定制断言结合使用&#xff0c;以编写针对Eclipse扩展的轻量级…

二:熟悉 TCP/IP 协议

一篇文章带你熟悉 TCP/IP 协议&#xff08;网络协议篇二&#xff09; 同样的&#xff0c;本文篇幅也比较长&#xff0c;先来一张思维导图&#xff0c;带大家过一遍。 一图看完本文 一、 计算机网络体系结构分层 计算机网络体系结构分层计算机网络体系结构分层不难看出&…

DOM操作案例之--全选与反选

全选与反选在表单类的项目中还是很常见的&#xff0c;电商项目中的购物车一定少不了这个功能。 下面我只就用一个简单的案例做个演示吧。 <div class"wrap"><table><thead><tr><th><input type"checkbox" id"j_cbA…