JBPM数据库中每一个表都有一个主键-ID(Long类型)。这个ID是可以由用户自己产生,也可以由JBPM产生。这个数值在所有表的ID中是唯一的。用户通过设定jbpm.id.generator属性来设定id产生的类。
(一)JBPM ID生成基本原理和函数
JBPM中ID产生的基本原理是:用表JBPM_SEQUENCEBLOCK存储当前可用的ID值,JBPM需要使用ID时,从数据库中取得这个ID,然后增加一定的数量作为当前可用ID值,并存储在数据库中。JBPM的ID可以用于服务器集群的情况。hibernate中产生ID的函数IncrementGenerator,原理与JBPM产生ID相似,但不能应用到集群的情况。
JBPM_SEQUENCEBLOCK表有两个字段ID和NextID,前者为主键,表示当前节点在集群中的ID号码,后者为当前节点可以使用数据段的最小数。表由类org.jbpm.persistence.hibernate.SequenceBolck代表,org.jbpm.persistence.hibernate.SequenceBolckIdGenerator维护。
SequenceBolckIdGenerator主要函数:
(1) public SequenceBlockIdGenerator(JbpmConfiguration jbpmConfiguration)
初始化,包括初始化nodeId 和blockSize变量。nodeId指明当前的节点在集群中的Id号(0-65535),用户可以通过jbpm.id.nodeId设定,缺省值是0。BlockSize指明当前节点使用长整形数段的一个数据块大小,用户可以通过jbpm.id.bolckSize设定,缺省值是100。
(2) public long getNextId() //得到当前可用ID,JBPM使用它得到ID
{
return getNextId(sessionFactory, nodeId, blockSize);
}
(3)public static synchronized long getNextId(SessionFactory sessionFactory,
long nodeId, long blockSize)
最重要的函数,用于计算当前可用ID。
(二)ID产生算法
基本思路:将1-Long.MaxValue范围内数,按大小blockSize*MaxNodes分段,然后再将每一段按blockSize大小分成MaxNodes块,各节点按照节点号分块使用,如节点号为0的只能使用第一块,节点号为1的使用第二块,依次类推。MaxNodes为当前集群中的节点总数,为65535。
取值算法:
(1) 取出节点当前可以使用数块的首数(块的最小数);
(2) 首数+blockSize×NodeId(节点号码,0-65535)为当前可以使用的Id(nextId);
(3) nextId+blockSize-1为当前可以使用的最后一个Id(lastId)
(4) 调用getNextId()函数时,如果nextId<=lastId,则返回nextId,然后将nextId++;否则取出下一数据块进行1-3的计算。
说明:
(1) 读取一次数据库,可以使用blockSize个Id,不用每次使用ID都读取一次数据库。
(2) 表的NextID字段存储的是当前可使用块而不是使用过块的首数。每个节点使用块的首数按节点号码分别存储。
(3) 对于每一个数块,每个节点只使用其中一部分,范围是(首数+blockSize×NodeId)-(首数+blockSize×(NodeId+1)-1),从而保证了每个节点使用的ID值在数据库中是唯一的。
(三)数据库连接Session
为了保证产生ID的唯一性,JBPM要求对表JBPM_SEQUENCEBLOCK进行操作的数据库Session必须是独立的,不能用于其它的数据库操作。如果JBPM使用数据库连接池,则必须要设定jbpm.id.generator.configuration属性,提供进行数据库直接连接的hibernate配置文件。默认情况下,JBPM使用一个全局静态Session进行除JBPM_SEQUENCEBLOCK以外表的操作,而对JBPM_SEQUENCEBLOCK表进行操作的Session是在类SequenceBolckIdGenerator初始化时临时建立的。.
分享到:
相关推荐
JBPM_PROCESSDEFINITION表是jbpm数据库的核心表之一,它存储了流程定义的信息。该表的字段包括: * ID_:流程定义的唯一标识 * NAME_:流程定义的名称 * VERSION_:流程定义的版本号 * ISTERMINATIONIMPLICIT_:...
jBPM源码分析jBPM源码分析jBPM源码分析jBPM源码分析
- 创建一个名为jbpm的数据库,这将是jbpm存储流程数据的地方。 - 修改jbpm-jpdl-3.2.3\db目录下的jbpm.jpdl.mysql.sql文件,为每个SQL语句末尾添加分号,以便正确执行脚本。 4. **jbpm-jpdl-suite-3.2.3部署**: ...
jbpm-jpdl-suite-3.2GA -(5)分开压缩(共5个文件)jbpm下载 jbpm-jpdl-suite-3.2GA -(5)分开压缩(共5个文件)jbpm下载
2. 根据你的数据库环境,运行db目录下的SQL脚本来创建jBPM所需的表。 3. 修改config目录下的配置文件,如hibernate.cfg.xml,配置数据库连接参数。 4. 如果需要自定义流程,可以在Eclipse中安装jbpm-jpdl-designer-...
该表通过 dbid 字段关联到 jbpm4_deployment 表,並且提供了主键生成机制。 jbpm4_property jbpm4_property 表用于为运行时需要持久化的对象生成 dbid,其记录当前所有对象实例的最大值,每次需要生成 dbid 时,...
jbpm-starters-kit-3.1.2插件,jbpm-starters-kit-3.1.2插件,jbpm-starters-kit-3.1.2插件,jbpm-starters-kit-3.1.2插件,jbpm-starters-kit-3.1.2插件,jbpm-starters-kit-3.1.2插件,共两卷
- **持久化机制**:介绍JBPM如何利用数据库存储流程实例和变量,确保数据安全和流程恢复。 4. **平台特性:JBPM_(4)_Platform.ppt** - **jbpm-gwt-console**:一个基于GWT的Web管理控制台,用于监控和管理流程...
jbpm-jpdl-designer-site-3.1.7.zip jbpm-jpdl-designer-site-3.1.7.zip jbpm-jpdl-designer-site-3.1.7.zip
jbpm-workitems-5.1.0.Final-sources.jar jbpm5 源码
jbpm-jpdl-suite-3.2.3.zipjbpm-jpdl-suite-3.2.3.zipjbpm-jpdl-suite-3.2.3.zipjbpm-jpdl-suite-3.2.3.zipjbpm-jpdl-suite-3.2.3.zipjbpm-jpdl-suite-3.2.3.zipjbpm-jpdl-suite-3.2.3.zipjbpm-jpdl-suite-3.2.3....
- **数据库映射**:这些命令类在数据库中被映射到同一个表`JBPM_MESSAGE`,但通过`CLASS_`字段区分不同的命令类型。 - **`CommandExecutorThread`**:这是一个专门用于执行命令的线程,确保命令能够异步处理。 ####...
jbpm-jpdl-suite-3.2.GA.zip
3. **实体与持久化**:分析实体类和数据库表结构,理解jBPM4如何存储流程实例、任务和变量。 4. **任务处理**:研究任务服务接口(TaskService)的使用,掌握如何分配、领取和完成任务。 5. **监听器和回调**:查找...
**jbpm5.2学习1——安装与配置** jbpm(Java Business Process Management)是一款开源的工作流管理系统,它提供了一套完整的...同时,由于jbpm提供了源码,开发者可以深入研究其内部机制,定制更适合自身需求的功能。
jbpm-4.3-src.rar_bdf-jbpm4 src _jboss 4.3_jboss jbpm4.3_jbpm-4.3 这个压缩包文件包含的是JBOSS jBPM4.3的源代码,这是一个用于业务流程管理(BPM)的开源框架。jBPM是一个强大的工具,它提供了流程定义、执行和...
jbpm-bpmn2-5.1.0.Final.jar jbpm5
"jbpm-jpdl-designer-nodeps-3.1.4" 是一个针对Jbpm工作流管理系统中的JPDL设计工具的无依赖版本,主要用于创建和编辑JPDL(Jbpm Process Definition Language)文件。该资源包含了该工具的详细文档、许可证协议以及...
**jbPM4_app-first** 是一个基于 **jBPM4** 的应用程序示例,它提供了对业务流程管理(Business Process Management)的...此外,源码分析有助于加深对 jBPM4 内部机制的理解,为自定义扩展或解决特定问题提供参考。