`
zhangym195
  • 浏览: 123702 次
  • 性别: Icon_minigender_1
  • 来自: 黑龙江
社区版块
存档分类
最新评论

jBPM jPDL 用户开发手册 - 第6章

阅读更多

6章配置

最简单的配置jBPM方式的通过将jbpm.cfg.xml配置文件放在类路径的根下。如果那个文件没有作为一个资源被发现的话,包含在jbpm库中的默认的最小配置将被使用。注意那个最小的配置不会有任何的持久化的配置。
jBPM配置通过org.jbpm.JbpmConfiguration这一java类来表示。最简单的获得JbpmConfiguration的方法是使用单态实例方法JbpmConfiguration.getInstance()。
如果你想加载一个配置从另一个源的话,你能够使用JbpmConfiguration.parseXxxx这个方法。

static JbpmConfinguration jbpmConfiguration = JbpmConfinguration.getInstance();

JbpmConfiguration是线程安全的而且此后能够被保存在一个静态成员里。所有线程都可以把JbpmConfiguration当作JbpmContext对象的工厂来使用。一个JbpmContext一般代表一个转换。在一个上下文块里JbpmContext让服务变得可用。一个上下文块像这样:

JbpmContext jbpmContext = jbpmConfiguration.createJbpmContext();

try {

  // 这是我们调用的上下文块

  // 这里你可以招生工作流操作

 

} finally {

  jbpmContext.close();

}
JbpmContext使得jBPM的一系列服务和配置可用。这些服务是在jbpm.cfg.xml配置文件中被配置的并使它尽可能地运行在任何的Java环境里,在那个环境里无论什么使用服务都是可以。
这有一个典型的JbpmContext的配置,你可以在src/config.files/jbpm.cfg.xml文件中找到它。
<jbpm-configuration>
 

  <jbpm-context>

    <service name='persistence' factory='org.jbpm.persistence.db.DbPersistenceServiceFactory' />

    <service name='message' factory='org.jbpm.msg.db.DbMessageServiceFactory' />

    <service name='scheduler' factory='org.jbpm.scheduler.db.DbSchedulerServiceFactory' />

    <service name='logging' factory='org.jbpm.logging.db.DbLoggingServiceFactory' />

    <service name='authentication' factory='org.jbpm.security.authentication.DefaultAuthenticationServiceFactory' />

  </jbpm-context>

 

  <!-- configuration resource files pointing to default configuration files in jbpm-{version}.jar -->

  <string name='resource.hibernate.cfg.xml' value='hibernate.cfg.xml' />

  <!-- <string name='resource.hibernate.properties' value='hibernate.properties' /> -->

  <string name='resource.business.calendar' value='org/jbpm/calendar/jbpm.business.calendar.properties' />

  <string name='resource.default.modules' value='org/jbpm/graph/def/jbpm.default.modules.properties' />

  <string name='resource.converter' value='org/jbpm/db/hibernate/jbpm.converter.properties' />

  <string name='resource.action.types' value='org/jbpm/graph/action/action.types.xml' />

  <string name='resource.node.types' value='org/jbpm/graph/node/node.types.xml' />

  <string name='resource.parsers' value='org/jbpm/jpdl/par/jbpm.parsers.xml' />

  <string name='resource.varmapping' value='org/jbpm/context/exe/jbpm.varmapping.xml' />

 

  <int name='jbpm.byte.block.size' value="1024" singleton="true" />

  <bean name='jbpm.task.instance.factory' class='org.jbpm.taskmgmt.impl.DefaultTaskInstanceFactoryImpl' singleton='true' />

  <bean name='jbpm.variable.resolver' class='org.jbpm.jpdl.el.impl.JbpmVariableResolver' singleton='true' />

 
</jbpm-configuration>
在这个配置文件中你能够看到3个部分:

l  第一部分用一系列的服务实现配置jbpm上下文。可能的配置选项被提及在特定的服务实现中提到了。

l  第二部分是所有的持久性映射的配置资源。这些资源引用可以被更新如果你想定制这些资源中的一个文件的话。通常,你可以生成一个在jbpm-3.x.jar中的缺少配置的一个拷贝然后把它放在你的类路径上的某处。然后你更新这个文件中的引用那么jbpm将使用你定制的配置文件。

l  第三部分是一些用于jbpm的零散配置。这些配置选项在特定主题的章节中被描述。

缺省的配置一系列的服务瞄准在一个简单的webapp环境并最小化其依赖性。持久化服务将获得一个jdbc连接而且所有的其他的服务将使用相同的连接去执行他们的服务。所以你的工作流的所有操作都是集中在JDBC连接上的一个事务中而不需要一个事务管理器。
JbpmContext为大多数的通用流程操作内置了方便的方法:

public void deployProcessDefinition(ProcessDefinition processDefinition) {...}

  public List getTaskList() {...}

  public List getTaskList(String actorId) {...}

  public List getGroupTaskList(List actorIds) {...}

  public TaskInstance loadTaskInstance(long taskInstanceId) {...}

  public TaskInstance loadTaskInstanceForUpdate(long taskInstanceId) {...}

  public Token loadToken(long tokenId) {...}

  public Token loadTokenForUpdate(long tokenId) {...}

  public ProcessInstance loadProcessInstance(long processInstanceId) {...}

  public ProcessInstance loadProcessInstanceForUpdate(long processInstanceId) {...}

  public ProcessInstance newProcessInstance(String processDefinitionName) {...}

  public void save(ProcessInstance processInstance) {...}

  public void save(Token token) {...}

  public void save(TaskInstance taskInstance) {...}

  public void setRollbackOnly() {...}

注意XxxForUpdate这样的方法将注册在被加载的对象上为了自动保存,那样你就不得不明确的调用一个保存方法。

指定多个jbpm上下文中可能的,但是那样的话你就不得不确保每个jbpm上下文赋予了唯一的命名(name)属性。被命名的上下文能够被JbpmConfiguration.createContext(String name)方法检索。

服务元素指定服务的名称和那个服务的服务工厂。这个服务将只在它使用JbpmContext.getServices().getService(String name)方法进行请求时被创建。

这个工厂也能被指定作当一个元素代替一个属性时。那样也许必须要注入一些配置信息到这个工厂对象里。这个组件负责解析XML,创建并写被工厂对象调用的这些对象。

6.1 配置工厂

当定制工厂时一个共同的错误是弄混长短标记(notation)。短标记的例子能在缺省配置文件和上面的内容中看到,例如:
...

  <service name='persistence' factory='org.jbpm.persistence.db.DbPersistenceServiceFactory' />

如果在服务上的特定属性要被指定的话,短注释不能使用,代替的是,就不得不用长标记了,像这样:

<service name="persistence">

    <factory>

      <bean class="org.jbpm.persistence.db.DbPersistenceServiceFactory">

        <field name="dataSourceJndiName"><string value="java:/myDataSource"/></field>

        <field name="isCurrentSessionEnabled"><true /></field>

        <field name="isTransactionEnabled"><false /></field>

      </bean>

    </factory>
  </service>

6.2 配置属性

jbpm.byte.block.size:文件附件和二进制变量被存储在数据库中。不是用blobs,而是一列固定大小的二进制对象。这样做是为了提高在不同的数据库间的兼容性和jBPM的整体的嵌入性。这个参数控制着固定长度的数据块的尺寸。
jbpm.task.instance.factory:定制任务实例创建的方式,指定一个完全限定类名在这个属性中。当你想定制TaskInstance bean并给它增加新属性时这个属性你也许是需要的。参考:12.10 定制任务实例 节。那个特定的类org.jbpm.taskmgmt.TaskInstanceFactory应该被实现。
jbpm.variable.resolver:定制jBPM在类JSF(JSF-like)的表达式里查找第一个术语的的方式。

6.3其他的配置文件

这有jBPM可定制的所有配置文件的一个简短描述。

6.3.1 Hibernate cfg xml 文件

这个文件包含了hibernate映射资源文件的配置和引用。
位置:除非在jbpm.properties文件中指定在jbpm.hibernate.cfg.xml属性。否则jbpm项目中缺省的hibernate cfg xml文件放在src/config.files/hibernate.cfg.xml处。

6.3.2 Hibernate 查询配置文件

这个文件包含hibernate的查询被使用在jBPM 的session 类org.jbpm.db.*Session中。

位置:org/jbpm/db/hibernate.queries.hbm.xml

6.3.3节点类型配置文件

这个文件包含了节点元素到节点实现类的XML映射。
位置:org/jbpm/graph/node/node.types.xml

6.3.4 动作类型配置文件

这个文件包含动作元素到动作实现类的XML映射。
位置:org/jbpm/graph/action/action.types.xm

6.3.5商务日历配置文件

包含工作时间和空闲时间的定义。
位置:org/jbpm/calendar/jbpm.business.calendar.properties

6.3.6 变量映射配置文件

指定如何将流程变量(java object)的值转换为在数据库中存储的变量实例。
位置:org/jbpm/context/exe/jbpm.varmapping.xml

6.3.7 转换器配置文件

指定id到类名(id-to-classname)的映射。这个id被存储在数据库中。org.jbpm.db.hibernate.ConverterEnumType用来映射id到单例对象。
位置:org/jbpm/db/hibernate/jbpm.converter.properties

6.3.8 缺省模型配置文件

指定哪个模块缺省的被加到新的流程定义(ProcessDefinition)中。
位置:org/jbpm/graph/def/jbpm.default.modules.properties

6.3.9 流程包解析配置文件

指定流程包分析的阶段。
位置:org/jbpm/jpdl/par/jbpm.parsers.xm

6.4 在JBoss 中的jBPM 调试日志

当在JBoss中运行jPDL而且你想查看jBPM的调试日志时,用你的jPDL发布包中的deploy/log4j.xml文件替换jboss服务器配置中的conf/log4j.xml文件。在套件中,完整的文件位置是[jpdl.home]/server/server/jbpm/conf/log4j.xml。

6.5 乐观并发异常日志

当运行在一个集群时,jBPM在数据库上同步。缺省的是乐观锁。这就意味着每个操作在一个事务中被执行。而且如果在冲突的结束点被检测到的话,那么这个事务将回滚而且必须被处理。例如:通过重试。所以乐观锁异常通常是正常操作的一部分。因此,缺省情况下hibernate抛出org.hibernate.StateObjectStateExceptions异常,那时候是不会用错误(error)记录日志和进行栈追踪的,但是取代的是显示一个简单的信息消息“乐观锁失败”。
 Hibernate自己将记录StateObjectStateException包含一个栈追踪。如果你想移除这些栈追踪,放org.hibernate.event.def.AbstractFlushingEventListener的级别为FATAL。如果你用log4j的话下列的配置行能够被用到:
log4j.logger.org.hibernate.event.def.AbstractFlushingEventListener=FATAL
如果你想允许记录jBPM的栈追踪的话,增加下列行到你的jbpm.cfg.xml中:

<boolean name="jbpm.hide.stale.object.exceptions" value="false" />

6.6 对象工厂

对象工厂能够创建对象通过珍上类bean(bean-like)的xml配置文件。这一配置文件指定了对象应该如何被创建、配置及绑定在一起形成一个完整的对象图。对象工厂能够注入配置和其他的bean到一个bean中。
在它最简单的形式里,对象工厂是能够用这样一个配置来创建基本类型和java bean的:
<beans>

  <bean name="task" class="org.jbpm.taskmgmt.exe.TaskInstance"/>

  <string name="greeting">hello world</string>

  <int name="answer">42</int>

  <boolean name="javaisold">true</boolean>

  <float name="percentage">10.2</float>

  <double name="salary">100000000.32</double>

  <char name="java">j</char>

  <null name="dusttodust" />

</beans>
 
---------------------------------------------------------
 

ObjectFactory of = ObjectFactory.parseXmlFromAbove();

assertEquals(TaskInstance.class, of.getNewObject("task").getClass());

assertEquals("hello world", of.getNewObject("greeting"));

assertEquals(new Integer(42), of.getNewObject("answer"));

assertEquals(Boolean.TRUE, of.getNewObject("javaisold"));

assertEquals(new Float(10.2), of.getNewObject("percentage"));

assertEquals(new Double(100000000.32), of.getNewObject("salary"));

assertEquals(new Character('j'), of.getNewObject("java"));

assertNull(of.getNewObject("dusttodust"));
你也能配置列表:
<beans>

  <list name="numbers">

    <string>one</string>

    <string>two</string>

    <string>three</string>

  </list>
</beans>
和map:
<beans>

  <map name="numbers">

    <entry><key><int>1</int></key><value><string>one</string></value></entry>

    <entry><key><int>2</int></key><value><string>two</string></value></entry>

    <entry><key><int>3</int></key><value><string>three</string></value></entry>

  </map>
</beans>
Beans 可以被配置为使用直接域注入而且是通过setter属性。
<beans>

  <bean name="task" class="org.jbpm.taskmgmt.exe.TaskInstance" >

    <field name="name"><string>do dishes</string></field>

    <property name="actorId"><string>theotherguy</string></property>

  </bean>
</beans>
Beans能够被引用。这引用对象不是必须是bean的,它还可以是字符串、整数或是任何的其他的对象。
<beans>

  <bean name="a" class="org.jbpm.A" />

  <ref name="b" bean="a" />

</beans>
Beans能够用构造器进行构造。
<beans>

  <bean name="task" class="org.jbpm.taskmgmt.exe.TaskInstance" >

    <constructor>

      <parameter class="java.lang.String">

        <string>do dishes</string>

      </parameter>

      <parameter class="java.lang.String">

        <string>theotherguy</string>

      </parameter>

    </constructor>
  </bean>
</beans>
... 或者是bean的工厂方法...
<beans>

  <bean name="taskFactory"

         class="org.jbpm.UnexistingTaskInstanceFactory"

         singleton="true"/>

 

  <bean name="task" class="org.jbpm.taskmgmt.exe.TaskInstance" >

    <constructor factory="taskFactory" method="createTask" >

      <parameter class="java.lang.String">

        <string>do dishes</string>

      </parameter>

      <parameter class="java.lang.String">

        <string>theotherguy</string>

      </parameter>

    </constructor>
  </bean>
</beans>
... 或者是类的静态工厂方法...
<beans>

  <bean name="task" class="org.jbpm.taskmgmt.exe.TaskInstance" >

    <constructor factory-class="org.jbpm.UnexistingTaskInstanceFactory" method="createTask" >

      <parameter class="java.lang.String">

        <string>do dishes</string>

      </parameter>

      <parameter class="java.lang.String">

        <string>theotherguy</string>

      </parameter>

    </constructor>
  </bean>
</beans>
每个命名对象能够使用属性singleton=”true”标记为单态。那就意味着一个给定的对象工厂将总是为每个请求返回同一对象。注意单态在不同的对象工厂之间是不能共享的。
单态属性导致在方法getObject和getNewObject之间的区别。典型的用户的对象工厂将使用getNewObject方法。这就意味着第一个对象工厂的对象缓存在这个新对象图被构造前就被清除了。在对象图构造期间,非单态对象被存储在对象工厂的对象缓存中,它允许共享引用给一个对象。这个单态对象缓存同普通对象缓存是不同的。单态缓存是从不清除,而普通对象缓存在每个getNewObject方法开始处会被清除。
:~~ 这几天一直没有时间翻译(meeting...meeting... misc.... :< ),时间耽误了,现在上传第6章
分享到:
评论
10 楼 maya032 2008-10-13  
你好  我是刚刚才开始学习jbpm的,所以很多问题都不是很明白。比如说我自己建的一个项目中想要使用jbpm  这些 Hibernate cfg xml、*.jpdl.xml配置文件怎么建呀
9 楼 zhangym195 2008-08-27  
   因为上传的版本大多是翻译完就上传上来了,一些也没有怎么进行意译,进行语法的纠错,主要是考虑能让大家尽快的看到,等全部完成后,我会根据逐一对各章进行校稿并进行下意译的,然后发一个pdf的稿。
   谢谢您的支持!
8 楼 heath.derek 2008-08-27  
翻译的还可以,就是每到关键处,就感觉有点拗口,继续努力啊,哈哈,谢谢你的资料,很有用。
7 楼 zhangym195 2008-08-22  
   由于一些刚开始学习jBPM的朋友看文档时,一般会提到 jBPM starter's kit(新手工具包)这个件,但是在jBoss的网站上不提供下载的地址:
    下在我提供一个地址,大家可以从上面下载jBPM的所有连续版本包,请点击:
"]UK Mirror Service
6 楼 winebibber 2008-08-22  
看到你提供的下载了,thanks
5 楼 winebibber 2008-08-22  
我一直都没有找到他的开发手册,可否提供一个链接,或者给个地方下载啊
4 楼 zhangym195 2008-08-21  
是的,正是官方最新版 3.2.3的开发手册。不过翻译起来还是比较难的,而且马上就要忙了,现是在挤时间来翻译啊 :<<
3 楼 winebibber 2008-08-21  
楼主加油,jbpm的资料实在是太少了,不知道你说的开发手册是官方的reference吗?
2 楼 zhangym195 2008-08-20  
这段时间我一直在利用工作空闲时间来翻译3。2。2版的开发手册,您指的那个方面我还没有计划,不过这个手册中相关方面的内容也会有所涉及,请您关注!
1 楼 yuyanshan 2008-08-19  
能不能结合SPRING讲讲,如何让SPRING管理JBPM的事务。

相关推荐

    jBPM jPDL 用户开发手册 - 第8章

    **jbPM jPDL 用户开发手册 - 第8章** jbPM(Java Business Process Management)是一个开源的工作流管理系统,用于在Java环境中实现业务流程自动化。它提供了丰富的API、工作流建模语言(jPDL)以及可视化工具,...

    JBoss+jBPM+jPDL用户开发手册_3.2.3

    **JBoss+jBPM+jPDL用户开发手册_3.2.3** JBoss是一个开源的应用服务器,它提供了运行Java企业级应用的平台。而jBPM(Java Business Process Management)是JBoss组织下的一个流程管理项目,专门用于业务流程管理...

    JBoss+jBPM+jPDL用户开发手册

    《JBoss jBPM + jPDL 用户开发手册》是一本专注于企业级工作流开发的指南,特别适合那些在系统开发中需要实现工作流管理的开发者。本书详细介绍了如何使用JBoss提供的jBPM(Java Business Process Management)框架...

    jBPM-4.3开发手册.pdf

    ### jBPM-4.3开发手册知识点梳理 #### 一、引言 - **目标读者**:本手册面向具备一定开发经验的技术人员,旨在帮助他们深入理解和掌握jBPM的功能与灵活性。 - **概述**:文档介绍了jBPM的核心特性和高级功能,并...

    jbpm4.4用户手册

    用户手册详细介绍了jBPM的使用方法,特别是在持久执行模式下如何利用jPDL进行流程定义与管理。此外,开发指南提供了更深入的技术细节,包括高级配置、定制选项以及不被支持的实验性功能。 #### 五、从jBPM 3 升级至...

    JPDL3.1规范手册[良少]

    这份手册不仅是一份关于jBPM 3.1指南第16章的翻译,更是作者结合自身对jBPM及JPDL(Job Business Process Definition Language)深入理解的一次全面扩展和解读。文档中包含了对JPDL规范的详细解释,并提供了丰富的...

    jBPM4.1中文用户手册.pdf

    ### jBPM4.1中文用户手册知识点概览 #### 一、简介 - **目标读者**:本书面向具有一定开发经验的技术人员,旨在帮助他们掌握jBPM4.4的相关配置、开发及实施流程。 - **概述**:本书详细介绍了jBPM4.4的核心功能与...

    jPdl参考手册

    jPdl参考手册提供了关于如何使用jBpm进行业务流程管理的详细指导。通过`processdefinition.xml`文件,用户可以清晰地定义业务流程的结构和逻辑,并通过流程存档的形式进行打包和部署。版本控制机制确保了流程定义的...

Global site tag (gtag.js) - Google Analytics