Flowable與Spring集成

ProcessEngineFactoryBean

對(duì)于Spring集成,配置和引擎bean將如下所示:

<bean id="processEngineConfiguration" class="org.flowable.spring.SpringProcessEngineConfiguration">
    ...
</bean>

<bean id="processEngine" class="org.flowable.spring.ProcessEngineFactoryBean">
  <property name="processEngineConfiguration" ref="processEngineConfiguration" />
</bean>

交易

  1. 將DataSource傳遞給SpringProcessEngineConfiguration
    • Flowable使用org.springframework.jdbc.datasource.TransactionAwareDataSourceProxy內(nèi)部苇倡,它包裝傳遞的DataSource
      • 目的:確保從DataSource和Spring事務(wù)中檢索到的SQL連接能夠很好地協(xié)同工作(意味著它不再需要代理的數(shù)據(jù)源自己在Spring的配)
      • 確保在TransactionAwareDataSourceProxy自己聲明Spring配置時(shí),不要將它用于已經(jīng)知道Spring事務(wù)的資源(例如损离,DataSourceTransactionManager和JPATransactionManager需要未代理的dataSource)
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
                             http://www.springframework.org/schema/beans/spring-beans.xsd
                           http://www.springframework.org/schema/context
                             http://www.springframework.org/schema/context/spring-context-2.5.xsd
                           http://www.springframework.org/schema/tx
                             http://www.springframework.org/schema/tx/spring-tx-3.0.xsd">

  <bean id="dataSource" class="org.springframework.jdbc.datasource.SimpleDriverDataSource">
    <property name="driverClass" value="org.h2.Driver" />
    <property name="url" value="jdbc:h2:mem:flowable;DB_CLOSE_DELAY=1000" />
    <property name="username" value="sa" />
    <property name="password" value="" />
  </bean>

  <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource" />
  </bean>

  <bean id="processEngineConfiguration" class="org.flowable.spring.SpringProcessEngineConfiguration">
    <property name="dataSource" ref="dataSource" />
    <property name="transactionManager" ref="transactionManager" />
    <property name="databaseSchemaUpdate" value="true" />
    <property name="asyncExecutorActivate" value="false" />
  </bean>

  <bean id="processEngine" class="org.flowable.spring.ProcessEngineFactoryBean">
    <property name="processEngineConfiguration" ref="processEngineConfiguration" />
  </bean>

  <bean id="repositoryService" factory-bean="processEngine" factory-method="getRepositoryService" />
  <bean id="runtimeService" factory-bean="processEngine" factory-method="getRuntimeService" />
  <bean id="taskService" factory-bean="processEngine" factory-method="getTaskService" />
  <bean id="historyService" factory-bean="processEngine" factory-method="getHistoryService" />
  <bean id="managementService" factory-bean="processEngine" factory-method="getManagementService" />

...
<beans>
  ...
  <tx:annotation-driven transaction-manager="transactionManager"/>

  <bean id="userBean" class="org.flowable.spring.test.UserBean">
    <property name="runtimeService" ref="runtimeService" />
  </bean>

  <bean id="printer" class="org.flowable.spring.test.Printer" />

</beans>
  1. 使用Spring支持的任何方式創(chuàng)建應(yīng)用程序上下文
ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext(
    "org/flowable/examples/spring/SpringTransactionIntegrationTest-context.xml");
  1. 使用repositoryService來(lái)部署這樣的進(jìn)程
RepositoryService repositoryService =
  (RepositoryService) applicationContext.getBean("repositoryService");
String deploymentId = repositoryService
  .createDeployment()
  .addClasspathResource("org/flowable/spring/test/hello.bpmn20.xml")
  .deploy()
  .getId();

表達(dá)式

  1. 使用ProcessEngineFactoryBean時(shí),BPMN進(jìn)程中的所有表達(dá)式默認(rèn)情況下也會(huì)看到所有Spring bean
  2. 要完全暴露NO bean撤卢,只需在SpringProcessEngineConfiguration上將空列表作為beans屬性傳遞艳悔。如果未設(shè)置beans屬性悄窃,則上下文中的所有Spring bean都可用讥电。
<bean id="processEngineConfiguration" class="org.flowable.spring.SpringProcessEngineConfiguration">
  ...
  <property name="beans">
    <map>
      <entry key="printer" value-ref="printer" />
    </map>
  </property>
</bean>

<bean id="printer" class="org.flowable.examples.spring.Printer" />

3.在表達(dá)式中使用公開(kāi)的bean:例如,SpringTransactionIntegrationTest hello.bpmn20.xml顯示如何使用UEL方法表達(dá)式調(diào)用Spring bean上的方法

<definitions id="definitions">

  <process id="helloProcess">

    <startEvent id="start" />
    <sequenceFlow id="flow1" sourceRef="start" targetRef="print" />

    <serviceTask id="print" flowable:expression="#{printer.printMessage()}" />
    <sequenceFlow id="flow2" sourceRef="print" targetRef="end" />

    <endEvent id="end" />

  </process>

</definitions>

自動(dòng)資源部署

  1. 在流程引擎配置中轧抗,您可以指定一組資源恩敌。創(chuàng)建流程引擎后,將掃描和部署所有這些資源
    • 有過(guò)濾可以防止重復(fù)部署鸦致。僅當(dāng)資源實(shí)際更改時(shí)潮剪,才會(huì)將新部署部署到Flowable DB
<bean id="processEngineConfiguration" class="org.flowable.spring.SpringProcessEngineConfiguration">
  ...
  <property name="deploymentResources"
    value="classpath*:/org/flowable/spring/test/autodeployment/autodeploy.*.bpmn20.xml" />
</bean>

<bean id="processEngine" class="org.flowable.spring.ProcessEngineFactoryBean">
  <property name="processEngineConfiguration" ref="processEngineConfiguration" />
</bean>
  • 默認(rèn)情況下涣楷,上面的配置會(huì)將與過(guò)濾器匹配的所有資源分組到Flowable引擎的單個(gè)部署中
    • 這些資源中只有一個(gè)流程定義發(fā)生了變化,則整個(gè)部署將被視為新部署
  1. 自定義部署的確定方式
  • 在SpringProcessEngineConfiguration中指定其他屬性deploymentMode(定義從與篩選器匹配的資源集確定部署的方式)
    • default:將所有資源分組到單個(gè)部署中抗碰,并對(duì)該部署應(yīng)用重復(fù)篩選
    • single-resource:為每個(gè)單獨(dú)的資源創(chuàng)建單獨(dú)的部署狮斗,并對(duì)該部署應(yīng)用重復(fù)過(guò)濾。這是用于單獨(dú)部署每個(gè)流程定義的值弧蝇,如果已更改碳褒,則僅創(chuàng)建新的流程定義版本
    • resource-parent-folder:為共享同一父文件夾的資源創(chuàng)建單獨(dú)的部署,并對(duì)該部署應(yīng)用重復(fù)篩選看疗。此值可用于為大多數(shù)資源創(chuàng)建單獨(dú)的部署沙峻,但仍可以通過(guò)將它們放在共享文件夾中來(lái)對(duì)其進(jìn)行分組
<bean id="processEngineConfiguration"
    class="org.flowable.spring.SpringProcessEngineConfiguration">
  ...
  <property name="deploymentResources" value="classpath*:/flowable/*.bpmn" />
  <property name="deploymentMode" value="single-resource" />
</bean>
  • 創(chuàng)建一個(gè)子類SpringProcessEngineConfiguration并覆蓋該getAutoDeploymentStrategy(String deploymentMode)方法

單元測(cè)試

與Spring集成時(shí),可以使用標(biāo)準(zhǔn)的Flowable測(cè)試工具輕松測(cè)試業(yè)務(wù)流程

JUnit 5測(cè)試
@ExtendWith(FlowableSpringExtension.class)
@ExtendWith(SpringExtension.class)
@ContextConfiguration(classes = SpringJunitJupiterTest.TestConfiguration.class)
public class MyBusinessProcessTest {

  @Autowired
  private RuntimeService runtimeService;

  @Autowired
  private TaskService taskService;

  @Test
  @Deployment
  void simpleProcessTest() {
    runtimeService.startProcessInstanceByKey("simpleProcess");
    Task task = taskService.createTaskQuery().singleResult();
    assertEquals("My Task", task.getName());

    taskService.complete(task.getId());
    assertEquals(0, runtimeService.createProcessInstanceQuery().count());

  }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末两芳,一起剝皮案震驚了整個(gè)濱河市摔寨,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌怖辆,老刑警劉巖是复,帶你破解...
    沈念sama閱讀 211,817評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異竖螃,居然都是意外死亡淑廊,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,329評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門特咆,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)季惩,“玉大人,你說(shuō)我怎么就攤上這事腻格』埃” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,354評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵荒叶,是天一觀的道長(zhǎng)碾阁。 經(jīng)常有香客問(wèn)我,道長(zhǎng)些楣,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,498評(píng)論 1 284
  • 正文 為了忘掉前任宪睹,我火速辦了婚禮愁茁,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘亭病。我一直安慰自己鹅很,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,600評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布罪帖。 她就那樣靜靜地躺著促煮,像睡著了一般邮屁。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上菠齿,一...
    開(kāi)封第一講書(shū)人閱讀 49,829評(píng)論 1 290
  • 那天佑吝,我揣著相機(jī)與錄音,去河邊找鬼绳匀。 笑死芋忿,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的疾棵。 我是一名探鬼主播戈钢,決...
    沈念sama閱讀 38,979評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼是尔!你這毒婦竟也來(lái)了殉了?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,722評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤拟枚,失蹤者是張志新(化名)和其女友劉穎薪铜,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體梨州,經(jīng)...
    沈念sama閱讀 44,189評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡痕囱,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,519評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了暴匠。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片鞍恢。...
    茶點(diǎn)故事閱讀 38,654評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖每窖,靈堂內(nèi)的尸體忽然破棺而出帮掉,到底是詐尸還是另有隱情,我是刑警寧澤窒典,帶...
    沈念sama閱讀 34,329評(píng)論 4 330
  • 正文 年R本政府宣布蟆炊,位于F島的核電站,受9級(jí)特大地震影響瀑志,放射性物質(zhì)發(fā)生泄漏涩搓。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,940評(píng)論 3 313
  • 文/蒙蒙 一劈猪、第九天 我趴在偏房一處隱蔽的房頂上張望昧甘。 院中可真熱鬧,春花似錦战得、人聲如沸充边。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,762評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)浇冰。三九已至贬媒,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間肘习,已是汗流浹背际乘。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,993評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留井厌,地道東北人蚓庭。 一個(gè)月前我還...
    沈念sama閱讀 46,382評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像仅仆,于是被迫代替她去往敵國(guó)和親器赞。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,543評(píng)論 2 349