??xml version="1.0" encoding="utf-8" standalone="yes"?>
我们常常在Web应用中需要启动一个自己写的服务,本文的目的是l你提供一个解x案?br />
原理
本方案的原理是写一个实CServletContextListener接口的类Q该cM有两个方法:public void contextInitialized(ServletContextEvent sce)Q它是在应用启动时调用;另一个方法是Qpublic void contextDestroyed(ServletContextEvent sce)Q该Ҏ是在应用l束时调用。把我们要启动的后台应用逻辑攑֜contextInitializedҎ中实玎ͼ把释攑台应用占用资源的工作攑֜contextDestroyed来处理。但我们启动的后CQ务常常是有要求的Q比如时_频率{,我在q里使用了一个开源组Ӟquartz?br />
步骤
1.写业务调用类Q?/strong>
// DumbJob.java
import org.quartz.*;
import java.util.*;
public class DumbJob implements Job {
public DumbJob() {
}
public void execute(JobExecutionContext context)
throws JobExecutionException
{
//在这里写业务处理代码。什么,你不知道Q那你别问我Q!:-<
}
}
本类的主要功能是由quartz中调度类按照指定的规则进行调用执行必要的业务逻辑?br />
2.写调度类
// TestShedule.java
import org.quartz.*;
import java.util.*;
public class TestShedule{
static SchedulerFactory schedFact = new org.quartz.impl.StdSchedulerFactory();
static Scheduler sched;
public static void run()throws Exception{
sched = schedFact.getScheduler(); //获取调度理?br />
JobDetail jobDetail = new JobDetail("myJob",
sched.DEFAULT_GROUP,
DumbJob.class);//创徏工作
CronTrigger trigger = new CronTrigger("myTrigger","test","0/10 * * * * ?");//创徏触发?br />
sched.scheduleJob(jobDetail, trigger); //d到调度管理器?br />
sched.start();//启动调度理?br />
}
public static void stop()throws Exception{
sched.shutdown();
}
}
本类的目的是讄调用规则Q在q里我用?#8220;0/10 * * * * ?”表示?0U钟执行一ơ,有关表达式的说明请参阅quartz的api文档?br />
3.~写服务启动c:
//ServiceLoader.java
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
public class ServiceLoader implements ServletContextListener {
public void contextInitialized(ServletContextEvent sce) {
try{
TestShedule.run();
}catch(Exception ex){
System.out.println(ex.getMessage());
}
}
public void contextDestroyed(ServletContextEvent sce) {
try{
TestShedule.stop();
}catch(Exception ex){
System.out.println(ex.getMessage());
}
}
}
在contextInitialized中调用TestShedule.run()启动后台dQ在contextDestroyed中调用TestShedule.stop()停止后台d?br />
4.部v服务启动c?/strong>
在web.xml文g中增加如下一行配|:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app id="WebApp">
<display-name>root</display-name>
<!--下边的listener部分是配置信息-->
<listener>
<listener-class>ServiceLoader </listener-class>
</listener>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
</welcome-file-list>
</web-app>
5.启动web服务卛_?/strong>
ȝ
其实实现q个功能的方法很多,我在q里是应用了ServletContextListener接口和开源api quartzQ希望能对你的开发有所帮助?br />
]]>
SQLyog Enterprise - MySQL GUI v5.02
Host - 5.0.27-community-nt : Database - jbpm
*********************************************************************
Server version : 5.0.27-community-nt
*/
create database if not exists `jbpm`;
USE `jbpm`;
SET FOREIGN_KEY_CHECKS=0;
/*Table structure for table `jbpm_action` */
DROP TABLE IF EXISTS `jbpm_action`;
CREATE TABLE `jbpm_action` (
`ID_` bigint(20) NOT NULL auto_increment,
`class` char(1) NOT NULL,
`NAME_` varchar(255) default NULL,
`ISPROPAGATIONALLOWED_` integer(1) default NULL,
`ACTIONEXPRESSION_` varchar(255) default NULL,
`ISASYNC_` integer(1) default NULL,
`REFERENCEDACTION_` bigint(20) default NULL,
`ACTIONDELEGATION_` bigint(20) default NULL,
`EVENT_` bigint(20) default NULL,
`PROCESSDEFINITION_` bigint(20) default NULL,
`TIMERNAME_` varchar(255) default NULL,
`DUEDATE_` varchar(255) default NULL,
`REPEAT_` varchar(255) default NULL,
`TRANSITIONNAME_` varchar(255) default NULL,
`TIMERACTION_` bigint(20) default NULL,
`EXPRESSION_` mediumtext,
`EVENTINDEX_` int(11) default NULL,
`EXCEPTIONHANDLER_` bigint(20) default NULL,
`EXCEPTIONHANDLERINDEX_` int(11) default NULL,
PRIMARY KEY (`ID_`),
KEY `IDX_ACTION_EVENT` (`EVENT_`),
KEY `IDX_ACTION_ACTNDL` (`ACTIONDELEGATION_`),
KEY `IDX_ACTION_PROCDF` (`PROCESSDEFINITION_`),
KEY `FK_ACTION_EVENT` (`EVENT_`),
KEY `FK_ACTION_EXPTHDL` (`EXCEPTIONHANDLER_`),
KEY `FK_ACTION_PROCDEF` (`PROCESSDEFINITION_`),
KEY `FK_CRTETIMERACT_TA` (`TIMERACTION_`),
KEY `FK_ACTION_ACTNDEL` (`ACTIONDELEGATION_`),
KEY `FK_ACTION_REFACT` (`REFERENCEDACTION_`),
CONSTRAINT `FK_ACTION_REFACT` FOREIGN KEY (`REFERENCEDACTION_`) REFERENCES `jbpm_action` (`ID_`),
CONSTRAINT `FK_ACTION_ACTNDEL` FOREIGN KEY (`ACTIONDELEGATION_`) REFERENCES `jbpm_delegation` (`ID_`),
CONSTRAINT `FK_ACTION_EVENT` FOREIGN KEY (`EVENT_`) REFERENCES `jbpm_event` (`ID_`),
CONSTRAINT `FK_ACTION_EXPTHDL` FOREIGN KEY (`EXCEPTIONHANDLER_`) REFERENCES `jbpm_exceptionhandler` (`ID_`),
CONSTRAINT `FK_ACTION_PROCDEF` FOREIGN KEY (`PROCESSDEFINITION_`) REFERENCES `jbpm_processdefinition` (`ID_`),
CONSTRAINT `FK_CRTETIMERACT_TA` FOREIGN KEY (`TIMERACTION_`) REFERENCES `jbpm_action` (`ID_`)
) ENGINE=InnoDB DEFAULT CHARSET=gbk;
/*Table structure for table `jbpm_bytearray` */
DROP TABLE IF EXISTS `jbpm_bytearray`;
CREATE TABLE `jbpm_bytearray` (
`ID_` bigint(20) NOT NULL auto_increment,
`NAME_` varchar(255) default NULL,
`FILEDEFINITION_` bigint(20) default NULL,
PRIMARY KEY (`ID_`),
KEY `FK_BYTEARR_FILDEF` (`FILEDEFINITION_`),
CONSTRAINT `FK_BYTEARR_FILDEF` FOREIGN KEY (`FILEDEFINITION_`) REFERENCES `jbpm_moduledefinition` (`ID_`)
) ENGINE=InnoDB DEFAULT CHARSET=gbk;
/*Table structure for table `jbpm_byteblock` */
DROP TABLE IF EXISTS `jbpm_byteblock`;
CREATE TABLE `jbpm_byteblock` (
`PROCESSFILE_` bigint(20) NOT NULL,
`BYTES_` blob,
`INDEX_` int(11) NOT NULL,
PRIMARY KEY (`PROCESSFILE_`,`INDEX_`),
KEY `FK_BYTEBLOCK_FILE` (`PROCESSFILE_`),
CONSTRAINT `FK_BYTEBLOCK_FILE` FOREIGN KEY (`PROCESSFILE_`) REFERENCES `jbpm_bytearray` (`ID_`)
) ENGINE=InnoDB DEFAULT CHARSET=gbk;
/*Table structure for table `jbpm_comment` */
DROP TABLE IF EXISTS `jbpm_comment`;
CREATE TABLE `jbpm_comment` (
`ID_` bigint(20) NOT NULL auto_increment,
`VERSION_` int(11) NOT NULL,
`ACTORID_` varchar(255) default NULL,
`TIME_` datetime default NULL,
`MESSAGE_` mediumtext,
`TOKEN_` bigint(20) default NULL,
`TASKINSTANCE_` bigint(20) default NULL,
`TOKENINDEX_` int(11) default NULL,
`TASKINSTANCEINDEX_` int(11) default NULL,
PRIMARY KEY (`ID_`),
KEY `IDX_COMMENT_TOKEN` (`TOKEN_`),
KEY `IDX_COMMENT_TSK` (`TASKINSTANCE_`),
KEY `FK_COMMENT_TOKEN` (`TOKEN_`),
KEY `FK_COMMENT_TSK` (`TASKINSTANCE_`),
CONSTRAINT `FK_COMMENT_TSK` FOREIGN KEY (`TASKINSTANCE_`) REFERENCES `jbpm_taskinstance` (`ID_`),
CONSTRAINT `FK_COMMENT_TOKEN` FOREIGN KEY (`TOKEN_`) REFERENCES `jbpm_token` (`ID_`)
) ENGINE=InnoDB DEFAULT CHARSET=gbk;
/*Table structure for table `jbpm_decisionconditions` */
DROP TABLE IF EXISTS `jbpm_decisionconditions`;
CREATE TABLE `jbpm_decisionconditions` (
`DECISION_` bigint(20) NOT NULL,
`TRANSITIONNAME_` varchar(255) default NULL,
`EXPRESSION_` varchar(255) default NULL,
`INDEX_` int(11) NOT NULL,
PRIMARY KEY (`DECISION_`,`INDEX_`),
KEY `FK_DECCOND_DEC` (`DECISION_`),
CONSTRAINT `FK_DECCOND_DEC` FOREIGN KEY (`DECISION_`) REFERENCES `jbpm_node` (`ID_`)
) ENGINE=InnoDB DEFAULT CHARSET=gbk;
/*Table structure for table `jbpm_delegation` */
DROP TABLE IF EXISTS `jbpm_delegation`;
CREATE TABLE `jbpm_delegation` (
`ID_` bigint(20) NOT NULL auto_increment,
`CLASSNAME_` mediumtext,
`CONFIGURATION_` mediumtext,
`CONFIGTYPE_` varchar(255) default NULL,
`PROCESSDEFINITION_` bigint(20) default NULL,
PRIMARY KEY (`ID_`),
KEY `IDX_DELEG_PRCD` (`PROCESSDEFINITION_`),
KEY `FK_DELEGATION_PRCD` (`PROCESSDEFINITION_`),
CONSTRAINT `FK_DELEGATION_PRCD` FOREIGN KEY (`PROCESSDEFINITION_`) REFERENCES `jbpm_processdefinition` (`ID_`)
) ENGINE=InnoDB DEFAULT CHARSET=gbk;
/*Table structure for table `jbpm_event` */
DROP TABLE IF EXISTS `jbpm_event`;
CREATE TABLE `jbpm_event` (
`ID_` bigint(20) NOT NULL auto_increment,
`EVENTTYPE_` varchar(255) default NULL,
`TYPE_` char(1) default NULL,
`GRAPHELEMENT_` bigint(20) default NULL,
`PROCESSDEFINITION_` bigint(20) default NULL,
`NODE_` bigint(20) default NULL,
`TRANSITION_` bigint(20) default NULL,
`TASK_` bigint(20) default NULL,
PRIMARY KEY (`ID_`),
KEY `FK_EVENT_PROCDEF` (`PROCESSDEFINITION_`),
KEY `FK_EVENT_NODE` (`NODE_`),
KEY `FK_EVENT_TRANS` (`TRANSITION_`),
KEY `FK_EVENT_TASK` (`TASK_`),
CONSTRAINT `FK_EVENT_TASK` FOREIGN KEY (`TASK_`) REFERENCES `jbpm_task` (`ID_`),
CONSTRAINT `FK_EVENT_NODE` FOREIGN KEY (`NODE_`) REFERENCES `jbpm_node` (`ID_`),
CONSTRAINT `FK_EVENT_PROCDEF` FOREIGN KEY (`PROCESSDEFINITION_`) REFERENCES `jbpm_processdefinition` (`ID_`),
CONSTRAINT `FK_EVENT_TRANS` FOREIGN KEY (`TRANSITION_`) REFERENCES `jbpm_transition` (`ID_`)
) ENGINE=InnoDB DEFAULT CHARSET=gbk;
/*Table structure for table `jbpm_exceptionhandler` */
DROP TABLE IF EXISTS `jbpm_exceptionhandler`;
CREATE TABLE `jbpm_exceptionhandler` (
`ID_` bigint(20) NOT NULL auto_increment,
`EXCEPTIONCLASSNAME_` text,
`TYPE_` char(1) default NULL,
`GRAPHELEMENT_` bigint(20) default NULL,
`PROCESSDEFINITION_` bigint(20) default NULL,
`GRAPHELEMENTINDEX_` int(11) default NULL,
`NODE_` bigint(20) default NULL,
`TRANSITION_` bigint(20) default NULL,
`TASK_` bigint(20) default NULL,
PRIMARY KEY (`ID_`)
) ENGINE=InnoDB DEFAULT CHARSET=gbk;
/*Table structure for table `jbpm_id_group` */
DROP TABLE IF EXISTS `jbpm_id_group`;
CREATE TABLE `jbpm_id_group` (
`ID_` bigint(20) NOT NULL auto_increment,
`CLASS_` char(1) NOT NULL,
`NAME_` varchar(255) default NULL,
`TYPE_` varchar(255) default NULL,
`PARENT_` bigint(20) default NULL,
PRIMARY KEY (`ID_`),
KEY `FK_ID_GRP_PARENT` (`PARENT_`),
CONSTRAINT `FK_ID_GRP_PARENT` FOREIGN KEY (`PARENT_`) REFERENCES `jbpm_id_group` (`ID_`)
) ENGINE=InnoDB DEFAULT CHARSET=gbk;
/*Table structure for table `jbpm_id_membership` */
DROP TABLE IF EXISTS `jbpm_id_membership`;
CREATE TABLE `jbpm_id_membership` (
`ID_` bigint(20) NOT NULL auto_increment,
`CLASS_` char(1) NOT NULL,
`NAME_` varchar(255) default NULL,
`ROLE_` varchar(255) default NULL,
`USER_` bigint(20) default NULL,
`GROUP_` bigint(20) default NULL,
PRIMARY KEY (`ID_`),
KEY `FK_ID_MEMSHIP_GRP` (`GROUP_`),
KEY `FK_ID_MEMSHIP_USR` (`USER_`),
CONSTRAINT `FK_ID_MEMSHIP_USR` FOREIGN KEY (`USER_`) REFERENCES `jbpm_id_user` (`ID_`),
CONSTRAINT `FK_ID_MEMSHIP_GRP` FOREIGN KEY (`GROUP_`) REFERENCES `jbpm_id_group` (`ID_`)
) ENGINE=InnoDB DEFAULT CHARSET=gbk;
/*Table structure for table `jbpm_id_permissions` */
DROP TABLE IF EXISTS `jbpm_id_permissions`;
CREATE TABLE `jbpm_id_permissions` (
`ENTITY_` bigint(20) NOT NULL,
`CLASS_` varchar(255) default NULL,
`NAME_` varchar(255) default NULL,
`ACTION_` varchar(255) default NULL
) ENGINE=InnoDB DEFAULT CHARSET=gbk;
/*Table structure for table `jbpm_id_user` */
DROP TABLE IF EXISTS `jbpm_id_user`;
CREATE TABLE `jbpm_id_user` (
`ID_` bigint(20) NOT NULL auto_increment,
`CLASS_` char(1) NOT NULL,
`NAME_` varchar(255) default NULL,
`EMAIL_` varchar(255) default NULL,
`PASSWORD_` varchar(255) default NULL,
PRIMARY KEY (`ID_`)
) ENGINE=InnoDB DEFAULT CHARSET=gbk;
/*Table structure for table `jbpm_job` */
DROP TABLE IF EXISTS `jbpm_job`;
CREATE TABLE `jbpm_job` (
`ID_` bigint(20) NOT NULL auto_increment,
`CLASS_` char(1) NOT NULL,
`VERSION_` int(11) NOT NULL,
`DUEDATE_` datetime default NULL,
`PROCESSINSTANCE_` bigint(20) default NULL,
`TOKEN_` bigint(20) default NULL,
`TASKINSTANCE_` bigint(20) default NULL,
`ISSUSPENDED_` integer(1) default NULL,
`ISEXCLUSIVE_` integer(1) default NULL,
`LOCKOWNER_` varchar(255) default NULL,
`LOCKTIME_` datetime default NULL,
`EXCEPTION_` mediumtext,
`RETRIES_` int(11) default NULL,
`NAME_` varchar(255) default NULL,
`REPEAT_` varchar(255) default NULL,
`TRANSITIONNAME_` varchar(255) default NULL,
`ACTION_` bigint(20) default NULL,
`GRAPHELEMENTTYPE_` varchar(255) default NULL,
`GRAPHELEMENT_` bigint(20) default NULL,
`NODE_` bigint(20) default NULL,
PRIMARY KEY (`ID_`),
KEY `IDX_JOB_TSKINST` (`TASKINSTANCE_`),
KEY `IDX_JOB_PRINST` (`PROCESSINSTANCE_`),
KEY `IDX_JOB_TOKEN` (`TOKEN_`),
KEY `FK_JOB_TOKEN` (`TOKEN_`),
KEY `FK_JOB_NODE` (`NODE_`),
KEY `FK_JOB_PRINST` (`PROCESSINSTANCE_`),
KEY `FK_JOB_ACTION` (`ACTION_`),
KEY `FK_JOB_TSKINST` (`TASKINSTANCE_`),
CONSTRAINT `FK_JOB_TSKINST` FOREIGN KEY (`TASKINSTANCE_`) REFERENCES `jbpm_taskinstance` (`ID_`),
CONSTRAINT `FK_JOB_ACTION` FOREIGN KEY (`ACTION_`) REFERENCES `jbpm_action` (`ID_`),
CONSTRAINT `FK_JOB_NODE` FOREIGN KEY (`NODE_`) REFERENCES `jbpm_node` (`ID_`),
CONSTRAINT `FK_JOB_PRINST` FOREIGN KEY (`PROCESSINSTANCE_`) REFERENCES `jbpm_processinstance` (`ID_`),
CONSTRAINT `FK_JOB_TOKEN` FOREIGN KEY (`TOKEN_`) REFERENCES `jbpm_token` (`ID_`)
) ENGINE=InnoDB DEFAULT CHARSET=gbk;
/*Table structure for table `jbpm_log` */
DROP TABLE IF EXISTS `jbpm_log`;
CREATE TABLE `jbpm_log` (
`ID_` bigint(20) NOT NULL auto_increment,
`CLASS_` char(1) NOT NULL,
`INDEX_` int(11) default NULL,
`DATE_` datetime default NULL,
`TOKEN_` bigint(20) default NULL,
`PARENT_` bigint(20) default NULL,
`MESSAGE_` mediumtext,
`EXCEPTION_` mediumtext,
`ACTION_` bigint(20) default NULL,
`NODE_` bigint(20) default NULL,
`ENTER_` datetime default NULL,
`LEAVE_` datetime default NULL,
`DURATION_` bigint(20) default NULL,
`NEWLONGVALUE_` bigint(20) default NULL,
`TRANSITION_` bigint(20) default NULL,
`CHILD_` bigint(20) default NULL,
`SOURCENODE_` bigint(20) default NULL,
`DESTINATIONNODE_` bigint(20) default NULL,
`VARIABLEINSTANCE_` bigint(20) default NULL,
`OLDBYTEARRAY_` bigint(20) default NULL,
`NEWBYTEARRAY_` bigint(20) default NULL,
`OLDDATEVALUE_` datetime default NULL,
`NEWDATEVALUE_` datetime default NULL,
`OLDDOUBLEVALUE_` double default NULL,
`NEWDOUBLEVALUE_` double default NULL,
`OLDLONGIDCLASS_` varchar(255) default NULL,
`OLDLONGIDVALUE_` bigint(20) default NULL,
`NEWLONGIDCLASS_` varchar(255) default NULL,
`NEWLONGIDVALUE_` bigint(20) default NULL,
`OLDSTRINGIDCLASS_` varchar(255) default NULL,
`OLDSTRINGIDVALUE_` varchar(255) default NULL,
`NEWSTRINGIDCLASS_` varchar(255) default NULL,
`NEWSTRINGIDVALUE_` varchar(255) default NULL,
`OLDLONGVALUE_` bigint(20) default NULL,
`OLDSTRINGVALUE_` mediumtext,
`NEWSTRINGVALUE_` mediumtext,
`TASKINSTANCE_` bigint(20) default NULL,
`TASKACTORID_` varchar(255) default NULL,
`TASKOLDACTORID_` varchar(255) default NULL,
`SWIMLANEINSTANCE_` bigint(20) default NULL,
PRIMARY KEY (`ID_`),
KEY `FK_LOG_SOURCENODE` (`SOURCENODE_`),
KEY `FK_LOG_TOKEN` (`TOKEN_`),
KEY `FK_LOG_OLDBYTES` (`OLDBYTEARRAY_`),
KEY `FK_LOG_NEWBYTES` (`NEWBYTEARRAY_`),
KEY `FK_LOG_CHILDTOKEN` (`CHILD_`),
KEY `FK_LOG_DESTNODE` (`DESTINATIONNODE_`),
KEY `FK_LOG_TASKINST` (`TASKINSTANCE_`),
KEY `FK_LOG_SWIMINST` (`SWIMLANEINSTANCE_`),
KEY `FK_LOG_PARENT` (`PARENT_`),
KEY `FK_LOG_NODE` (`NODE_`),
KEY `FK_LOG_ACTION` (`ACTION_`),
KEY `FK_LOG_VARINST` (`VARIABLEINSTANCE_`),
KEY `FK_LOG_TRANSITION` (`TRANSITION_`),
CONSTRAINT `FK_LOG_TRANSITION` FOREIGN KEY (`TRANSITION_`) REFERENCES `jbpm_transition` (`ID_`),
CONSTRAINT `FK_LOG_ACTION` FOREIGN KEY (`ACTION_`) REFERENCES `jbpm_action` (`ID_`),
CONSTRAINT `FK_LOG_CHILDTOKEN` FOREIGN KEY (`CHILD_`) REFERENCES `jbpm_token` (`ID_`),
CONSTRAINT `FK_LOG_DESTNODE` FOREIGN KEY (`DESTINATIONNODE_`) REFERENCES `jbpm_node` (`ID_`),
CONSTRAINT `FK_LOG_NEWBYTES` FOREIGN KEY (`NEWBYTEARRAY_`) REFERENCES `jbpm_bytearray` (`ID_`),
CONSTRAINT `FK_LOG_NODE` FOREIGN KEY (`NODE_`) REFERENCES `jbpm_node` (`ID_`),
CONSTRAINT `FK_LOG_OLDBYTES` FOREIGN KEY (`OLDBYTEARRAY_`) REFERENCES `jbpm_bytearray` (`ID_`),
CONSTRAINT `FK_LOG_PARENT` FOREIGN KEY (`PARENT_`) REFERENCES `jbpm_log` (`ID_`),
CONSTRAINT `FK_LOG_SOURCENODE` FOREIGN KEY (`SOURCENODE_`) REFERENCES `jbpm_node` (`ID_`),
CONSTRAINT `FK_LOG_SWIMINST` FOREIGN KEY (`SWIMLANEINSTANCE_`) REFERENCES `jbpm_swimlaneinstance` (`ID_`),
CONSTRAINT `FK_LOG_TASKINST` FOREIGN KEY (`TASKINSTANCE_`) REFERENCES `jbpm_taskinstance` (`ID_`),
CONSTRAINT `FK_LOG_TOKEN` FOREIGN KEY (`TOKEN_`) REFERENCES `jbpm_token` (`ID_`),
CONSTRAINT `FK_LOG_VARINST` FOREIGN KEY (`VARIABLEINSTANCE_`) REFERENCES `jbpm_variableinstance` (`ID_`)
) ENGINE=InnoDB DEFAULT CHARSET=gbk;
/*Table structure for table `jbpm_moduledefinition` */
DROP TABLE IF EXISTS `jbpm_moduledefinition`;
CREATE TABLE `jbpm_moduledefinition` (
`ID_` bigint(20) NOT NULL auto_increment,
`CLASS_` char(1) NOT NULL,
`NAME_` mediumtext,
`PROCESSDEFINITION_` bigint(20) default NULL,
`STARTTASK_` bigint(20) default NULL,
PRIMARY KEY (`ID_`),
KEY `IDX_MODDEF_PROCDF` (`PROCESSDEFINITION_`),
KEY `FK_TSKDEF_START` (`STARTTASK_`),
KEY `FK_MODDEF_PROCDEF` (`PROCESSDEFINITION_`),
CONSTRAINT `FK_MODDEF_PROCDEF` FOREIGN KEY (`PROCESSDEFINITION_`) REFERENCES `jbpm_processdefinition` (`ID_`),
CONSTRAINT `FK_TSKDEF_START` FOREIGN KEY (`STARTTASK_`) REFERENCES `jbpm_task` (`ID_`)
) ENGINE=InnoDB DEFAULT CHARSET=gbk;
/*Table structure for table `jbpm_moduleinstance` */
DROP TABLE IF EXISTS `jbpm_moduleinstance`;
CREATE TABLE `jbpm_moduleinstance` (
`ID_` bigint(20) NOT NULL auto_increment,
`CLASS_` char(1) NOT NULL,
`VERSION_` int(11) NOT NULL,
`PROCESSINSTANCE_` bigint(20) default NULL,
`TASKMGMTDEFINITION_` bigint(20) default NULL,
`NAME_` varchar(255) default NULL,
PRIMARY KEY (`ID_`),
KEY `IDX_MODINST_PRINST` (`PROCESSINSTANCE_`),
KEY `FK_TASKMGTINST_TMD` (`TASKMGMTDEFINITION_`),
KEY `FK_MODINST_PRCINST` (`PROCESSINSTANCE_`),
CONSTRAINT `FK_MODINST_PRCINST` FOREIGN KEY (`PROCESSINSTANCE_`) REFERENCES `jbpm_processinstance` (`ID_`),
CONSTRAINT `FK_TASKMGTINST_TMD` FOREIGN KEY (`TASKMGMTDEFINITION_`) REFERENCES `jbpm_moduledefinition` (`ID_`)
) ENGINE=InnoDB DEFAULT CHARSET=gbk;
/*Table structure for table `jbpm_node` */
DROP TABLE IF EXISTS `jbpm_node`;
CREATE TABLE `jbpm_node` (
`ID_` bigint(20) NOT NULL auto_increment,
`CLASS_` char(1) NOT NULL,
`NAME_` varchar(255) default NULL,
`DESCRIPTION_` mediumtext,
`PROCESSDEFINITION_` bigint(20) default NULL,
`ISASYNC_` integer(1) default NULL,
`ISASYNCEXCL_` integer(1) default NULL,
`ACTION_` bigint(20) default NULL,
`SUPERSTATE_` bigint(20) default NULL,
`SUBPROCNAME_` varchar(255) default NULL,
`SUBPROCESSDEFINITION_` bigint(20) default NULL,
`DECISIONEXPRESSION_` varchar(255) default NULL,
`DECISIONDELEGATION` bigint(20) default NULL,
`SCRIPT_` bigint(20) default NULL,
`SIGNAL_` int(11) default NULL,
`CREATETASKS_` integer(1) default NULL,
`ENDTASKS_` integer(1) default NULL,
`NODECOLLECTIONINDEX_` int(11) default NULL,
PRIMARY KEY (`ID_`),
KEY `IDX_PSTATE_SBPRCDEF` (`SUBPROCESSDEFINITION_`),
KEY `IDX_NODE_SUPRSTATE` (`SUPERSTATE_`),
KEY `IDX_NODE_PROCDEF` (`PROCESSDEFINITION_`),
KEY `IDX_NODE_ACTION` (`ACTION_`),
KEY `FK_PROCST_SBPRCDEF` (`SUBPROCESSDEFINITION_`),
KEY `FK_NODE_PROCDEF` (`PROCESSDEFINITION_`),
KEY `FK_NODE_SCRIPT` (`SCRIPT_`),
KEY `FK_NODE_ACTION` (`ACTION_`),
KEY `FK_DECISION_DELEG` (`DECISIONDELEGATION`),
KEY `FK_NODE_SUPERSTATE` (`SUPERSTATE_`),
CONSTRAINT `FK_NODE_SUPERSTATE` FOREIGN KEY (`SUPERSTATE_`) REFERENCES `jbpm_node` (`ID_`),
CONSTRAINT `FK_DECISION_DELEG` FOREIGN KEY (`DECISIONDELEGATION`) REFERENCES `jbpm_delegation` (`ID_`),
CONSTRAINT `FK_NODE_ACTION` FOREIGN KEY (`ACTION_`) REFERENCES `jbpm_action` (`ID_`),
CONSTRAINT `FK_NODE_PROCDEF` FOREIGN KEY (`PROCESSDEFINITION_`) REFERENCES `jbpm_processdefinition` (`ID_`),
CONSTRAINT `FK_NODE_SCRIPT` FOREIGN KEY (`SCRIPT_`) REFERENCES `jbpm_action` (`ID_`),
CONSTRAINT `FK_PROCST_SBPRCDEF` FOREIGN KEY (`SUBPROCESSDEFINITION_`) REFERENCES `jbpm_processdefinition` (`ID_`)
) ENGINE=InnoDB DEFAULT CHARSET=gbk;
/*Table structure for table `jbpm_pooledactor` */
DROP TABLE IF EXISTS `jbpm_pooledactor`;
CREATE TABLE `jbpm_pooledactor` (
`ID_` bigint(20) NOT NULL auto_increment,
`VERSION_` int(11) NOT NULL,
`ACTORID_` varchar(255) default NULL,
`SWIMLANEINSTANCE_` bigint(20) default NULL,
PRIMARY KEY (`ID_`),
KEY `IDX_PLDACTR_ACTID` (`ACTORID_`),
KEY `IDX_TSKINST_SWLANE` (`SWIMLANEINSTANCE_`),
KEY `FK_POOLEDACTOR_SLI` (`SWIMLANEINSTANCE_`),
CONSTRAINT `FK_POOLEDACTOR_SLI` FOREIGN KEY (`SWIMLANEINSTANCE_`) REFERENCES `jbpm_swimlaneinstance` (`ID_`)
) ENGINE=InnoDB DEFAULT CHARSET=gbk;
/*Table structure for table `jbpm_processdefinition` */
DROP TABLE IF EXISTS `jbpm_processdefinition`;
CREATE TABLE `jbpm_processdefinition` (
`ID_` bigint(20) NOT NULL auto_increment,
`CLASS_` char(1) NOT NULL,
`NAME_` varchar(255) default NULL,
`DESCRIPTION_` mediumtext,
`VERSION_` int(11) default NULL,
`ISTERMINATIONIMPLICIT_` integer(1) default NULL,
`STARTSTATE_` bigint(20) default NULL,
PRIMARY KEY (`ID_`),
KEY `IDX_PROCDEF_STRTST` (`STARTSTATE_`),
KEY `FK_PROCDEF_STRTSTA` (`STARTSTATE_`),
CONSTRAINT `FK_PROCDEF_STRTSTA` FOREIGN KEY (`STARTSTATE_`) REFERENCES `jbpm_node` (`ID_`)
) ENGINE=InnoDB DEFAULT CHARSET=gbk;
/*Table structure for table `jbpm_processinstance` */
DROP TABLE IF EXISTS `jbpm_processinstance`;
CREATE TABLE `jbpm_processinstance` (
`ID_` bigint(20) NOT NULL auto_increment,
`VERSION_` int(11) NOT NULL,
`KEY_` varchar(255) default NULL,
`START_` datetime default NULL,
`END_` datetime default NULL,
`ISSUSPENDED_` integer(1) default NULL,
`PROCESSDEFINITION_` bigint(20) default NULL,
`ROOTTOKEN_` bigint(20) default NULL,
`SUPERPROCESSTOKEN_` bigint(20) default NULL,
PRIMARY KEY (`ID_`),
UNIQUE KEY `KEY_` (`KEY_`,`PROCESSDEFINITION_`),
KEY `IDX_PROCIN_ROOTTK` (`ROOTTOKEN_`),
KEY `IDX_PROCIN_SPROCTK` (`SUPERPROCESSTOKEN_`),
KEY `IDX_PROCIN_PROCDEF` (`PROCESSDEFINITION_`),
KEY `FK_PROCIN_PROCDEF` (`PROCESSDEFINITION_`),
KEY `FK_PROCIN_ROOTTKN` (`ROOTTOKEN_`),
KEY `FK_PROCIN_SPROCTKN` (`SUPERPROCESSTOKEN_`),
CONSTRAINT `FK_PROCIN_SPROCTKN` FOREIGN KEY (`SUPERPROCESSTOKEN_`) REFERENCES `jbpm_token` (`ID_`),
CONSTRAINT `FK_PROCIN_PROCDEF` FOREIGN KEY (`PROCESSDEFINITION_`) REFERENCES `jbpm_processdefinition` (`ID_`),
CONSTRAINT `FK_PROCIN_ROOTTKN` FOREIGN KEY (`ROOTTOKEN_`) REFERENCES `jbpm_token` (`ID_`)
) ENGINE=InnoDB DEFAULT CHARSET=gbk;
/*Table structure for table `jbpm_runtimeaction` */
DROP TABLE IF EXISTS `jbpm_runtimeaction`;
CREATE TABLE `jbpm_runtimeaction` (
`ID_` bigint(20) NOT NULL auto_increment,
`VERSION_` int(11) NOT NULL,
`EVENTTYPE_` varchar(255) default NULL,
`TYPE_` char(1) default NULL,
`GRAPHELEMENT_` bigint(20) default NULL,
`PROCESSINSTANCE_` bigint(20) default NULL,
`ACTION_` bigint(20) default NULL,
`PROCESSINSTANCEINDEX_` int(11) default NULL,
PRIMARY KEY (`ID_`),
KEY `IDX_RTACTN_PRCINST` (`PROCESSINSTANCE_`),
KEY `IDX_RTACTN_ACTION` (`ACTION_`),
KEY `FK_RTACTN_PROCINST` (`PROCESSINSTANCE_`),
KEY `FK_RTACTN_ACTION` (`ACTION_`),
CONSTRAINT `FK_RTACTN_ACTION` FOREIGN KEY (`ACTION_`) REFERENCES `jbpm_action` (`ID_`),
CONSTRAINT `FK_RTACTN_PROCINST` FOREIGN KEY (`PROCESSINSTANCE_`) REFERENCES `jbpm_processinstance` (`ID_`)
) ENGINE=InnoDB DEFAULT CHARSET=gbk;
/*Table structure for table `jbpm_swimlane` */
DROP TABLE IF EXISTS `jbpm_swimlane`;
CREATE TABLE `jbpm_swimlane` (
`ID_` bigint(20) NOT NULL auto_increment,
`NAME_` varchar(255) default NULL,
`ACTORIDEXPRESSION_` varchar(255) default NULL,
`POOLEDACTORSEXPRESSION_` varchar(255) default NULL,
`ASSIGNMENTDELEGATION_` bigint(20) default NULL,
`TASKMGMTDEFINITION_` bigint(20) default NULL,
PRIMARY KEY (`ID_`),
KEY `FK_SWL_ASSDEL` (`ASSIGNMENTDELEGATION_`),
KEY `FK_SWL_TSKMGMTDEF` (`TASKMGMTDEFINITION_`),
CONSTRAINT `FK_SWL_TSKMGMTDEF` FOREIGN KEY (`TASKMGMTDEFINITION_`) REFERENCES `jbpm_moduledefinition` (`ID_`),
CONSTRAINT `FK_SWL_ASSDEL` FOREIGN KEY (`ASSIGNMENTDELEGATION_`) REFERENCES `jbpm_delegation` (`ID_`)
) ENGINE=InnoDB DEFAULT CHARSET=gbk;
/*Table structure for table `jbpm_swimlaneinstance` */
DROP TABLE IF EXISTS `jbpm_swimlaneinstance`;
CREATE TABLE `jbpm_swimlaneinstance` (
`ID_` bigint(20) NOT NULL auto_increment,
`VERSION_` int(11) NOT NULL,
`NAME_` varchar(255) default NULL,
`ACTORID_` varchar(255) default NULL,
`SWIMLANE_` bigint(20) default NULL,
`TASKMGMTINSTANCE_` bigint(20) default NULL,
PRIMARY KEY (`ID_`),
KEY `IDX_SWIMLINST_SL` (`SWIMLANE_`),
KEY `FK_SWIMLANEINST_TM` (`TASKMGMTINSTANCE_`),
KEY `FK_SWIMLANEINST_SL` (`SWIMLANE_`),
CONSTRAINT `FK_SWIMLANEINST_SL` FOREIGN KEY (`SWIMLANE_`) REFERENCES `jbpm_swimlane` (`ID_`),
CONSTRAINT `FK_SWIMLANEINST_TM` FOREIGN KEY (`TASKMGMTINSTANCE_`) REFERENCES `jbpm_moduleinstance` (`ID_`)
) ENGINE=InnoDB DEFAULT CHARSET=gbk;
/*Table structure for table `jbpm_task` */
DROP TABLE IF EXISTS `jbpm_task`;
CREATE TABLE `jbpm_task` (
`ID_` bigint(20) NOT NULL auto_increment,
`NAME_` varchar(255) default NULL,
`DESCRIPTION_` mediumtext,
`PROCESSDEFINITION_` bigint(20) default NULL,
`ISBLOCKING_` integer(1) default NULL,
`ISSIGNALLING_` integer(1) default NULL,
`CONDITION_` varchar(255) default NULL,
`DUEDATE_` varchar(255) default NULL,
`PRIORITY_` int(11) default NULL,
`ACTORIDEXPRESSION_` varchar(255) default NULL,
`POOLEDACTORSEXPRESSION_` varchar(255) default NULL,
`TASKMGMTDEFINITION_` bigint(20) default NULL,
`TASKNODE_` bigint(20) default NULL,
`STARTSTATE_` bigint(20) default NULL,
`ASSIGNMENTDELEGATION_` bigint(20) default NULL,
`SWIMLANE_` bigint(20) default NULL,
`TASKCONTROLLER_` bigint(20) default NULL,
PRIMARY KEY (`ID_`),
KEY `IDX_TASK_TSKNODE` (`TASKNODE_`),
KEY `IDX_TASK_PROCDEF` (`PROCESSDEFINITION_`),
KEY `IDX_TASK_TASKMGTDF` (`TASKMGMTDEFINITION_`),
KEY `FK_TSK_TSKCTRL` (`TASKCONTROLLER_`),
KEY `FK_TASK_ASSDEL` (`ASSIGNMENTDELEGATION_`),
KEY `FK_TASK_TASKNODE` (`TASKNODE_`),
KEY `FK_TASK_PROCDEF` (`PROCESSDEFINITION_`),
KEY `FK_TASK_STARTST` (`STARTSTATE_`),
KEY `FK_TASK_TASKMGTDEF` (`TASKMGMTDEFINITION_`),
KEY `FK_TASK_SWIMLANE` (`SWIMLANE_`),
CONSTRAINT `FK_TASK_SWIMLANE` FOREIGN KEY (`SWIMLANE_`) REFERENCES `jbpm_swimlane` (`ID_`),
CONSTRAINT `FK_TASK_ASSDEL` FOREIGN KEY (`ASSIGNMENTDELEGATION_`) REFERENCES `jbpm_delegation` (`ID_`),
CONSTRAINT `FK_TASK_PROCDEF` FOREIGN KEY (`PROCESSDEFINITION_`) REFERENCES `jbpm_processdefinition` (`ID_`),
CONSTRAINT `FK_TASK_STARTST` FOREIGN KEY (`STARTSTATE_`) REFERENCES `jbpm_node` (`ID_`),
CONSTRAINT `FK_TASK_TASKMGTDEF` FOREIGN KEY (`TASKMGMTDEFINITION_`) REFERENCES `jbpm_moduledefinition` (`ID_`),
CONSTRAINT `FK_TASK_TASKNODE` FOREIGN KEY (`TASKNODE_`) REFERENCES `jbpm_node` (`ID_`),
CONSTRAINT `FK_TSK_TSKCTRL` FOREIGN KEY (`TASKCONTROLLER_`) REFERENCES `jbpm_taskcontroller` (`ID_`)
) ENGINE=InnoDB DEFAULT CHARSET=gbk;
/*Table structure for table `jbpm_taskactorpool` */
DROP TABLE IF EXISTS `jbpm_taskactorpool`;
CREATE TABLE `jbpm_taskactorpool` (
`TASKINSTANCE_` bigint(20) NOT NULL,
`POOLEDACTOR_` bigint(20) NOT NULL,
PRIMARY KEY (`TASKINSTANCE_`,`POOLEDACTOR_`),
KEY `FK_TSKACTPOL_PLACT` (`POOLEDACTOR_`),
KEY `FK_TASKACTPL_TSKI` (`TASKINSTANCE_`),
CONSTRAINT `FK_TASKACTPL_TSKI` FOREIGN KEY (`TASKINSTANCE_`) REFERENCES `jbpm_taskinstance` (`ID_`),
CONSTRAINT `FK_TSKACTPOL_PLACT` FOREIGN KEY (`POOLEDACTOR_`) REFERENCES `jbpm_pooledactor` (`ID_`)
) ENGINE=InnoDB DEFAULT CHARSET=gbk;
/*Table structure for table `jbpm_taskcontroller` */
DROP TABLE IF EXISTS `jbpm_taskcontroller`;
CREATE TABLE `jbpm_taskcontroller` (
`ID_` bigint(20) NOT NULL auto_increment,
`TASKCONTROLLERDELEGATION_` bigint(20) default NULL,
PRIMARY KEY (`ID_`),
KEY `FK_TSKCTRL_DELEG` (`TASKCONTROLLERDELEGATION_`),
CONSTRAINT `FK_TSKCTRL_DELEG` FOREIGN KEY (`TASKCONTROLLERDELEGATION_`) REFERENCES `jbpm_delegation` (`ID_`)
) ENGINE=InnoDB DEFAULT CHARSET=gbk;
/*Table structure for table `jbpm_taskinstance` */
DROP TABLE IF EXISTS `jbpm_taskinstance`;
CREATE TABLE `jbpm_taskinstance` (
`ID_` bigint(20) NOT NULL auto_increment,
`CLASS_` char(1) NOT NULL,
`VERSION_` int(11) NOT NULL,
`NAME_` varchar(255) default NULL,
`DESCRIPTION_` mediumtext,
`ACTORID_` varchar(255) default NULL,
`CREATE_` datetime default NULL,
`START_` datetime default NULL,
`END_` datetime default NULL,
`DUEDATE_` datetime default NULL,
`PRIORITY_` int(11) default NULL,
`ISCANCELLED_` integer(1) default NULL,
`ISSUSPENDED_` integer(1) default NULL,
`ISOPEN_` integer(1) default NULL,
`ISSIGNALLING_` integer(1) default NULL,
`ISBLOCKING_` integer(1) default NULL,
`TASK_` bigint(20) default NULL,
`TOKEN_` bigint(20) default NULL,
`PROCINST_` bigint(20) default NULL,
`SWIMLANINSTANCE_` bigint(20) default NULL,
`TASKMGMTINSTANCE_` bigint(20) default NULL,
PRIMARY KEY (`ID_`),
KEY `IDX_TASKINST_TOKN` (`TOKEN_`),
KEY `IDX_TASKINST_TSK` (`TASK_`,`PROCINST_`),
KEY `IDX_TSKINST_TMINST` (`TASKMGMTINSTANCE_`),
KEY `IDX_TSKINST_SLINST` (`SWIMLANINSTANCE_`),
KEY `IDX_TASK_ACTORID` (`ACTORID_`),
KEY `FK_TSKINS_PRCINS` (`PROCINST_`),
KEY `FK_TASKINST_TMINST` (`TASKMGMTINSTANCE_`),
KEY `FK_TASKINST_TOKEN` (`TOKEN_`),
KEY `FK_TASKINST_SLINST` (`SWIMLANINSTANCE_`),
KEY `FK_TASKINST_TASK` (`TASK_`),
CONSTRAINT `FK_TASKINST_TASK` FOREIGN KEY (`TASK_`) REFERENCES `jbpm_task` (`ID_`),
CONSTRAINT `FK_TASKINST_SLINST` FOREIGN KEY (`SWIMLANINSTANCE_`) REFERENCES `jbpm_swimlaneinstance` (`ID_`),
CONSTRAINT `FK_TASKINST_TMINST` FOREIGN KEY (`TASKMGMTINSTANCE_`) REFERENCES `jbpm_moduleinstance` (`ID_`),
CONSTRAINT `FK_TASKINST_TOKEN` FOREIGN KEY (`TOKEN_`) REFERENCES `jbpm_token` (`ID_`),
CONSTRAINT `FK_TSKINS_PRCINS` FOREIGN KEY (`PROCINST_`) REFERENCES `jbpm_processinstance` (`ID_`)
) ENGINE=InnoDB DEFAULT CHARSET=gbk;
/*Table structure for table `jbpm_token` */
DROP TABLE IF EXISTS `jbpm_token`;
CREATE TABLE `jbpm_token` (
`ID_` bigint(20) NOT NULL auto_increment,
`VERSION_` int(11) NOT NULL,
`NAME_` varchar(255) default NULL,
`START_` datetime default NULL,
`END_` datetime default NULL,
`NODEENTER_` datetime default NULL,
`NEXTLOGINDEX_` int(11) default NULL,
`ISABLETOREACTIVATEPARENT_` integer(1) default NULL,
`ISTERMINATIONIMPLICIT_` integer(1) default NULL,
`ISSUSPENDED_` integer(1) default NULL,
`LOCK_` varchar(255) default NULL,
`NODE_` bigint(20) default NULL,
`PROCESSINSTANCE_` bigint(20) default NULL,
`PARENT_` bigint(20) default NULL,
`SUBPROCESSINSTANCE_` bigint(20) default NULL,
PRIMARY KEY (`ID_`),
KEY `IDX_TOKEN_PROCIN` (`PROCESSINSTANCE_`),
KEY `IDX_TOKEN_SUBPI` (`SUBPROCESSINSTANCE_`),
KEY `IDX_TOKEN_NODE` (`NODE_`),
KEY `IDX_TOKEN_PARENT` (`PARENT_`),
KEY `FK_TOKEN_PARENT` (`PARENT_`),
KEY `FK_TOKEN_NODE` (`NODE_`),
KEY `FK_TOKEN_PROCINST` (`PROCESSINSTANCE_`),
KEY `FK_TOKEN_SUBPI` (`SUBPROCESSINSTANCE_`),
CONSTRAINT `FK_TOKEN_SUBPI` FOREIGN KEY (`SUBPROCESSINSTANCE_`) REFERENCES `jbpm_processinstance` (`ID_`),
CONSTRAINT `FK_TOKEN_NODE` FOREIGN KEY (`NODE_`) REFERENCES `jbpm_node` (`ID_`),
CONSTRAINT `FK_TOKEN_PARENT` FOREIGN KEY (`PARENT_`) REFERENCES `jbpm_token` (`ID_`),
CONSTRAINT `FK_TOKEN_PROCINST` FOREIGN KEY (`PROCESSINSTANCE_`) REFERENCES `jbpm_processinstance` (`ID_`)
) ENGINE=InnoDB DEFAULT CHARSET=gbk;
/*Table structure for table `jbpm_tokenvariablemap` */
DROP TABLE IF EXISTS `jbpm_tokenvariablemap`;
CREATE TABLE `jbpm_tokenvariablemap` (
`ID_` bigint(20) NOT NULL auto_increment,
`VERSION_` int(11) NOT NULL,
`TOKEN_` bigint(20) default NULL,
`CONTEXTINSTANCE_` bigint(20) default NULL,
PRIMARY KEY (`ID_`),
KEY `IDX_TKVARMAP_CTXT` (`CONTEXTINSTANCE_`),
KEY `IDX_TKVVARMP_TOKEN` (`TOKEN_`),
KEY `FK_TKVARMAP_CTXT` (`CONTEXTINSTANCE_`),
KEY `FK_TKVARMAP_TOKEN` (`TOKEN_`),
CONSTRAINT `FK_TKVARMAP_TOKEN` FOREIGN KEY (`TOKEN_`) REFERENCES `jbpm_token` (`ID_`),
CONSTRAINT `FK_TKVARMAP_CTXT` FOREIGN KEY (`CONTEXTINSTANCE_`) REFERENCES `jbpm_moduleinstance` (`ID_`)
) ENGINE=InnoDB DEFAULT CHARSET=gbk;
/*Table structure for table `jbpm_transition` */
DROP TABLE IF EXISTS `jbpm_transition`;
CREATE TABLE `jbpm_transition` (
`ID_` bigint(20) NOT NULL auto_increment,
`NAME_` varchar(255) default NULL,
`DESCRIPTION_` mediumtext,
`PROCESSDEFINITION_` bigint(20) default NULL,
`FROM_` bigint(20) default NULL,
`TO_` bigint(20) default NULL,
`CONDITION_` varchar(255) default NULL,
`FROMINDEX_` int(11) default NULL,
PRIMARY KEY (`ID_`),
KEY `IDX_TRANSIT_TO` (`TO_`),
KEY `IDX_TRANSIT_FROM` (`FROM_`),
KEY `IDX_TRANS_PROCDEF` (`PROCESSDEFINITION_`),
KEY `FK_TRANSITION_TO` (`TO_`),
KEY `FK_TRANS_PROCDEF` (`PROCESSDEFINITION_`),
KEY `FK_TRANSITION_FROM` (`FROM_`),
CONSTRAINT `FK_TRANSITION_FROM` FOREIGN KEY (`FROM_`) REFERENCES `jbpm_node` (`ID_`),
CONSTRAINT `FK_TRANSITION_TO` FOREIGN KEY (`TO_`) REFERENCES `jbpm_node` (`ID_`),
CONSTRAINT `FK_TRANS_PROCDEF` FOREIGN KEY (`PROCESSDEFINITION_`) REFERENCES `jbpm_processdefinition` (`ID_`)
) ENGINE=InnoDB DEFAULT CHARSET=gbk;
/*Table structure for table `jbpm_variableaccess` */
DROP TABLE IF EXISTS `jbpm_variableaccess`;
CREATE TABLE `jbpm_variableaccess` (
`ID_` bigint(20) NOT NULL auto_increment,
`VARIABLENAME_` varchar(255) default NULL,
`ACCESS_` varchar(255) default NULL,
`MAPPEDNAME_` varchar(255) default NULL,
`PROCESSSTATE_` bigint(20) default NULL,
`TASKCONTROLLER_` bigint(20) default NULL,
`INDEX_` int(11) default NULL,
`SCRIPT_` bigint(20) default NULL,
PRIMARY KEY (`ID_`),
KEY `FK_VARACC_TSKCTRL` (`TASKCONTROLLER_`),
KEY `FK_VARACC_SCRIPT` (`SCRIPT_`),
KEY `FK_VARACC_PROCST` (`PROCESSSTATE_`),
CONSTRAINT `FK_VARACC_PROCST` FOREIGN KEY (`PROCESSSTATE_`) REFERENCES `jbpm_node` (`ID_`),
CONSTRAINT `FK_VARACC_SCRIPT` FOREIGN KEY (`SCRIPT_`) REFERENCES `jbpm_action` (`ID_`),
CONSTRAINT `FK_VARACC_TSKCTRL` FOREIGN KEY (`TASKCONTROLLER_`) REFERENCES `jbpm_taskcontroller` (`ID_`)
) ENGINE=InnoDB DEFAULT CHARSET=gbk;
/*Table structure for table `jbpm_variableinstance` */
DROP TABLE IF EXISTS `jbpm_variableinstance`;
CREATE TABLE `jbpm_variableinstance` (
`ID_` bigint(20) NOT NULL auto_increment,
`CLASS_` char(1) NOT NULL,
`VERSION_` int(11) NOT NULL,
`NAME_` varchar(255) default NULL,
`CONVERTER_` char(1) default NULL,
`TOKEN_` bigint(20) default NULL,
`TOKENVARIABLEMAP_` bigint(20) default NULL,
`PROCESSINSTANCE_` bigint(20) default NULL,
`BYTEARRAYVALUE_` bigint(20) default NULL,
`DATEVALUE_` datetime default NULL,
`DOUBLEVALUE_` double default NULL,
`LONGIDCLASS_` varchar(255) default NULL,
`LONGVALUE_` bigint(20) default NULL,
`STRINGIDCLASS_` varchar(255) default NULL,
`STRINGVALUE_` varchar(255) default NULL,
`TASKINSTANCE_` bigint(20) default NULL,
PRIMARY KEY (`ID_`),
KEY `IDX_VARINST_TKVARMP` (`TOKENVARIABLEMAP_`),
KEY `IDX_VARINST_PRCINS` (`PROCESSINSTANCE_`),
KEY `IDX_VARINST_TK` (`TOKEN_`),
KEY `FK_VARINST_TK` (`TOKEN_`),
KEY `FK_VARINST_TKVARMP` (`TOKENVARIABLEMAP_`),
KEY `FK_VARINST_PRCINST` (`PROCESSINSTANCE_`),
KEY `FK_VAR_TSKINST` (`TASKINSTANCE_`),
KEY `FK_BYTEINST_ARRAY` (`BYTEARRAYVALUE_`),
CONSTRAINT `FK_BYTEINST_ARRAY` FOREIGN KEY (`BYTEARRAYVALUE_`) REFERENCES `jbpm_bytearray` (`ID_`),
CONSTRAINT `FK_VARINST_PRCINST` FOREIGN KEY (`PROCESSINSTANCE_`) REFERENCES `jbpm_processinstance` (`ID_`),
CONSTRAINT `FK_VARINST_TK` FOREIGN KEY (`TOKEN_`) REFERENCES `jbpm_token` (`ID_`),
CONSTRAINT `FK_VARINST_TKVARMP` FOREIGN KEY (`TOKENVARIABLEMAP_`) REFERENCES `jbpm_tokenvariablemap` (`ID_`),
CONSTRAINT `FK_VAR_TSKINST` FOREIGN KEY (`TASKINSTANCE_`) REFERENCES `jbpm_taskinstance` (`ID_`)
) ENGINE=InnoDB DEFAULT CHARSET=gbk;
SET FOREIGN_KEY_CHECKS=1;
一个JBPM工作管理示?
CZQ?br />
在某一公司中,部门员工要休假的话需要部门主的批准。如果休假天数大?0天的话,在部门主的同意后,q必MU主批准。如果是部门ȝ要休假只要上U主批准即可。在休假被批准之前,甌人可以撤销休假甌?br />
每个员工q有多少天休假必ȝ理v来,在员工提交休假申h要检查申请天数是否超q可用天数。申h准后Q要在可用天数里减去甌天数。每ơ休假申L束之后,不管通过未通过或是否取消,都必记录下来。主在批复甌之后Q系l要批复结果Emaill申请h。对于大?0天的甌Q如果部门主已批准同意而上U主还未批准,q时甌人撤销甌后,pȝ应发Email通知部门ȝ甌已撤销?nbsp;
processdefinition.xml如下Q?br />
<?xml version="1.0" encoding="UTF-8"?>
<!-- edited with XMLSPY v2004 rel. 3 U (http://www.xmlspy.com) by keller (zju) -->
<!DOCTYPE process-definition PUBLIC
"-//jBpm/jBpm Mapping DTD 2.0//EN"
"http://jbpm.org/dtd/processdefinition-2.0.dtd">
<process-definition name="RequestLeave">
<swimlane name="requester">
<description>甌?lt;/description>
</swimlane>
<swimlane name="chief">
<description>部门ȝ</description>
<delegation class="kellerdu.jbpm.delegation.ChiefSwimlane"/>
</swimlane>
<swimlane name="boss">
<description>上ȝ</description>
<delegation class="kellerdu.jbpm.delegation.BossSwimlane"/>
</swimlane>
<start-state name="request" swimlane="requester">
<transition to="BeginRequest"/>
</start-state>
<fork name="BeginRequest">
<transition to="RequesterCancel"/>
<transition to="IsChief"/>
</fork>
<decision name="IsChief">
<delegation class="kellerdu.jbpm.delegation.ChiefDecision"/>
<transition name="BossApprove" to="BossApprove"/>
<transition name="ChiefApprove" to="ChiefApprove"/>
</decision>
<state name="RequesterCancel">
<assignment swimlane="requester"/>
<transition name="cancel" to="Decided">
<action>
<!-- 请假的状态改变ؓ“取消”-->
<delegation class="kellerdu.jbpm.action.RequestCancel"/>
</action>
</transition>
</state>
<state name="ChiefApprove">
<assignment swimlane="chief"/>
<transition name="approve" to="NeedBossApprove">
<action>
<!-- 请假的状态改变ؓ“ȝ批准”-->
<delegation class="kellerdu.jbpm.action.ChiefApprove"/>
</action>
</transition>
<transition name="disapprove" to="Decided">
<action>
<!-- 请假的状态改变ؓ“ȝ否决”-->
<delegation class="kellerdu.jbpm.action.ChiefDisapprove"/>
</action>
</transition>
</state>
<state name="BossApprove">
<assignment swimlane="boss"/>
<transition name="approve" to="Decided">
<action>
<!-- 请假的状态改变ؓ“老板批准”-->
<delegation class="kellerdu.jbpm.action.BossApprove"/>
</action>
</transition>
<transition name="disapprove" to="Decided">
<action>
<!-- 请假的状态改变ؓ“老板否决”-->
<delegation class="kellerdu.jbpm.action.BossDisapprove"/>
</action>
</transition>
</state>
<decision name="NeedBossApprove">
<!-- 请假天数大于10天的要老板批准 -->
<delegation class="kellerdu.jbpm.delegation.NeedBossApproveDecision"/>
<transition name="need" to="BossApprove"/>
<transition name="notNeed" to="Decided"/>
</decision>
<join name="Decided">
<description>有一个先到达卌行父Token</description>
<delegation class="kellerdu.jbpm.delegation.DecidedJoin"/>
<transition to="DoSomething"/>
</join>
<decision name="DoSomething">
<description>
Ҏh的状态决定?br />
Q?Q?#8220;ȝ或者老板批准”Q?#8216;approve’Q修改员工休假的d敎ͼ讑֮发给用户E-Mail的信息?br />
Q?Q?#8220;ȝ或者老板否决”-“disapprove”Q设定发l用户EQMail的信息?br />
Q?Q?#8220;撤销”-"cancel"Q设定发l用户EQMail的信息。如果主批准,要发l主消息说明已l撤销?br />
</description>
<delegation class="kellerdu.jbpm.delegation.DoSomethingDecision"/>
<transition name="disapprove" to="Finished">
<action>
<delegation class="kellerdu.jbpm.action.Disapprove"/>
</action>
</transition>
<transition name="approve" to="Finished">
<action>
<delegation class="kellerdu.jbpm.action.Approve"/>
</action>
</transition>
<transition name="cancel" to="Finished">
<action>
<delegation class="kellerdu.jbpm.action.Cancel"/>
</action>
</transition>
</decision>
<end-state name="Finished"/>
<action event-type="process-end">
<!-- 发送EQMail消息l申误,记录请假日志 -->
<delegation class="kellerdu.jbpm.action.ProcessEndAction"/>
</action>
</process-definition>
Action指明的是当前状态要执行的一些额外的操作Q如记录log、发邮g{?br /> Q?QSwimline的delegation要做的就是判别当前Actor的n份?br /> package kellerdu.jbpm.delegation;
import org.jbpm.delegation.*;
import kellerdu.jbpm.LogsFactory;
import org.apache.commons.logging.Log;
public class BossSwimlane implements AssignmentHandler {
public BossSwimlane() {
}
/**
* 当前的状态有哪个actor来具体负责处理,选择是老板的actor来处理?br />
*
* 如果王林是老板Q那么他请假可以用他的名U来开始一个请假流E,当他查他需要批C的
* 请假Ӟ使用actorId=boss来找出所有的批示。这时selectActorq回的值就是一个常?#8220;boss”
*
*
* @param assignmentContext AssignmentContext
* @return String
* @todo Implement this org.jbpm.delegation.AssignmentHandler method
*/
public String selectActor(AssignmentContext assignmentContext) {
Log log = LogsFactory.getLogInstance(this.getClass());
log.info("d分配l老板");
return "boss";
}
}
Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=
ackage kellerdu.jbpm.delegation;
import org.jbpm.delegation.*;
import kellerdu.jbpm.LogsFactory;
import org.apache.commons.logging.Log;
public class ChiefSwimlane implements AssignmentHandler {
public ChiefSwimlane() {
}
/**
* selectActor
* @see BossSwimlane
*
* @param assignmentContext AssignmentContext
* @return String
* @todo Implement this org.jbpm.delegation.AssignmentHandler method
*/
public String selectActor(AssignmentContext assignmentContext) {
Log log = LogsFactory.getLogInstance(this.getClass());
log.info("d分配l上U主?);
return "chief";
}
}
Q二QDecision
package kellerdu.jbpm.delegation;
import org.jbpm.delegation.*;
import kellerdu.jbpm.LogsFactory;
import org.apache.commons.logging.Log;
import kellerdu.jbpm.Constants;
public class ChiefDecision implements DecisionHandler {
public ChiefDecision() {
}
/**
* 判断是否需要主批准,军_下一个要q行的transition
*
* @param executionContext ExecutionContext
* @return String
* @todo Implement this org.jbpm.delegation.DecisionHandler method
*/
public String decide(ExecutionContext executionContext) {
Log log=LogsFactory.getLogInstance(this.getClass());
String ac=(String)executionContext.getVariable(Constants.USER_NAME);
if(ac!=null&&(ac.equals("dali")||ac.equals("wang"))){
log.info(ac+"需要老板批准Q?);
return "BossApprove";
}else{
log.info(ac+"需要先l主批?);
return "ChiefApprove";
}
}
}
Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q?br />
Q三Qfork
package kellerdu.jbpm.delegation;
import org.jbpm.*;
import org.jbpm.delegation.*;
import org.jbpm.model.execution.*;
import java.util.*;
public class DecidedJoin implements JoinHandler {
public DecidedJoin() {
}
/**
* forkQ只要一个分支到达,卛_q行下一步操作,同时取消其它同时q行的分支?br />
* q里是用户如果取消Q请假就取消。如果用戯假批准,则用户不能取消?br />
*
* @param forkContext ForkContext
* @throws ExecutionException
* @todo Implement this org.jbpm.delegation.ForkHandler method
*/
public void join(JoinContext joinContext) throws ExecutionException {
Iterator it=joinContext.getConcurrentTokens().values().iterator();
Token arrivingToken = joinContext.getToken();
while(it.hasNext()){
Token to=(Token)it.next();
if(to.getId().equals(arrivingToken.getId())){
//取消其它执行的Token
joinContext.getExecutionService().cancelToken(to.getId());
}
}
// reactivate the parent token.
joinContext.reactivateToken( arrivingToken.getParent() );
}
}
Q一Q?nbsp;开始一个请假流E?br />
//user是请假h的actorId
ExecutionService es=JbpmServiceFactory.getInstance().openExecutionService(user);
HashMap vs=new HashMap();
//一些参?br />
vs.put(Constants.REQUEST_STATUS,String.valueOf(0));
vs.put(Constants.REQUEST_RETURN_INFO,"No info!");
vs.put(Constants.USER_NAME,EncodeTransfer.toISO(user));
vs.put(Constants.REQUEST_DAYS,String.valueOf(rea.getDays()));
try {
//开启请假流E?br />
es.startProcessInstance(Constants.WORK_NAME, vs);
log.info("["+user+"]"+"甌假期开始!请假"+rea.getDays()+"天!");
return am.findForward("main");
} catch (ExecutionException ex) {
ex.printStackTrace();
log.error("请假q程无法开始!");
return am.findForward("error");
}finally{
es.close();
}
Q二Q当前执行Q?br />
对于部门l理或者老板Q找到要处理的请假?br />
String actorId = (String) req.getSession().getAttribute(Constants.USER);
if(actorId.equals("wang")){
actorId="boss";
}else if(actorId.equals("bigli")){
actorId="chief";
}
// get the execution service
ExecutionService executionService = JbpmServiceFactory.getInstance().
openExecutionService(actorId);
// get the tasklist from jbpm for user
List tasks = new ArrayList();
// add the jbpm tasks
tasks.addAll(executionService.getTaskList(actorId));
// put the tasklist into the form
mf.setTasks(tasks);
// get the tasklist from jbpm for user
List definitions = new ArrayList();
// add the jbpm definitions
definitions.addAll(executionService.getLatestDefinitions());
// put the tasklist into the form
mf.setRequests(definitions);
// close the execution service
executionService.close();
req.getSession().setAttribute("mainForm",mf);
log.debug("d: " + tasks);
log.debug("当前可以执行的请? " + definitions);
Q三Q处理请?br />
String actorId = (String) reqrest.getSession().getAttribute(Constants.
USER);
Long tokenId=new Long(req.getParameter("tokenId"));
// get the execution service
ExecutionService executionService = JbpmServiceFactory.getInstance().
openExecutionService(actorId);
Map hm=executionService.getVariables(tokenId);//变量
String act=req.getParameter("action");//q行转换的transition
executionService.endOfState(tokenId,hm,act);
executionService.close();
内容Q?br />
jPDL的流E定义元?
W一层:GraphElement
q个Ҏ理解,因ؓ在画程定义?每个拖拉的对象都是一个graph的元?
GraphElement有四个属?1)processDefine 表示当前元素属于哪个程定义
2)events 表示可以接收哪些event
3)name 名字
4)exceptionHandlers 异常处理c集?List)
W二层:node;processDefinition;Transition;Task 它们都inherited from GraphElement
1)processDefinition表示程定义(implements NodeCollection),它有下面的属?name,version,nodes,startState nodes表示程中所有的node,startState用于启动程时找到首节点
2)Transition表示转移,它有三个属?from(Node),to(Node),supportedEventTypes表示支持的eventcd
3)node表示节点,它有四个属?leaving transitions;arriving transitions;action;superState
4)Task 定义d
W三层:各种不同的node,它们都inherited from node decision;EndState;Fork;Join;Merge;Milestone; InterleaveEnd;InterleaveStart;ProcessState;State q些都是见名知义,和xpdl差不?
jbpm的Token
jbpm中最重要的概?应该是o?Token)和信?Signal)
在整个流E实例运行过E中,我们可以q速的利用token得到其当前的current state。在解决“q行”{(比如ForkQ问题时QjBpm让Token对象l护了父子关p,q种关系在涉及到Fork的时候会产生?jBpm让Tokenq个对象w兼了多U命:Q?Q快速定位current state Q?Q用于fork,join法 Q?Q用于告知Q务执行者的d索引?
如下代码:
//pd是process definition,pi是process instance ProcessInstance
pi = new ProcessInstance( pd );
//得到根o?
Token token = pi.getRootToken();
//发信?
token.signal();
Token的signalҎ也可以传入transition参数,q个Ҏ把信令发送给Token,q样,令牌被Ȁz?q沿指定的transitiond当前的状?如果没有指定transition,沿~省的transition d当前状?.
jbpm是怎么实现的呢?其实很简?
1)Token记录了当前的状态(current stateQ?只有当前的状?或称节点)拥有该o?
2)向TOKEN发signal?当前状态收到该signal
3)当前状态把令牌传给signal中指定的transition
4)transition收到令牌?不强?马上把o牌传l下个状?
5)Ҏ令牌的位|?程的状态已l发生改?
1、process definition
一个process definition代表了一个正式的业务程Q它以一个流E图为基。这个流E图?许多node和transitionl成。每个node在这个流E图里都有着各自Ҏ的类型,q些不同的类型决定了node在运行时的不同行为。一个process definition只有一个start state ?
2、token
一个token代表了一条执行\径,它包含了q条执行路径的当前的执行状态(current stateQ?
3、process instance
一个process instanceQ流E实例)即一个process definitionQ流E定义)的流E执行实例。一个process definition可以对应多个process instance。当一个process instance被创建的时候,一个主执行路径token同时被创建,q个token叫做root tokenQ它指向程定义的start stateQprocessDefinition.getStartState()==token.getNode()Q?
4、signal
一个signal 发送给token通知token l箋程的执行。如果signal 没有指定transitionQtoken沿~省的transitiond当前状?如果signal 指定transitionQtoken沿指定的transitiond当前的状态。看源代码可以看到发lprocess instance的signal 其实都是发送给了root token?
5、Actions
jbpm提供了灵zȝaction Q当程执行Qtoken q入node和transitionӞ会触发相应的一些eventQ事Ӟ。在q些event上附上我们自己写的actionQ就会带动action 的执行。action里是我们自己的相关java操作代码Q非常方ѝ注意的是eventQ事Ӟ是内|的Q无法扩展。另外,action也可以直接挂在node上,而不依赖于eventQ事Ӟ的触发,q个很重要!
Node
一个流E图p多node和transitionl成。每个node都有一U类型,q个cd军_了当程执行到这个node时的不同行ؓ。jbpm有一lnode type可以供你选择Q当然你可以定制自己node ?
node的作?
node有两个主要的作用Q?
1Q执行java代码Q比如说创徏task instanceQQ务实例)、发出通知、更新数据库{等。很典型的就是在node 上挂上我们的action
2) 控制程的执行:
A、等待状?
程q入到这个node时将处于{待状态,直到一个signal 的发?
B、流E将沿着一个leaving transition过q个node
q种情况Ҏ一点,需要有个action挂在q个node上(注意q个action不是event触发的!Q,action中将会调用到API?
executionContext.leaveNode(String transitionName)QtransitionName卌里的leaving transition名字?
C、创建新的执行\?
很典型的是fork node。流E在q里会分叉,产生新的执行路径。这样就创徏了新的tokenQ每个新的token代表一个新的执行\径。注意的是,q些新的token和生前的token是父子关p!
D、结束执行\?
一个node可以l束一条执行\径,q同h味着相应的token的结束和程的结束?/p>
程图中的node type
1、task-node
一个task-node可以包含一个或多个taskQ这些task分配l特定的user。当程执行到task-nodeӞtask instance会被创建,一个task对应一个task instance。task instances 创徏后,task-node处于等待状态。当所有的task instances被特定的user执行完毕后,会发出一个新的signal 到tokenQ即程l箋执行?
2、state
state是一个纯_的wait state({待状态)。它和task-node的区别就是它不会创徏task instances。很典型的用法是Q当q入q个节点Ӟ通过l定一个action到node-enter eventQ,发送一条消息到外部的系l,然后程处于等待状态。外部系l完成一些操作后q回一条消息,q个消息触发一个signal 到tokenQ然后流El执行。(不常用)
3、decision
当需要在程中根据不同条件来判断执行不同路径Ӟ可以用decision节点。两U方法:最单的是在transitions里增加condition elementsQ条ӞQcondition是beanshell script写的Q它q回一个boolean。当q行的时候,decision节点会在它?leaving transitions里@环,同时比较 leaving transitions里的conditionQ最先返?true'的conditionQ那个leaving transitions会被执行;作ؓ选择Q你可以实现DecisionHandler接口Q它有一个decide()ҎQ该Ҏq回一个String(leaving transition的名字)?
4、fork
fork节点把一条执行\径分L多条同时q行Qƈ发)的执行\径,每条dfork节点的\径生一个子token?
5、join
默认情况下,join节点会认为所有到达该节点的token都有着相同的父token。join 节点会结束每一个到达该节点的token,当所有的子token都到达该节点后,父token会激zR当仍然有子token处于zd状态时Qjoin 节点是wait state({待状态)?
6、node
node节点是让你挂自qaction用的Q注意:不是event触发Q!Q,当流E到达该节点Ӟaction会被执行。你的action要实现ActionHandler接口。同P在你的action里要控制程Q?/p>
Actions的说?
存在两种actionQ一U是 event触发的actionQ一U是挂在node 节点的action。要注意它们的区别,event触发的action无法控制程Q也是说它无法军_程l过q个节点后下一步将到哪一个leaving transitionQ而挂在node 节点的action׃同,它可以控制流E。不是哪一Uaction都要实现ActionHandler接口?
variable的管?
程实例?存有contextInstance来管理token和variable.
contextInstance是通过一个map来进行管理的,q个map的key是token,value是一个TokenVariableMap的对?
TokenVariableMap本nq不是个map,而是一个普通的Object
TokenVariableMap有三个属?一个是contextInstance,一个是Token对象本n,q有一个是
一个Map,用来放variableInstance,q个Map的名UCؓvariableInstances.
variableInstances是一个map,它的key是variable的名U??a",value是一个VariableInstance对象,VariableInstance对象放了四个属?一个是token对象本n,一个是variable的名U?一个是TokenVariableMap对象Q还有一个是processInsance,你可能会奇怪:variable的value攑ֈ哪里呢?实际上VariableInstance是一个抽象类Q具体的实现是它Ҏvalue的classcd选择它的子类Q子cM有个属性叫value。这个variable的value,?new Integer(3).
一个流E实例可以有多个Token,Token间是有父子关pȝ:
Token tokenAB=new Token(tokenA,"ab");
上行代码的意思是在tokenA下面建立一个TokenAB,该新建的
Token的名字是"ab".
ci.createVariable(tokenA, "a", new Integer(3));
表示在tokenA范围内徏立一个variable,它的名称?a",
gؓnew Integer(3)
建立q个variable?tokenA下面的token都可以看到该
variable,而上面的token则看不到.
只有createVariable可以在某个token上徏立variable,其它?
Ҏ只可以在rootToken上徏立variable.
?ci.setVariable(tokenA, "a", new Integer(3));
其实是在rootToken上徏立了一个名UCؓ"a"的variable
Map variables = new HashMap();
variables.put("a", new Integer(3));
variables.put("b", new Integer(4));
ci.addVariables(variables);
上面四行代码在rootToken上徏立了两个variable.
实际上在ExecutionContext中只有两个方法:
public void setVariable(String name, Object value) {
getContextInstance().setVariable(name, value, token);
}
public Object getVariable(String name) {
return getContextInstance().getVariable(name, token);
}
可以在子token中修改父token中徏立的variable.
TaskQQ务)
jbpm一个相当重要的功能是对Q务进行管理?
TaskQQ务)是流E定义里的一部分Q它军_了task instance的创建和分配?
TaskQQ务)可以在task-node节点下定义,也可以挂在process-definition节点下。最普遍的方式是在task-node节点下定义一个或多个d。默认情况下Q流E在task-node节点会处于等待状态,直到所有的d被执行完毕。Q务的名称在整个流E中必须是唯一的?
一个TaskNode对应多个Task
对于q样的流E定义:
只有当节点中的三个Q务都完成后,程才进入后面的节点
对于q样的流E定义:
>
当第一个Q务完成后Qtoken指向后面的节点
对于q样的流E定义:
>
三个d都完成后Qtoken仍然不会指向后面的节点;需要自己手动调?
processInstance.signal()才会驱动程C面的节点
对于q样的流E定义:
>
token不会在本节点停留Q而是直接到后面的节点
jbpm的Q务管理实?
一个Task instanceQQ务实例)可以被分配给一个actorId (java.lang.String)。所有的Task instance都被保存在数据库中的表jbpm_taskinstance里。当你想得到特定用户的Q务清单时Q你可以通过一个与用户兌的actorId来查询这张表?
一个流E定义有一个TaskMgmtDefinitionQ一个TaskMgmtDefinition对应多个swimlane,同时对应多个task;一个swimlane有多个task,可以从TaskMgmtDefinition中通过task的名U直接获取相应的task;
swimlane对象有四个属性,分别是nameQ名字)、assignmentDelegationQ分配代理类Q、taskMgmtDefinition、tasksQSet 对应多个task),可以增加task
task对象主要的属性:taskMgmtDefinition、swimlane、assignmentDelegation、taskNodeQ需要注意的是swimlane和assignmentDelegation中间只是可以一个属性有|因ؓ它们都和d的分配有关系?
一个流E实例有一个TaskMgmtInstanceQ一个TaskMgmtInstance对应多个swimlaneInstance,同时对应多个taskInstance;一个swimlaneInstance有多个taskInstance,可以从TaskMgmtInstance中直接获取相应的taskInstance;
swimlaneInstance对象主要有五个属性,分别是name、actorId、pooledActorsQSetQ、swimlane、taskMgmtInstance?
taskInstance对象的主要属性:name、actorId、task、swimlaneInstance、taskMgmtInstance、pooledActors?
当对dq行分配Ӟ一般需要实现AssignmentHandlerq个接口Q这个接口的Ҏ只有一个:
void assign( Assignable assignable, ExecutionContext executionContext ) throws Exception;
一个典型的实现Q把名字?change nappy'的Q务交lNappyAssignmentHandlerq个cL分配Q?
NappyAssignmentHandlerc:
public void assign(Assignable assignable, ExecutionContext executionContext) {
assignable.setActorId("papa");
}
同样QAssignable只是一个接口,它有两个ҎQsetActorId()和setPooledActors()QAssignable的具体实现类也是两个
swimlaneInstancehe和taskInstance。这样就不不隄解整个Q务分配流E了Q?
1、流E进入TaskNode节点Q执行TaskNodecȝexecute()ҎQ该Ҏ首先获得TaskMgmtInstance实例Q然后通过它来创徏TaskInstance。taskMgmtInstance.createTaskInstance(task, executionContext);
2、在上面的createTaskInstance(task, executionContext)里,该方法调用了taskInstance.assign(executionContext)对taskInstanceq行分配?
3、在assign(executionContext)Ҏ里,首先会判断task属性里是否存在swimlaneQ如果有的话Q这个taskInstance׃分配lswimlane指定的ActorId?PooledActorsQ如果不存在Q再Ltask属性里 assignmentDelegationQ分配代理类Q通过代理c(x们自己写的实现AssignmentHandlerq个接口的类Q指定ActorId?PooledActors?
jbpm的用戯色管?
jbpm在用戯色管理上p计了四个c:Entity?Membership?Group?User
EntitycL其他三个cȝ父类Q它包含了两个属性:name(String)?permissions(Set)
Usercȝ承Entityc,包含三个属性:password(String)?email(String)?memberships(Set)
Groupcȝ承Entityc,包含四个属? type(String) 、parent(Group)?children(Set)?memberships(Set)
Membershipcȝ承Entityc,包含三个属?role(String)?user(User)?group(Group)
很明显,一个user对应一个用P一个group对应一个用LQ它们之间通过membership兌Qƈ且一个user可以属于多个不同cdQtype)的groupQuser?group之间是多对多的关pR?
Membershipcȝrole属性个人感觉用途不大,反倒是name属性代表了user在group里的roleQ角ԌQ?/p>
Generated by Bo-blog 2.0.2 RC 1
JBPM中是通过org.jbpm.db. JbpmSessionFactory.getInstance()q回一?/span>JbpmSessionFactory实例Q?/span>
下面通过分析getInstance()的过E,说明怎么讄相关配置文g
1?/span>JbpmSessionFactory.getInstance()Ҏ首先查找c\径中?/span>jbpm.properties文g
jbpm.scheduler.service.factory=org.jbpm.scheduler.impl.SchedulerServiceImpl jbpm.task.instance.class=org.jbpm.taskmgmt.exe.TaskInstance # uncomment the next line if JbpmSessionFactory.getInstance() # should lookup the singleton instance from JNDI instead of creating # a default one. # jbpm.session.factory.jndi.name=java:/jbpm/JbpmSessionFactory # uncomment the next line to use the file system instead of the database for # storing files related to a process definition # # jbpm.files.dir=c:/jbpm.data # resource path to a properties file that will overwrite all the hibernate # properties. For database specific builds in db project there is a different # hibernate.properties file on the classpath for each database. You could change # the default database for any testing runs by uncommenting the next line and # adding a hibernate.properties file in the basedir. # jbpm.hibernate.cfg.xml=jbpm.hibernate.cfg.xml jbpm.hibernate.properties=jbpm.hibernate.properties |
扑ֈ最基本的设|,jbpm.session.factory.jndi.name=java:/jbpm/JbpmSessionFactory
q行表示?/span>jndi获取一?/span>JbpmSessionFactory的一个实例,如果你可以用JBPM3 demo?/span>java:/jbpm/JbpmSessionFactory是与DataSource DefaultDSl定在一LQ在jboss-service.xml中)。要部v?/span>tomcat中,q行必须注释掉?/span>
<?xml version="1.0" encoding="UTF-8"?> <server> <mbean code="org.jbpm.db.jmx.JbpmService" name="jboss.jbpm:name=DefaultJbpm,service=JbpmService" description="Default jBPM Service"> <attribute name="JndiName">java:/jbpm/JbpmSessionFactory</attribute> <depends>jboss.jca:service=DataSourceBinding,name=DefaultDS</depends> </mbean> </server> |
jboss-service.xml文g内容Q如果你用源码包成功部v?/span>websale的话Q可以在JBOSS_HOME"server"jbpm"deploy"jbpm.sar"META-INF"目录下找到该文g
2、如?/span>getInstance()没有扑ֈjbpm.session.factory.jndi.name的|会l查?/span>jbpm.hibernate.properties的|扑ֈjbpm.hibernate.properties的值后Q会用该g为配|文件取创徏JbpmSessionFactory
jbpm.hibernate.properties内容Q?/span>
hibernate.dialect=org.hibernate.dialect.HSQLDialect hibernate.connection.datasource=java:/DefaultDS # hibernate.show_sql=true |
是用DataSource来创?/span>JbpmSessionFactoryQ?/span>DataSource需要在Server.xml中配|,如果你不想配|?/span>DataSource的话Q把q行也注释掉
3、上面两内定w被注释掉的话Q?/span>getInstance()会查?/span>jbpm.hibernate.cfg.xml的|用该g为配|文件创Z?/span>JbpmSessionFactory?/span>
说明Q这里只是讲了怎么配置相关文gQ没有说到怎么部vQ关于这斚w内容Q请参?/span>User Guide chapter 5
hibernate.cfg.xml、jbpm.cfg.xml在关联spring后保持不变,只需要更改spirng的配|文件就好了?
其中
很关键,我就是想spring会通过jbpm扑ֈhibernate.cfg.xml而没有设|,才失败的?
jBPM is an embeddable BPM engine, which means that you can take jBPM and embed it into your own java project, rather then installing a separate product and integrate with it. One of the key aspects that make this possible is minimizing the dependencies. This chapter discusses the jbpm libraries and their dependencies.
jBPM是一个嵌入式的BPMQ业务程序管理)引擎。本章讨论jbpm库和它的依赖库?/p>
jBPM 3 requires J2SE 1.4.2+
jbpm-[version].jar is the library with the core jbpm functionality.是jbpm的核心功能库?/p>
jbpm-identity-[version].jar is the (optional) library containing an identity component as described in Section 11.11, “The identity component”.
可选的Q这个库包含了n份验证组件。用于流E的参与者的理?/p>
In a minimal deployment, you can create and run processes with jBPM by putting only the commons-logging and dom4j library in your classpath. Beware that persisting processes to a database is not supported. The dom4j library can be removed if you don't use the process xml parsing, but instead build your object graph programatically.
最的jbpm部vQ只需要核心jbpm库和commons-logging库,以及dom4j库到你的classpath中。此Ӟ不支持持久化业务E序到数据库?/p>
Table 5.1.
Library?/span> |
Usage用?/span> |
Description描述 |
Directory目录 |
commons-logging.jar |
logging in jbpm and hibernate |
The jBPM code logs to commons logging. The commons logging library can be configured to dispatch the logs to e.g. java 1.4 logging, log4j, ... See the apache commons user guide for more information on how to configure commons logging. if you're used to log4j, the easiest way is to put the log4j lib and a log4j.properties in the classpath. commons logging will automatically detect this and use that configuration. |
lib/jboss (from jboss 4.0.3) |
dom4j-1.6.1.jar |
process definitions and hibernate persistence |
xml parsing |
lib/dom4j |
A typical deployment for jBPM will include persistent storage of process definitions and process executions. In that case, jBPM does not have any dependencies outside hibernate and its dependent libraries.
典型的jBPM部v包括持久化业务程序定义和执行的功能?需要Hibernate
Of course, hibernate's required libraries depend on the environment and what features you use. For details refer to the hibernate documentation. The next table gives an indication for a plain standalone POJO development environment.
下面的表l出了简单的标准POJO部v环境需要的W三方库?/p>
jBPM is distributed with hibernate 3.1 final. But it can also work with 3.0.x. In that case, you might have to update a few hibernate queries in the hibernate.queries.hbm.xml configuration file. For more info about customizing queries, see Section 7.6, “Customizing queries”
Table 5.2.
Library?/span> |
Usage |
Description |
Directory |
hibernate3.jar |
hibernate persistence |
the best O/R mapper |
lib/hibernate (hibernate 3.1 final) |
antlr-2.7.5H3.jar |
used in query parsing by hibernate persistence |
parser library |
lib/jboss (from jboss 4.0.3) |
cglib-2.1_2jboss.jar |
hibernate persistence |
reflection library used for hibernate proxies |
lib/jboss (from jboss 4.0.3) |
commons-collections.jar |
hibernate persistence |
lib/jboss (from jboss 4.0.3) |
|
ehcache-1.1.jar |
hibernate persistence (in the default configuration) |
second level cache implementation.二~存实现?/span> When configuring a different cache provider for hibernate, this library is not required. |
lib/hibernate |
jaxen-1.1-beta-4.jar |
process definitions and hibernate persistence |
XPath library (used by dom4j) |
lib/hibernate |
jdbc2_0-stdext.jar |
hibernate persistence |
lib/hibernate |
|
asm.jar |
hibernate persistence |
asm byte code library 二进制代码修改库 |
lib/hibernate |
asm-attrs.jar |
hibernate persistence |
asm byte code library |
lib/hibernate |
The beanshell library is optional. If you don't include it, you won't be able to use the beanshell integration in the jbpm process language and you you'll get a log message saying that jbpm couldn't load the Script class and hence, the script element won't be available.
Beanshell库是可选的?/p>
Table 5.3.
Library |
Usage |
Description |
Directory |
bsh-1.3.0.jar |
beanshell script interpreter |
Only used in the script's and decision's. When you don't use these process elements, the beanshell lib can be removed, but then you have to comment out the Script.hbm.xml mapping line in the hibernate.cfg.xml |
lib/jboss |
Chapter 2. Getting startedh
This chapter takes you through the first steps of getting JBoss jBPM and provides the initial pointers to get up and running in no time.
初始化JBpm3.12
2.1. Downloadables Overview
Listed below are the different jBPM packages that are available today. Each of these packages contains one or more downloadable files. Along with each of these files goes a description of its contents and a pointer to any relevant installation instructions if they are available.
All downloads described below can be found on the sourceforge jbpm downloads page.
2.1.1. jBPM 3
Download JBoss jBPM 3 at sourceforge.net. This is the main distribution package containing the core engine and a number of additional modules that you may need to work with jBPM. 包括JBpm核心和其他包?/span>
包含了包括图形化设计器在内的所有模块,能够帮助你快速启动?/span>
核心Q包括核心引擎和w䆾l徏Q内有用h南文档?/span>
2.1.2. jBPM Process Designer
jBPMq程设计?/span>
Download JBoss jBPM Process Designer at sourceforge.net. The designer is an eclipse plugin and enables you to author 创作your process definitionsq程定义 and to easily deploy them. The plug-in is available for download either as a zipped Eclipse feature or as a zipped Eclipse update site. There is no difference in content, the only difference is in the way you have to do the installation.
使用本地站点更新方式部v?/span>
q个是手工部|Ӏ?/span>
2.1.3. jBPM BPEL extension
Download JBoss jBPM BPEL extension at sourceforge.net. It contains only one file : jbpm-bpel-<version>.zip. To get started with the BPEL extensions, look in the User's Guide in the 'doc' subfolder of the toplevel folder.
jbpm-bpelQ含?/span>JBoss jBPM?/span>BPEL扩展件方面的信息?/span>
BPEL是一个规范的SOAlg。因ZJBoss jBPM使用的许可证不同Q所以被独立了出来?/span>
2.2. The JBoss jBPM project directory
2.3. CVS access
2.3.1. Anonymous CVS access
Alternatively, you can get JBoss jBPM from cvs with the following information:
2.3.2. Developer CVS access
To get cvs developer access, you must sign contributors agreement and you need an ssh key. More information on both can be found on the JBoss cvs repository wiki page
目录
W一?/span>l论
JBoss jBPM 是一个灵zȝQ易扩展的工作流理pȝ?/span>JBoss jBPM有一套直观的程建模语言Q这套语a能用dQ?/span>taskQ,异步通信的等待状态(wait state Q,定时器(timerQ,自动化的动作Q?/span>automated actionQ等来图形化的表CZ务流E。ؓ了把q些操作集成在一
PJBoss jBPM拥有强大的,易扩展的控制程机制?/span>
JBoss jBPM对外依赖E度很小Q你完全可以像用java的类库一L它。ƈ且它也可以被部v在高性能?/span>J2EE集群应用服务器上?/span>
JBoss jBPM能配|在M数据库上Qƈ且能被部|在M的应用服务器上?/span>
1.1 总览
工作和业务程处理功能的核心部分被打包成一个简单的javacd。这个类库包括了q样一个服务:程信息的存储,更新Q和从数据库中重新取回?/span>
?/span>1.1Q?/span>JBoss jBPMl成模块的概略图
1.2 JBoss jBPM starter kit
starter kit是一个包?/span>jbpm所有模块的下蝲包。这个下载包中包括以下模块:
· jbpm-server, 一个预选配|好的jboss应用服务器?/span>
· jbpm-designer, 囑Ş化定制流E的eclipse插g?/span>
· jbpm-db, jBPM的数据库兼容?(见后边论q??/span>
· jbpm, jbpm的核心模块,其中包括libs文g夹和q个用户说明?/span>
· jbpm-bpel, JBoss jBPM对BPEL扩展的一些参考资?/span>
预先配置好的JBoss应用服务器具有如下组成部分:
jBPM核心模块
Q被打包成一个用于提供服务的存档文g带有jbpm表的集成数据?/span>Q默认的hypersonic数据库拥?/span>jbpm表,q且q个表已l拥有一个流E了?/span>
Jbpm?/span>web控制?/span>Q它既可以被Jbpm理员用也可以被程的参与者用?/span>
执行定时器的Jbpm的调度程序,q个调度E序?/span>starter kit里边被配|成一?/span>servlet。这?/span>servlet会生一个新的线E来监视和执行定时器?/span>
一个具体流E的例子Q它已经被部|在jbpm数据库中了?/span>
1.3 JBoss jBPM 程囑Ş定制?/span>
JBoss jBPMq拥有一套图形化的设计工兗这个设计器是一个图形化的业务流E定制工兗?/span>
JBoss jBPM程囑Ş定制器是eclipse的一个插件。单独安装这个定制器非常单?/span>
q个囑Ş设计器最重要的特性是Q业务分析h员也能像技术开发h员一L它来完成d。这使得业务程建模能^滑的转换到具体技术实现?/span>
q个插g可以利用eclipse的一般升U机刉过一个升U站点得到安装(zip文g格式Q。也可以通过解压一个特定的包到eclipse的安装目录来安装此插件?/span>
1.4 JBoss jBPM的核心模?/span>
JBoss jBPM的核心模块是一个用来管理流E定义和程实例的执行环境的普?/span>javaE序?/span>
JBoss jBPM是一?/span>javacd。所以它可以被用在Q?/span>java环境中,比如Q?/span>web应用E序Q?/span>swing应用E序Q?/span>EJBQ?/span>web service……?/span>JBPMcdq可以被打包q被当成无状态会?/span>EJBQ?/span>stateless session EJBQ用。这样可使它被部|在集群上ƈ且适应高性能应用。这些无状态会?/span>EJB必须W合J2EE1.3规范q样才能使它可以被部|在M应用服务器上?/span>
JBoss jBPM的核心模块被打包成一个简单的java库文件。依你功能的需要,jbpm-3.0.jarq个库文件对一些第三方的类库比?/span>hibernate, dom4j有所依赖。这些依赖在W五章(部vQ中作了详细的说明?/span>
至于持久化,JBPM在内部用?/span>hibernate。除了传l的O/R映射功能Q?/span>hibernateq解决了不同数据SQL dialect差异的问题,q?/span>JBPM能适应现在所有的数据库?/span>
JBoss jBPM API可以被你工程中Q何的java代码调用Q比如,你的web应用E序Q?/span>EJBQ?/span>web service 模块Q消息驱?/span>bean或其它Q?/span>java模块?/span>
1.5 JBoss jBPM web应用E序的控制台
jBPM web应用E序的控制台提供两种服务。首先,它被用来当作一个用来和程执行q程中生的dq行交互的主要用h口,其次Q它q是一个用来检查和操作q行实例的管理和监控q_?/span>
1.6 JBoss jBPM人员l织模块
JBoss jBPM可以和Q何包括h员和其他l织信息的公司结构集成在一赗但是对那些l织l构信息模块很难获取的项目,JBoss jBPM提供了这个模块。这个模块用的模型要比传统?/span>servlet, ejb,portlet模型丰富的多?/span>
更多信息Q请参照W九章第九节人员l织模块
1.7 JBoss jBPM调度E序
JBoss jBPM调度E序是一个用来监和执行在流E执行过E中讄的定时器的模块?/span>
定时器模块被打包?/span>jbpm的核心包中,但是它必被部v在以下环境中Q或者你必须订制一个调?/span>servletQ它来生一个监线E,或者你必须启动一个单独的JVM来执行调度程序?/span>
1.8 JBoss jBPM 数据库兼容包
JBoss jBPM 数据库兼容包是一个下载包Q它包括所有的资料Q?/span>drivers?/span>scripts,用这些你可以?/span>jbpmq行在你选择的数据库上?/span>
1.9 JBoss jBPM BPE的扩?/span>
JBoss jBPM BPE的扩展是一个ؓ了支?/span>BPEL独立的扩展包?/span>BPEL的本质就是一l用来参照别?/span>web service?/span>web service?/span>xml脚本语言?/span>