Terry.Li-彬

虚其心,可解天下之问;专其心,可治天下之学;静其心,可悟天下之理;恒其心,可成天下之业。

  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  143 随笔 :: 344 文章 :: 130 评论 :: 0 Trackbacks
第6章 配置
jBPM配置由java类org.jbpm.JbpmConfiguration来描述,获取JbpmConfiguration的最简单方式是使用单态实例方法JbpmConfiguration.getInstance()。
如果你想从另外一个源加载配置,你可以使用JbpmConfiguration.parseXxxx方法。
static JbpmConfinguration jbpmConfiguration = JbpmConfinguration.getInstance();
JbpmConfiguration是线程安全的,因此可以在一个静态成员中维护,所有的线程都可以把JbpmConfiguration作为一个JbpmContext对象的工厂来使用。JbpmContext表示一个事务,在一个上下文块中JbpmContext使服务可用,上下文块如下:
JbpmContext jbpmContext = jbpmConfiguration.createJbpmContext();
try {
 // This is what we call a context block.
 // Here you can perform workflow operations
 
} finally {
 jbpmContext.close();
}
JbpmContext使一组服务和配置为jBPM可用,这些服务在jbpm.cfg.xml配置文件中被配置,并且使jBPM无论运行在任何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' />
 <long name='jbpm.msg.wait.timout' value='5000' singleton='true' />
 
</jbpm-configuration>
在这个配置中你可以看到三部分:
l        第一部分使用一组服务实现配置jbpm上下文,这些配置的可选项在以后描述特定服务实现的章节中做了描述。
l        第二部分是所有配置资源的引用映射,如果你想要定制某些配置文件,这些资源引用可以被修改。典型情况下,你可以在jbpm-3.x.jar中拷贝一个默认的配置,并且把它放在classpath中的某个位置,然后在这个文件中修改引用为你自己定制版本的配置文件。
l        第三部分是在jbpm中使用的一些别名配置,这些配置选项在包含特定主题的章节中做了描述。
缺省配置的一组服务被定位于一个简单的web应用环境和最小的依赖,持久化服务将获得一个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方法将记录所加载的对象为自动保存的,因此不需要再调用save方法。
指定多个jbpm上下文是可能的,但是你必须确保每个jbpm上下文的name属性必须是唯一的,可以使用JbpmConfiguration.createContext(String name)获取命名的上下文。
service元素定义了一个服务名称和此服务的服务工厂,服务将只会在使用JbpmContext.getServices().getService(String name)请求时被创建。
工厂也可以被作为一个元素来指定,而不是用属性。那样可以用于在工厂对象中注入一些配置信息,负责解析XML的组件创建和装配被调用的对象工厂。
6.1 配置属性
jbpm.byte.block.size:文件附件和二进制变量被存储到数据库,不是作为blob,而是作为一个固定大小的二进制对象列表,这可以方便用于不同数据库并且提高jBPM的全面嵌入能力,这个参数控制了固定长度块的大小。
jbpm.task.instance.factory:定制任务实例的创建方式,在这个属性中指定一个全类名,当你想要定制TaskInstance bean并且向它添加新的属性时,这是有必要的。请参考“11.10 定制任务实例”,指定的类必须实现org.jbpm.tskmgmt.TaskInstanceFactory。
jbpm.variable.resolver:定制jBPM在JSF表达式中寻找第一个术语的方式。
jbpm.msg.wait.timout:定制消息缓存的时间。
6.2 配置文件
下面是对在jBPM中定义的所有配置文件的简短描述。
6.2.1 Hibernate.cfg.xml文件
这个文件包含hibernate配置,并且引用hibernate映射资源文件。
位置:hibernate.cfg.xml文件如果不另外在jbpm.properties文件的jbpm.hibernate.cfg.xml属性中指定,则jBPM工程中的默认hibernate配置文件在目录src/config.files/hibernate.cfg.xml。
6.2.2 Hibernate查询配置文件
这个文件包含jBPM会话org.jbpm.db.*Session中所使用的hibernate查询。
位置:org/jbpm/db/hibernate.queries.hbm.xml。
6.2.3 节点类型配置文件
这个文件包含了XML节点元素到节点实现类的映射。
位置:org/jbpm/graph/node/node.types.xml。
6.2.4 动作类型配置文件
这个文件包含了XML动作元素到动作实现类的映射。
位置:org/jbpm/graph/action/action.types.xml。
6.2.5 业务日历配置文件
包含了业务时间和空闲时间的定义。
位置:org/jbpm/calendar/jbpm.business.calendar.properties。
6.2.6 变量映射配置文件
指定了流程变量(java对象)的值怎样转换到用于存储到jbpm数据库中的变量实例。
位置:org/jbpm/context/exe/jbpm.varmapping.xml。
6.2.7 转换器配置文件
指定了id到类名的映射。id被存储到数据库,org.jbpm.db.hibernate.ConverterEnumType被用来映射id到单态对象。
位置:org/jbpm/db/hibernate/jbpm.converter.properties。
6.2.8 缺省模块配置文件
指定哪个模块被缺省添加到一个新的流程定义ProcessDefinition。
位置:org/jbpm/graph/def/jbpm.default.modules.properties。
6.2.9 流程档案解析器配置文件
指定流程档案解析的解析器。
位置:org/jbpm/jpdl/par/jbpm.parsers.xml。
6.3 对象工厂
对象工厂可以依照bean的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>
Bean可以使用直接成员注入和通过属性的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>
Bean可以被引用,被引用的对象不必必须是一个bean,也可以是一个字符串、整型或其他任何对象。
<beans>
 <bean name="a" class="org.jbpm.A" />
 <ref name="b" bean="a" />
</beans>
Bean可以使用任何构造器构造(构造函数)。
<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”标记为单态,这意味着给定的对象工厂为每个请求将总是返回相同的对象。注意,单态不能在不同对象工厂之间共享。
单态特性导致getObjectgetNewObject方法间的区别,对象工厂的典型用户将使用getNewObject,这意味着在一个新的对象图被构造之前对象对象工厂首先要清除对象缓存。在构造对象图期间,非单态对象被存储在对象工厂的对象缓存中,允许共享引用一个对象。单态对象缓存不同于普通对象缓存,单态对象缓存不需要清除,而普通对象缓存在每个getNewObject方法被调用起始会被清除。 
posted on 2007-09-06 17:52 礼物 阅读(693) 评论(0)  编辑  收藏 所属分类: Jbpm