jbpm用戶指南翻譯:第6章 配置

 
第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方法被調用起始會被清除。 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章