BPM 应用系统开发案例实战5

ComplexValue 类型,并通过 Variable 的构造函数创建一个 Variable 对象,其第一个参数为 BPD 中定义的变量的名称。

由前述代码可以看到,在构建 vars[3] 也就是 mailContents 的时候,做了一部分额外的处理,这里涉及到 ComplexValue 的结构。ComplexValue 是一个复杂的数据类型,它根据被反序列化的 XML 内容的结构,其层次可以是一个嵌套的很深的 N 叉树。当复杂结构的内容中出现了本身就是 XML 的情况时,也就是说数据本身是 XML 数据,比如出现 HTML 标签,则需要像上面一样做额外处理,否则标签数据会被”吞掉”,代码如下:


清单 7. HTML 标签处理代码片段

                

 

vars[3] = makeContentList(contents);

// dispose the complex value

ComplexValue cv = (ComplexValue)vars[3].getValue();

MessageElement arrayOfStr = cv.get_any()[0].getRealElement();

if(null != arrayOfString){

List<MessageElement> elementList = arrayOfStr.getChildren();

for(MessageElement strEle : stringElementList){

Text e = (Text) strEle.getChildren().get(0);

e.setValue(mailContent);

}

}


 

 

如上面所示,代码第三行先获取 Variable 对象中的 ComplexValue 对象,接下来的代码是通过调试确定你当前的 ComplexValue 对象实际存储值的位置,该位置与被反序列化的 XML 的结构内容有关,也就是说上面的代码不是通用的。最后找到真正存储值的位置将需要的值设置进去,即最后 setValue 的调用。

所有的参数设置完毕后,调用 WebAPI 将参数转入对应的流程实例,如下代码所示:


清单 8. WebAPI 将参数转入流程实例代码片段

                

 

// get process instance by its ID

ProcessInstance proIn = webAPI.getProcessInstance(instanceID);

logger.info(“Process Instance : ” + proIn.getName()+ ” start to be disposed”);

if (null != proIn) {

Task[] tasks = proIn.getTasks();

if (null != tasks && tasks.length > 0) {

// get the index task

currentTask = tasks[0];

if (!checkTaskAttribute(currentTask)) {

// just the the return result

retResult = false;

} else {

// forward the task

retResult = webAPI.completeTask(currentTask.getId(), vars);

}

}

}


 

 

上面代码第二行,通过流程实例的 ID 获取 ProcessInstance 的对象,通过 getTasks 方法拿到该流程当前可查询的所有任务,上面的代码获取了第一个 Task,即”COCE_GIW_ALL_Index”中的任务,最后调用 completeTask 方法将参数传入对应的 Task 并完成任务,将流程推到下一个活动中。

该 Servlet 对应的页面代码可查看 basic_index.jsp 及 basic_index_form.js。此时发票录入的 Web 模块创建完成。

审核模块与前述的发票录入模块类似,详细代码可查看 ApproverServlet.java、approver.jsp 及 approver_form.js。

所有 Web 功能模块定义完成后,需要定义后台程序以查询新出现的文档并启动相应的流程实例。InitServlet 和 FileLoadDaemon 即完成这样的工作,详细代码可查看 InitServlet.java 及 FileLoadDaemon.java。InitServlet 的关键代码如下:


清单 9. InitServlet.java 代码片段

                

 

// start the daemon thread

daemon=new FileLoadDaemon(properties,doctype_url_mappings,application);

Thread tDeamon = new Thread(daemon);

if (null != tDeamon) {

/* daemonT.setDaemon(true); */

tDeamon.start();

}


 

 

上述代码创建了一个 FileLoadDaemon,该实例是一个线程,当 Servlet 的 Init 方法退出时,该线程会一直循环下去,直到服务器退出。FileLoadDaemon 关键代码如下所示:


清单 10. FileLoadDaemon.java 代码片段

                

 

while (alive) {

if (null == dirPath || “”.equals(dirPath)) {

if (null != properties) {

String contextpath = properties.get(“contextPath”);

String dir = properties.get(“base_dir”);

// make dirPath from context path and base dir

dirPath = contextpath + dir;

} // if inner

} // if outer

File fileDir = new File(dirPath);

if (!dirValidation(fileDir)) {

break;

}

File[] files = fileDir.listFiles();

if (null != files && files.length > 0 && isFileModified(fileDir)) {

for (File f : files) {

if (f.isDirectory()) {

continue;

}

startProcessInstance(f.getPath());

} // for loop

} // if outer

} // while loop


 

 

该程序首先获取需要检查的服务器目录,如果目录有新文档加入,其调用 startProcessInstance 方法,该方法创建一个 StartPIThread 的实例,该实例也是一个线程,该线程将会启动一个流程实例,并将启动实例时所需的参数传入,本例中为文档的存储路径,详细代码可查看 StartPIThread.java。关键代码如下:


清单 11. StartPIThread.java 代码片段

                

 

// get Process instance

Process pro;

try {

pro = webAPI.getProcessBySystemId(appAcronym, systemID);

// launch the ProcessInstance instance

proInst = webAPI.startProcess(pro, vars);

logger.info(proInst.getName() + “has been launched”);

} catch (RemoteException e) {

e.printStackTrace();

}


 

 

首先通过 WebAPI 的 getProcessBySystemId 方法获取对应的流程定义,该方法需要两个参数,第一个为 Process App 的简短名称,即前述创建 Process App 时填写的首字母缩写,此处为”RAPSIM2″。第二个参数为该 Process 的系统 ID。获取 Process 对象之后,通过 startProcess 即可启动一个流程实例,其中第一个参数为 Process 对象,第二个参数为需要传递的参数,是一个 Variable 数组类型的数据对象。

所有模块构建完毕之后,即可运行该 BPM 应用程序。首先启动所使用的 Web 服务器。如果 IBM BPM 的服务器没有启动,需要先等待 IBM BPM 服务器启动,并通过 Authoring Environment 查看流程运行情况。此时,在控制台视图中,可以查看到如图 15 所示的信息:


图 15. 流程实例启动信息

上面的信息显示有 6 个实例被启动,ID 分别从 301 到 306. 实例启动的个数与文档的个数相同。打开 Authoring Environment 的检查器,可以看见启动的 6 个实例,如图 16 所示:


图 16. 查看流程实例

图 17. 查看流程实例当前状态

打开浏览器,在地址栏输入 http://localhost:8080/LombardiSimulation/indexer/index_list.jsp 可看到当前所有的活动实例的列表,如图 18 所示:

以下文章点击率最高

Loading…

     

如果这文章对你有帮助,请扫左上角微信支付-支付宝,给于打赏,以助博客运营

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注