首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

jbpm4学习-一个订单复核流程

2012-10-24 
jbpm4学习--一个订单审核流程在上文的基础上,开始第一个流程的编写。一、准备工作1、先想一个订单的审批流程?

jbpm4学习--一个订单审核流程

在上文的基础上,开始第一个流程的编写。

一、准备工作

1、先想一个订单的审批流程

???? 主管审核--金额判断---总经理审核

2、先浏览jbpm4自带的example,

??? 找到可以CCP(copy、cut、paste)的代码、配置文件

?? 总计有:decision、state、eventListner等

二、画流程图

?用jbpm4带的eclipse插件画

经过长时间地与这个插件作斗争,我终于屈服了,不在画图界面上输入汉字。

步骤如下:

1、先画一个流程,只输入英文。

2、切换到到source标签下,把英文改成中文。。。再保存。

3、千万别再切回design标签下并保存。

画出来的结果如下:order.jpdl.xml

<?xml version="1.0" encoding="UTF-8"?>

<process key="orderAudit" name="orderAudit" version="1" xmlns="http://jbpm.org/4.0/jpdl">
?<on event="start">
??? <event-listener name="start1">
?????? <transition name="提请主管审核" to="superAudit" g="-83,-17"/>
? </start>
?
?
?? <state g="104,25,92,52" name="superAudit">
???? <on event="start">
???? <event-listener to="moneyAutoAudit" g="-107,-17"/>
????? <transition name="主管驳回" to="cancel1" g="-65,-17"/>
?? </state>
??
?? <decision g="273,27,48,48" name="moneyAutoAudit" >
??? <on event="start">
???? <event-listener to="GMAduit" g="-65,-17"/>
????? <transition name="通过" to="end" g="-41,-17"/>
?? </decision>
??
?? <state g="255,121,92,52" name="GMAduit">
??????? <on event="start">
???? <event-listener to="end" g="428,149:-41,-17"/>
????? <transition name="GM驳回" to="cancel1" g="-65,-17"/>
?? </state>

?? <end-cancel name="cancel1" g="130,122,48,48">
???? <on event="start">
??? <event-listener name="end">
?? <on event="start">
??? <event-listener class="ex.order.LogListener">
????? <field name="msg"><string value="有一个定单批准通过"/></field>
??? </event-listener>
? </on>
? </end>
</process>

三、写java

1、在HelloJBPM的基础上改出一个OrderDemo,代码如下

package ex.order;

import java.util.HashMap;
import java.util.Map;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.hibernate.Session;
import org.jbpm.api.Configuration;
import org.jbpm.api.Execution;
import org.jbpm.api.ExecutionService;
import org.jbpm.api.HistoryService;
import org.jbpm.api.IdentityService;
import org.jbpm.api.ManagementService;
import org.jbpm.api.ProcessEngine;
import org.jbpm.api.ProcessInstance;
import org.jbpm.api.RepositoryService;
import org.jbpm.api.TaskService;

import ex.HelloJBPM4;
import ex.HibernateUtil;

public class OrderDemo {

?
?protected final Log log = LogFactory.getLog(getClass());
?? protected static ProcessEngine processEngine = null;

?? protected static RepositoryService repositoryService;
?? protected static ExecutionService executionService;
?? protected static ManagementService managementService;
?? protected static TaskService taskService;
?? protected static HistoryService historyService;
?? protected static IdentityService identityService;
?? protected String deploymentId;
?? protected synchronized void initialize() {
????? if (processEngine==null) {

??????? String jbpmTestCfgType = System.getProperty("jbpm.test.cfg.type");
??????? log.debug(jbpmTestCfgType);
??????? Configuration configuration = new Configuration(jbpmTestCfgType);

??????? String jbpmTestCfgResource = System.getProperty("jbpm.test.cfg.resource");
??????? log.debug("jbpmTestCfgResource-->"+jbpmTestCfgResource);
??????? if (jbpmTestCfgResource!=null) {
????????? configuration.setResource(jbpmTestCfgResource);
??????? }

??????? processEngine = configuration.buildProcessEngine();
???????
??????? log.debug("using ProcessEngine "+System.identityHashCode(processEngine));

??????? repositoryService = processEngine.get(RepositoryService.class);
??????? executionService = processEngine.getExecutionService();
??????? historyService = processEngine.getHistoryService();
??????? managementService = processEngine.getManagementService();
??????? taskService = processEngine.getTaskService();
??????? identityService = processEngine.getIdentityService();
????? }
?? }
?? private void doOrder(){
????? }
?? private void deploy(){
??? deploymentId = repositoryService.createDeployment()
???????? .addResourceFromClasspath("ex/order/order.jpdl.xml")
???????? .deploy();
?? }
??
?? private void doJob(){
?//?? doOrder();
?//?? if(1>0)return;
??? initialize();
??? deploy();
??? OrderUI ui=new OrderUI();
??? String answer="";
??? String orderno="003";
??? Map<String, Object> variables = new HashMap<String, Object>();
??? variables.put("orderno",orderno);
?????
???
??? ProcessInstance processInstance = executionService.startProcessInstanceByKey("orderAudit",variables);
??? log.debug("after start");
????? Execution executionSuperAudit = processInstance.findActiveExecutionIn("superAudit");
????? String executionId = executionSuperAudit.getId();
????? answer=ui.getAnswer();
????? if("yes".equals(answer))
?????? answer="主管同意";
????? else
?????? answer="主管驳回";
????? processInstance=executionService.signalExecutionById(executionId,answer);????
????? log.debug("after superAudit");
?????
?????
????????? Execution executionGMAudit = processInstance.findActiveExecutionIn("GMAduit");
????? executionId = executionGMAudit.getId();
????? answer=ui.getAnswer();
????? if("yes".equals(answer))
?????? answer="GM同意";
????? else
?????? answer="GM驳回";
????? processInstance=executionService.signalExecutionById(executionId,answer);
?????
????? repositoryService.deleteDeploymentCascade(deploymentId);
?? }
? public static void main(String arg[]){
?? OrderDemo ex=new OrderDemo();
?? ex.doJob();
??
? }

}

其实doOrder()那个方法没什么用。。。。可以去掉

四、其它一些java类

package ex.order;

import java.util.ArrayList;
import java.util.List;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.jbpm.api.listener.EventListener;
import org.jbpm.api.listener.EventListenerExecution;


public class LogListener implements EventListener {
?
?protected final Log log = LogFactory.getLog(getClass());
? private static final long serialVersionUID = 1L;
?
? // value gets injected from process definition
? String msg;
?
? public void notify(EventListenerExecution execution) {
??? List<String> logs = (List<String>) execution.getVariable("logs");
??? if (logs==null) {
????? logs = new ArrayList<String>();
????? execution.setVariable("logs", logs);
??? }
??? log.debug(msg);
??? logs.add(msg);
??
??? execution.setVariable("logs", logs);
? }
}


package ex.order;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.jbpm.api.jpdl.DecisionHandler;
import org.jbpm.api.model.OpenExecution;

public class OrderMoneyEvaluation implements DecisionHandler {
?protected final Log log = LogFactory.getLog(getClass());
?
? public String decide(OpenExecution execution) {
?? log.debug("I was called");
??
?? OrderDetail od =new OrderDetail();
?? od.setQuantity(100f);
?? od.setPrice(10.1f);
??
? log.debug("order no:-->"+ execution.getVariable("orderno"));
??? if (od.getQuantity()*od.getPrice()>1000) {
????? return "needGMAduit";
??? }
??? else
???? return "通过";
? }
}

package ex.order;

public class OrderUI {
?public String getAnswer(){
? return "yes";
?}
}

五、执行后,可以在console里,看到如下结果:

15:54:36[DEBUG]LogListener.java->notify(26)? - 有一个定单提请主管审核
2009-7-19 15:54:36 org.hibernate.event.def.DefaultDeleteEventListener deleteTransientEntity
信息: handling transient entity in delete processing
15:54:36[DEBUG]LogListener.java->notify(26)? - 等候主管审核
2009-7-19 15:54:36 org.hibernate.event.def.DefaultDeleteEventListener deleteTransientEntity
信息: handling transient entity in delete processing
15:54:36[DEBUG]OrderDemo.java->doJob(115)? - after start
15:54:36[DEBUG]LogListener.java->notify(26)? - 主管审核完毕
15:54:36[DEBUG]LogListener.java->notify(26)? - 等候金额判断
15:54:36[DEBUG]OrderMoneyEvaluation.java->decide(13)? - I was called
15:54:36[DEBUG]OrderMoneyEvaluation.java->decide(19)? - order no:-->003
2009-7-19 15:54:36 org.hibernate.event.def.DefaultDeleteEventListener deleteTransientEntity
信息: handling transient entity in delete processing
2009-7-19 15:54:36 org.hibernate.event.def.DefaultDeleteEventListener deleteTransientEntity
信息: handling transient entity in delete processing
2009-7-19 15:54:36 org.hibernate.event.def.DefaultDeleteEventListener deleteTransientEntity
信息: handling transient entity in delete processing
15:54:36[DEBUG]LogListener.java->notify(26)? - 金额判断完毕
15:54:36[DEBUG]LogListener.java->notify(26)? - 等候GM审核
15:54:36[DEBUG]OrderDemo.java->doJob(124)? - after superAudit
15:54:36[DEBUG]LogListener.java->notify(26)? - GM审核完毕
15:54:36[DEBUG]LogListener.java->notify(26)? - 有一个定单批准通过

研究一下,就可以知道,如何执行一个jbpm的流程了。

OrderUI的表示需要与用户交互,取得同意/驳回。

五、下一步工作

如何组织机构建模?

如何 订单与流程结合。

组织机构模型与流程结合。

?

热点排行