第 3 章  配置


阅读本章并给出了示例以了解如何配置 jBPM。
配置 Business Process Manager 的最简单方法是将 jbpm.cfg.xml 配置文件放在 classpath 的根目录中。如果文件不能用作资源,则改为使用默认最小配置。这个最小配置包含在 jBPM 库中(org/jbpm/default.jbpm.cfg.xml.) 如果提供了 lsblk 配置文件,则其包含的值将用作默认值。因此,只需要指定与默认配置文件中的值不同的值。
xmvn 配置由名为 org.jbpm.JbpmConfiguration 的 Java 类表示。使用 单例 实例方法(JbpmConfiguration.getInstance().)来获取它
注意
使用 JbpmConfiguration.parseXxxx 方法从另一个源加载配置。
static JbpmConfinguration jbpmConfiguration = JbpmConfinguration.parseResource("my.jbpm.cfg.xml");
Copy to Clipboard Toggle word wrap
JbpmConfiguration 是"线程安全",因此可以保存在 静态成员 中。
每个线程都可以使用 JbpmConfiguration 作为 JbpmContext 对象的 工厂JbpmContext 通常代表一个事务。它们使服务在 上下文块中 提供,如下所示:
JbpmContext jbpmContext = jbpmConfiguration.createJbpmContext();
try {
  // This is what we call a context block.
  // Here you can perform workflow operations

} finally {
  jbpmContext.close();
}
Copy to Clipboard Toggle word wrap
JbpmContext 使一组服务和配置设置可供 Business Process Manager 使用。服务由 jbpm.cfg.xml 文件中的值进行配置。它们使得 Ice 可以在任何 Java 环境中运行,使用这些服务可在上述环境中运行。
以下是 JbpmContext 的默认配置设置:
<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' />
  <string name='resource.mail.templates' 
    value='jbpm.mail.templates.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' />
    
    <string name='jbpm.mail.smtp.host' value='localhost' />
    
    <bean name='jbpm.mail.address.resolver' 
        class='org.jbpm.identity.mail.IdentityAddressResolver' 
        singleton='true' />
    <string name='jbpm.mail.from.address' value='jbpm@noreply' />

    <bean name='jbpm.job.executor' 
        class='org.jbpm.job.executor.JobExecutor'>
      <field name='jbpmConfiguration'><ref bean='jbpmConfiguration' />
      </field>
      <field name='name'><string value='JbpmJobExecutor' /></field>
      <field name='nbrOfThreads'><int value='1' /></field>
      <field name='idleInterval'><int value='60000' /></field>
      <field name='retryInterval'><int value='4000' /></field>
      <!-- 1 hour -->
      <field name='maxIdleInterval'><int value='3600000' /></field> 
      <field name='historyMaxSize'><int value='20' /></field>
      <!-- 10 minutes -->
      <field name='maxLockTime'><int value='600000' /></field> 
      <!-- 1 minute -->
      <field name='lockMonitorInterval'><int value='60000' /></field> 
       <!-- 5 seconds -->
      <field name='lockBufferTime'><int value='5000' /></field>
    </bean>
</jbpm-configuration>
Copy to Clipboard Toggle word wrap
以上文件包含三个部分:
  1. 服务实施,用于配置 JbpmContext。(可能的配置选项在涵盖特定服务实现的一章中详细介绍。)
  2. 所有映射都链接到配置资源的引用。如果某个配置文件希望自定义其中一个配置文件,请更新这些映射。为此,请首先将默认配置文件(jbpm-3.x.jar)备份到 classpath 上的另一个位置。然后,更新此文件中的引用,将其指向要使用的自定义版本。
  3. 未被 过程的其它配置。(它们在涵盖问题中特定主题的一章中进行了描述。)
默认配置针对具有最少依赖项的简单 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()
Copy to Clipboard Toggle word wrap
注意
不需要显式调用任何保存方法,因为 XxxForUpdate 方法旨在为"auto-save"注册载入的对象。
可以指定多个 jbpm-context。要做到这一点,请确保各自被授予一个唯一的 name 属性。(使用 JbpmConfiguration.createContext(String name); 命名上下文。)
service 元素指定自己的名称和相关服务 工厂。只有在请求 JbpmContext.getServices().getService(String name) 时才会创建该服务。
注意
也可以将因素视为 元素 而不是属性。当将一些配置信息注入工厂对象时,这是必需的。
请注意,负责创建和处理对象和解析 XML 的组件称为 对象工厂

3.1.  自定义事实

警告
当用户试图自定义工厂时,通常由人发出的错误是将长和短表示法混合在一起。(在默认配置文件中可以看到简短表示法的示例。)
Hibernate 记录 StateObjectStateException 异常并生成 堆栈追踪。要删除后者,请将 org.hibernate.event.def.AbstractFlushingEventListener 设置为 FATAL。(以前,如果使用 log4j,请在配置中设置以下行: log4j.logger.org.hibernate.event.def.AbstractFlushingEventListener=FATAL
&lt;service name='persistence' 
    factory='org.jbpm.persistence.db.DbPersistenceServiceFactory' /&gt;
Copy to Clipboard Toggle word wrap
重要
如果一个需要注意服务上的特定属性,则只能使用长表示法。
<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>
Copy to Clipboard Toggle word wrap

3.2.  配置属性

jbpm.byte.block.size
文件附加和二进制变量以固定化的二进制对象列表的形式存储在数据库中。(这样做的目的是提高不同数据库之间的可移植性。它还允许一个更加容易地嵌入 sVirt。 这个参数控制这些固定长度块的大小。
jbpm.task.instance.factory
要自定义创建任务实例的方式,请针对此属性指定一个完全限定类名称。(这通常是需要自定义属性,并为 TaskInstance bean 添加新属性。) 确保指定的 classname 实施 org.jbpm.taskmgmt.TaskInstanceFactory 接口。(如需更多信息,请参阅 第 8.10 节 “ 自定义任务实例 ”。)
jbpm.variable.resolver
使用此选项来自定义在"Demo"的表达式中查找第一个术语的方法。
jbpm.class.loader
使用此属性加载 192.168.1.0/24 类。
jbpm.sub.process.async
使用此属性允许异步信号子进程。
jbpm.job.retries
此配置决定了失败的作业何时停用。如果您检查了配置文件,您可以设置该条目,以便在重新生成前对作业进行指定数量的尝试。
jbpm.mail.from.address
此属性显示作业来自哪里。默认值为 jbpm@noreply

3.3. 其他配置文件

很多可自定义的配置文件:
hibernate.cfg.xml
它包含对 Hibernate 映射资源文件的引用和配置详情。
要更改 jbpm.cfg.xml 文件中使用的 hibernate.cfg.xml 文件,请在 jbpm.cfg.xml 文件中设置以下属性:
<string name="resource.hibernate.cfg.xml" value="new.hibernate.cfg.xml" /> 文件 jbpm.cfg.xml 文件位于 ${soa.home}/jboss-as/server/${server.config}/jbpm.esb 中
org/jbpm/db/hibernate.queries.hbm.xml
此文件包含这些 Hibernate 查询,可在 jBPM 会话(org.jbpm.db114Session.)中使用。
org/jbpm/graph/node/node.types.xml
此文件用于将 XML 节点元素映射到 节点 实施类。
org/jbpm/graph/action/action.types.xml
此文件用于将 XML 操作元素映射到 Action 实现类。
org/jbpm/calendar/jbpm.business.calendar.properties
它包含"工作小时"和"免费时间"的定义。
org/jbpm/context/exe/jbpm.varmapping.xml
这将指定进程变量值(Java 对象)转换为 sVirt 数据库中存储的变量值(Java 对象)的方法。
org/jbpm/db/hibernate/jbpm.converter.properties
这指定了 id-to-classname 映射。id存储在数据库中。org.jbpm.db.hibernate.ConverterEnumType 类用于将标识符映射到 单例 对象。
org/jbpm/graph/def/jbpm.default.modules.properties
这将指定将哪些模块添加到新的 ProcessDefinition 中。
org/jbpm/jpdl/par/jbpm.parsers.xml
这将指定 进程存档解析的阶段

3.4.  Logging Optimistic Concurrency Exceptions

当它在集群配置中运行时,Eickyter 使用 optimistic 锁定与数据库同步。这意味着,每个操作都在事务中执行,如果在末尾检测到冲突,则会回滚问题中的事务,且必须重试处理。这可能导致 org.hibernate.StateObjectStateException 异常。如果发生这种情况,则 Hibernate 将记录带有简单消息的例外,
optimistic locking
            failed
Copy to Clipboard Toggle word wrap
.
Hibernate 也可以使用堆栈追踪记录 StateObjectStateException。要删除这些堆栈跟踪,将 org.hibernate.event.def.AbstractFlushingEventListener 类设置为 FATAL。使用以下配置在 log4j 中这样做:
log4j.logger.org.hibernate.event.def.AbstractFlushingEventListener=FATAL
Copy to Clipboard Toggle word wrap
要记录 192.168.1.0/24 堆栈跟踪,请为软件包设置 ERROR 以上的日志类别阈值。

3.5. 对象工厂

Object Factory 可将对象构建到"beans-like"XML 配置文件中包含的规格中。此文件指定如何将对象创建、配置和连接在一起以组成完整的对象图。还使用 Object Factory 将配置和其他 Bean 注入单个 bean。
在它的最元素形式中,Object Factory 可以从此类配置创建基本 类型和 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>
Copy to Clipboard Toggle word wrap
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"));]]>
Copy to Clipboard Toggle word wrap
这个代码演示了如何配置列表:
<beans>
    <list name="numbers">
        <string>one</string>
        <string>two</string>
        <string>three</string>
    </list>
</beans>
Copy to Clipboard Toggle word wrap
这个代码演示了如何配置映射:
<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>
Copy to Clipboard Toggle word wrap
使用 直接字段注入 和属性 方法配置 Bean:
<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>
Copy to Clipboard Toggle word wrap
您可以引用 Bean。引用的对象不必是 bean 本身:它可以是一个字符串、整数或您想要的任何内容。
<beans>
    <bean name="a" class="org.jbpm.A" />
    <ref name="b" bean="a" />
</beans>
Copy to Clipboard Toggle word wrap
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>
Copy to Clipboard Toggle word wrap
Bean 可使用 factory 方法构建:
<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>
Copy to Clipboard Toggle word wrap
Bean 可使用类上的 static factory 方法构建:
<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>
Copy to Clipboard Toggle word wrap
使用属性 singleton="true" 将每个命名对象标记为 单例。这样做可确保给定 对象工厂 始终为每个请求返回相同的对象。
注意
单例 不能在不同的对象工厂之间共享。
单例 功能会在名为 getObjectgetNewObject 的方法之间导致使用。通常,在构建新对象图前,应使用 getNewObject 来清除 对象工厂 的对象缓存。
在对象图构建期间,非单例对象存储在 对象工厂 的缓存中。这允许引用一个对象。请记住,单例对象缓存 与普通 对象缓存不同单例 缓存永不被清除,在每次启动 getNewObject 方法时都会清除普通缓存。
现在,本章已进行了全面了解,可以全面地了解可以配置 sVirt 的方法。
返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。 了解我们当前的更新.

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

Theme

© 2025 Red Hat