第3章 設定

JBPM の設定方法について学習するには本章を参照してください。
JBPM を設定する最も簡単な方法は、クラスパスのルートに jbpm.cfg.xml 設定ファイルを指定することです。このファイルがリソースとして存在しない場合は、JBPM ライブラリに含まれるデフォルトの最小設定が使用されます (org/jbpm/default.jbpm.cfg.xml)。
反対に JBPM 設定ファイルが提供された場合、設定された値がデフォルト値として使用されます。したがって、デフォルトの設定ファイルと異なる部分だけ指定する必要があります。
JBPM の設定は、Java クラス org.jbpm.JbpmConfiguration によって表されています。singleton インスタンスメソッド (JbpmConfiguration.getInstance()) を利用して取得します。

注記

他のソースから設定をロードするには、JbpmConfiguration.parseXxxx メソッドを使います。
static JbpmConfinguration jbpmConfiguration = JbpmConfinguration.parseResource("my.jbpm.cfg.xml");
JbpmConfiguration は「スレッドセーフ」であるため、 静的メンバーに保存できます。
各スレッドは JbpmConfigurationJbpmContext オブジェクトの ファクトリ として利用できます。 JbpmContext は通常 1 つのトランザクションを表します。 次のようにコンテキストブロック内でサービスを使用できるようにします。
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 のデフォルト設定になります。
<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>
上記ファイルには 3 つのパーツが含まれます。
  1. JbpmContext 設定するサービス実装のセット (特定のサービス実装について取り上げている章に可能な設定オプションの詳細が記載されています)。
  2. 設定リソースへの参照にリンクするすべてのマッピング。設定ファイルの 1 つをカスタマイズしたい場合はこれらのマッピングを更新します。カスタマイズする時は、最初に必ずデフォルトの設定ファイル (jbpm-3.x.jar) をクラスパス上の別の場所にバックアップします。その後、JBPM が使用するカスタマイズされたバージョンを示してこのファイルへの参照を更新します。
  3. 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-context を指定することは可能ですが、その際に各 jbpm-context に固有の name属性を付けなければなりません (JbpmConfiguration.createContext(String name); を使用して名前付けされたコンテキストを読み出します)。
service要素は、独自の名前と関連する サービスファクトリ を指定します。JbpmContext.getServices().getService(String name) による要求があった場合のみ、このサービスが作成されます。

注記

factories を属性でなく要素 として指定することもできます。 一部の設定情報をファクトリオブジェクトに注入する際に要素の指定が必要となります。

注記

オブジェクトの作成や書き込み、XML の解析を行うコンポーネントは object factory と呼ばれます。

3.1. ファクトリのカスタマイズ

警告

ファクトリのカスタマイズ時の一般的な間違いは、短表記と長表記を混在させてしまうことです。これは行わないようにしましょう (短い表記法の例は、デフォルトの設定ファイルにあります)。
HibernateStateObjectStateException をログに記録し、これに対するスタックトレースを生成します。スタックトレースを削除するには、org.hibernate.event.def.AbstractFlushingEventListenerFATAL に設定します。
&lt;service name='persistence' 
    factory='org.jbpm.persistence.db.DbPersistenceServiceFactory' /&gt;

注記

あるいは、log4j を使っている場合は以下の行を設定ファイルに追加します: log4j.logger.org.hibernate.event.def.AbstractFlushingEventListener=FATAL

重要

サービス上に特定のプロパティを示す必要がある場合、長表記のみが使用可能です。
<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>