JBPM4.3+SSH環境搭建

你要用jBPM4.3,首先至少你要了解
1.UML2.0的活動圖(因爲jBPM是Activity Diagram模型)
2.Hibernate(因爲jBPM集成了Hibernate作爲引擎的持久框架)
當然最重要的是你對工作流的系統結構有初步的瞭解。

具體指引請參考 用戶手冊和開發手冊,這裏只是一些簡單補充。
一、jBPM4.3下載
sourceforge下載
http://sourceforge.net/projects/jbpm/

svn倉庫裏下載
http://anonsvn.jboss.org/repos/jbpm/jbpm4

二、搭建環境(GDP在Eclipse上的安裝)
當你無法在Eclipse安裝jBPM4.3 GDP插件,把你的[color=red]Eclipse SDK版本升級到3.42[/color]就OK了。
本人用[color=red]Myeclipse8.5[/color]

三、Myeclipse8.5安裝jbpm4插件
下載好的jBPM4.3解包,找到jbpm-4.3\install\src\gpd\jbpm-gpd-site.zip
菜單【Help】-【MyEclipse Configuration Center】-選中【Software】點擊【add site】-【Add from Archive File】選中jbpm-gpd-site.zip 點擊ok
在【Personal Sites】將裏面的接口右擊 add to profile ,再點擊右上角 Apply 7 change。自己重啓,新建就能看到jbpm的菜單,畢!

四、jBPM4.3+SSH
1.在jbpm-4.3\install\src\db\create下選擇你使用的數據庫腳本(總共有18張表)
2.使用jbpm-4.3\install\src\demo下的SQL腳本生成測試用的數據
3.[color=red]spring2.5+[/color]
4.hibernate用jbpm4.3的包,不支持ehcache。
四、主要配置文件
jbpm.hibernate.cfg.xml

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

<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

<hibernate-configuration>
<session-factory>
<mapping resource="jbpm.repository.hbm.xml" />
<mapping resource="jbpm.execution.hbm.xml" />
<mapping resource="jbpm.history.hbm.xml" />
<mapping resource="jbpm.task.hbm.xml" />
<mapping resource="jbpm.identity.hbm.xml" />
</session-factory>
</hibernate-configuration>


applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd">

<bean id="dataSource"
class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName">
<value>com.microsoft.jdbc.sqlserver.SQLServerDriver</value>
</property>
<property name="url">
<value>jdbc:microsoft:sqlserver://localhost:1433;dataBaseName=jbpm</value>
</property>
<property name="username">
<value>sa</value>
</property>
<property name="password">
<value>sa</value>
</property>
</bean>
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource">
<ref bean="dataSource" />
</property>
<property name="typeDefinitions">
<ref bean="jbpmTypes" />
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">
org.hibernate.dialect.SQLServerDialect
</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.format_sql">true</prop>
</props>
</property>
<property name="configLocations">
<list>
<value>classpath:hbm/jbpm.hibernate.cfg.xml</value> //指定你存放的路徑
</list>
</property>
</bean>

//大字符串操作
<bean id="jbpmTypes"
class="org.springframework.orm.hibernate3.TypeDefinitionBean">
<property name="typeName" value="string_max" />
<property name="typeClass"
value="org.jbpm.db.hibernate.StringMax" />
</bean>

<!-- jbpm配置 -->
<bean id="springHelper" class="org.jbpm.pvm.internal.processengine.SpringHelper" />
<bean id="processEngine" factory-bean="springHelper"
factory-method="createProcessEngine" />

<!-- 模板配置自己寫的,不是必須的 -->
<bean id="jbpmTemplate" class="com.meibiye.util.JbpmTemplate">
<property name="processEngine" ref="processEngine"></property>
</bean>

<!--
事務管理bean(平臺依賴,有jdbc/jta/jdbc等等)
-->
<bean id="transactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"></property>
</bean>
<aop:config>
<aop:advisor pointcut="execution(* com.yyaccp.jbpm.biz.*.*(..))"
advice-ref="txAdvice" />
</aop:config>

<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="delete*" />
<tx:method name="save*" />
<tx:method name="update*" />
<tx:method name="do*" />
<tx:method name="*" propagation="SUPPORTS" read-only="true" />
</tx:attributes>
</tx:advice>
</beans>


jbpm.cfg.xml --[color=red]這個文件一定要放到src目錄下[/color],不然系統找不到,開始半天沒調通就是這個問題。

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

<jbpm-configuration>

<import resource="jbpm.default.cfg.xml" />
<import resource="jbpm.tx.spring.cfg.xml" />
<import resource="jbpm.jpdl.cfg.xml" />
<import resource="jbpm.bpmn.cfg.xml" />
<import resource="jbpm.identity.cfg.xml" />
<import resource="jbpm.businesscalendar.cfg.xml" />
<import resource="jbpm.console.cfg.xml" />
<!-- <import resource="jbpm.jobexecutor.cfg.xml" /> -->

<process-engine-context>
<string name="spring.cfg" value="classpath:/config/applicationContext.xml" /> //指定自己的路徑
</process-engine-context>

</jbpm-configuration>



jbpmTemplate.java

package com.meibiye.util;

import java.util.List;
import java.util.Map;

import org.jbpm.api.Execution;
import org.jbpm.api.ExecutionService;
import org.jbpm.api.HistoryService;
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 org.jbpm.api.task.Task;

/**
* jbpm模板類(初步實現)
*
* @author Administrator
*
*/
public class JbpmTemplate {

/**
* 部署流程到數據庫
*
* @param resourceName
* 資源文件名字 比如(org/forever/jbpm/jpdl/process.jpdl.xml)
* @return 返回流程定義id(格式:key-version)
*/
public String Deploy(String resourceName) {
return repositoryService.createDeployment().addResourceFromClasspath(
resourceName).deploy();
}

/**
* 創建一個新的流程實例
*
* @param processDefinitionKey
* (process.jpdl.xml中process標籤的key)
* @param processInstanceKey
* (用戶給的key,比如一個請假單的id)
* @return 流程實例
*/
public ProcessInstance addProcessInstance(String processDefinitionKey,
String processInstanceKey) {
return executionService.startProcessInstanceByKey(processDefinitionKey,
processInstanceKey);

}

/**
* 創建一個新的流程實例
* @param processDefinitionKey(process.jpdl.xml中process標籤的key)
* @param variables 該流程實例要用到的變量
* @param processInstanceKey(用戶給定的業務key)
* @return
*/
public ProcessInstance addProcessInstance(
String processDefinitionKey,
Map<String, ?> variables,
String processInstanceKey){
return executionService.startProcessInstanceByKey(processDefinitionKey, variables, processInstanceKey);
}

/**
* 提交任務
* @param taskId 任務id
*/
public void completeTask(String taskId){
taskService.completeTask(taskId);
}

/**
* 將任務流轉到指定名字的流程中去
* @param taskId
* @param outcome
*/
public void completeTask(String taskId,String outcome){
taskService.completeTask(taskId, outcome);
}

/**
* 根據key獲取流程實例(這裏我使用的uuid)
*
* @param key
* (對應於數據庫表jbpm4_execution中的KEY_字段)
* @return 返回查找到得流程實例,沒有返回null
*/
public ProcessInstance getProcessInstance(String key) {
return executionService.createProcessInstanceQuery()
.processInstanceKey(key).uniqueResult();
}


/**
* 根據executionId獲取指定的變量值
* @param executionId
* @param variableName
* @return
*/
public Object getVariableByexecutionId(String executionId,String variableName){
return executionService.getVariable(executionId, variableName);
}


/**
* 根據任務id獲取指定變量值
* @param taskId
* @param variableName
* @return
*/
public Object getVariableByTaskId(String taskId,String variableName){
return taskService.getVariable(taskId, variableName);
}

/**
* 獲取指定用戶名字的任務
* @param userId
* @return
*/
public List<Task> findPersonalTasks(String userId){
return taskService.findPersonalTasks(userId);
}

/**
* 根據任務id獲取任務
* @param taskId
* @return
*/
public Task getTask(String taskId) {
return taskService.getTask(taskId);

}

/**
* 根據流程實例id獲取
* @param executionId
* @return
*/
public Execution findExecutionById(String executionId) {
return executionService.findExecutionById(executionId);
}

/**
* 徹底刪除文件的部署
*
* @param deploymentId流程定義id
*/
public void deleteDeploymentCascade(String deploymentId) {
repositoryService.deleteDeploymentCascade(deploymentId);
}

public JbpmTemplate() {

}

public JbpmTemplate(ProcessEngine processEngine) {
this.processEngine = processEngine;
repositoryService = processEngine.getRepositoryService();
executionService = processEngine.getExecutionService();
taskService = processEngine.getTaskService();
historyService = processEngine.getHistoryService();
managementService = processEngine.getManagementService();
}

private ProcessEngine processEngine;
private RepositoryService repositoryService = null;
private ExecutionService executionService = null;
private TaskService taskService = null;
private HistoryService historyService = null;
private ManagementService managementService = null;

public ProcessEngine getProcessEngine() {
return processEngine;
}

public void setProcessEngine(ProcessEngine processEngine) {
this.processEngine = processEngine;
System.out.println(processEngine);
repositoryService = processEngine.getRepositoryService();
executionService = processEngine.getExecutionService();
taskService = processEngine.getTaskService();
historyService = processEngine.getHistoryService();
managementService = processEngine.getManagementService();
}

public RepositoryService getRepositoryService() {
return repositoryService;
}

public void setRepositoryService(RepositoryService repositoryService) {
this.repositoryService = repositoryService;
}

public ExecutionService getExecutionService() {
return executionService;
}

public void setExecutionService(ExecutionService executionService) {
this.executionService = executionService;
}

public TaskService getTaskService() {
return taskService;
}

public void setTaskService(TaskService taskService) {
this.taskService = taskService;
}

public HistoryService getHistoryService() {
return historyService;
}

public void setHistoryService(HistoryService historyService) {
this.historyService = historyService;
}

public ManagementService getManagementService() {
return managementService;
}

public void setManagementService(ManagementService managementService) {
this.managementService = managementService;
}


}



配置文件就是這些,畢!

五、請假流程
下面完成一個簡單的請假流程。
參見:http://abstractforever.iteye.com/blog/608189

附錄:
[color=darkred][size=medium]JBPM4表結構說明[/size][/color]

JBPM4_DEPLOYMENT   流程定義表
JBPM4_DEPLOYPROP 流程定義屬性表

JBPM4_EXECUTION  流程實例表
JBPM4_HIST_ACTINST 流程活動(節點)實例表

JBPM4_HIST_DETAIL  流程歷史詳細表

JBPM4_HIST_PROCINST 流程實例歷史表

JBPM4_HIST_TASK  流程任務實例歷史表
JBPM4_HIST_VAR  流程變量(上下文)歷史表

JBPM4_ID_GROUP 組表
JBPM4_ID_MEMBERSHIP 用戶角色表
JBPM4_ID_USER  用戶表
JBPM4_JOB  定時表
JBPM4_LOB  存儲表
JBPM4_PARTICIPATION 參與者表
JBPM4_SWIMLANE  泳道表
JBPM4_TASK 任務表
JBPM4_VARIABLE 上下文表

紅 色的表爲經常使用的表.這裏不使用JBPM自己的權限角色定義.
發佈一個流程deploy後
jbpm4_deployment新增一條記錄
jbpm4_deployprop新增三條記錄
jbpm4_lob 新增一條記錄

開始一個流程startProcessInstanceByKey後
jbpm4_execution新增一條記錄
jbpm4_hist_actinst 新增一條記錄
jbpm4_hist_procinst新增一條記錄
jbpm4_hist_task新增一條記錄
jbpm4_task 新增一條記錄
流程定義相關的佈署信息就存儲在(1) JBPM4_DEPLOYMENT、(2) JBPM4_DEPLOYPROP 及(3) JBPM4_LOB 中。上傳一個包含png和jpdl.xml的zip包後,JBPM4_DEPLOYMENT多一條記錄 JBPM4_DEPLOYPROP 多三條, JBPM4_LOB多兩條。
(4)J B PM4_HIST_PROCINST 與(5) JBPM4_HIST_ACTINST 分別存放的是Process Instance、Activity Instance的歷史記錄。
(6)JBPM4_EXECUTION 主要是存放JBPM4的執行信息,Execution機制代替了JBPM3的Token機制(詳細參閱JBPM4的PVM機制,過段時間我也會進一步分析)。
(7)JBPM4_TASK 存放需要人來完成的Activities,需要人來參與完成的Activity 被稱爲Task。
(8)JBPM4_PARTICIPATION 存放 Participation的信息,Participation的種類有Candidate、Client、Owner、 Replaced Assignee和Viewer。而具體的Participation既可以是單一用戶,也可以是用戶組。
(9)JBPM4_SWIMLANE。 Swim Lane是一種Runtime Process Role。通過Swim Lane,多個Task可以一次分配到同一Actor身上。
(10) JBPM4 _VARIABLE 存的是進行時的臨時變量。
(11) JBPM4_HIST_DETAIL 保存 Variable的變更記錄。
(12)JBPM4_HIST_VAR 保存歷史的變量 。
(13) JBPM4_HIST_TASK Task的歷史信息。
(14)JBPM4_ID_GROUP (15)JBPM_ID_MEMBERSHIP (16)JBPM4_ID_USER 這三張表很常見了,基本的權限控制,關於用戶認證方面建議還是自己開發一套,JBPM4的功能太簡單了,使用中有很多需要難以滿足。
(17) JBPM4_JOB 存放的是Timer 的定義。
(18) JBPM4_PROPERTY  JBPM引擎參數表。

畢!
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章