Статьи

Краткое руководство: рассечение межпроцессного взаимодействия JBoss BPM

Советы и приемы (Автор статьи — автор статьи вместе с Джи Полраджем, старшим архитектором решений в Red Hat в Северной Америке)

Недельная статья «Советы и подсказки» будет посвящена JBoss BPM Suite и, в частности, вопросу о том, как общаться между двумя процессами. Прежде чем мы углубимся в детали решения, давайте сначала ограничим вариант использования, о котором мы будем говорить.

Там может быть много интерпретаций о том, что связь между двумя процессами, но мы начнем здесь с простого способа для одного процесса вызвать другой процесс. Мы также продемонстрируем это простое использование с помощью предоставленного RestAPI, который мы будем использовать для предоставления развертываемого артефакта, который вы можете использовать в качестве пользовательского обработчика работы в любом процессе BPM.

Артефакт — это класс, который мы назвали RestApi.java, он содержит настройки и детали, которые позволяют вам запускать другой процесс из существующего процесса.

Мы полностью представляем этот класс в конце этой статьи, но сначала мы подробнее рассмотрим различные движущиеся части.

В верхней части каждого класса находятся различные импортированные объекты или классы, которые будут использоваться, нас больше всего интересуют компоненты API Knowledge Is Everything (KIE), и вы найдете их в списке вместе с некоторыми объектами, представляющими нашу модель предметной области здравоохранения.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
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 работает. Обратите внимание, что идентификатор развертывания процесса, а также имя пользователя и пароль являются вымышленными, поэтому любое сходство с фактическими данными процесса является случайным.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
String deploymentId = "com.redhat.healthcare:patients:1.0";
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, предоставляя нам доступ к запуску процесса в этом развертывании.

01
02
03
04
05
06
07
08
09
10
// Get a runtime engine based on RestAPI and our deployment.
//
public RuntimeEngine getRuntimeEngine() {
   RemoteRestRuntimeEngineFactory restSessionFactory
     = new RemoteRestRuntimeEngineFactory(deploymentId, deploymentUrl, userId, password);
 
   // create REST request
   RuntimeEngine engine = restSessionFactory.newRuntimeEngine();
   return engine;
}

С помощью механизма времени выполнения мы можем теперь получать доступ и создавать наши сеансы, где мы сможем запустить наши экземпляры процессов.

Следующий метод вызывается для запуска экземпляра процесса и содержит только для ясности создание коллекции данных для отправки в наш процесс. Вам должно быть легко увидеть, что это можно абстрагировать по мере необходимости для использования переменных процесса, отображаемых в вашем классе.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
// 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 и запускал новый экземпляр процесса при каждом его вызове.

1
2
3
4
5
6
7
// Start our process by using RestAPI.
//
public static void main(String[] ar) {
 
   RestApi api = new RestApi();
   api.startProcess();
}

Мы надеемся, что этот простой обзор этого медицинского примера даст вам представление о том, как использовать предоставляемый JBoss BPM Suite RestAPI в ваших интересах. В этом случае мы используем его для связи с конкретным процессом в конкретном развертывании от любого другого процесса, развернутого на нашем BPM-сервере.

Вот класс RestApi:

001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
016
017
018
019
020
021
022
023
024
025
026
027
028
029
030
031
032
033
034
035
036
037
038
039
040
041
042
043
044
045
046
047
048
049
050
051
052
053
054
055
056
057
058
059
060
061
062
063
064
065
066
067
068
069
070
071
072
073
074
075
076
077
078
079
080
081
082
083
084
085
086
087
088
089
090
091
092
093
094
095
096
097
098
099
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
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 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 request
   RuntimeEngine 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();
}