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章
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值