簡體   English   中英

使用Activiti引擎在集群應用程序上的異步服務任務

[英]Async service tasks on clustered applications with Activiti engine

我有2個應用程序在同一個數據庫上運行。 他們兩個都開始這樣的激活過程:

for (i = 0; i < msgNbr; i++) {
    Map<String, Object> dataMap = Data.prepareData(testOptions);
    runtimeService.startProcessInstanceByKey("asyncTransferProcess", dataMap);
}

正在啟動的進程中的第一個服務任務是異步的:

<serviceTask id="serviceTask1" name="ServiceTask1" activiti:exclusive="true"
    activiti:class="com.test.activiti.async.ServiceTask1"></serviceTask>

異步執行程序配置:

<property name="asyncExecutor" ref="asyncExecutor" />
<property name="asyncExecutorEnabled" value="true" />
<property name="asyncExecutorActivate" value="true" />

<bean id="asyncExecutor" class="org.activiti.engine.impl.asyncexecutor.DefaultAsyncJobExecutor">
    <property name="corePoolSize" value="20" />
    <property name="maxPoolSize" value="50" />
    <property name="keepAliveTime" value="3000" />
    <property name="queueSize" value="200" />
    <property name="maxTimerJobsPerAcquisition" value="2" />
    <property name="maxAsyncJobsDuePerAcquisition" value="2" />
    <property name="defaultAsyncJobAcquireWaitTimeInMillis" value="1000" />
    <property name="defaultTimerJobAcquireWaitTimeInMillis" value="1000" />
    <property name="timerLockTimeInMillis" value="60000" />
    <property name="asyncJobLockTimeInMillis" value="60000" />
</bean>

問題是,當應用程序嘗試運行進程時,我得到了ActivitiOptimisticLockingException和NullPointerException,這是因為應用程序的運行可能會嘗試運行同一作業。 應用程序即使不注意例外也能正常工作,但是我想知道是否有任何提示如何在同一個數據庫上運行帶有異步進程的多個應用程序,也許有一種方法可以使應用程序僅運行自己的作業?

您需要做的第一件事就是啟用強UUID。 通過將以下內容添加到Activiti配置類中,可以啟用此功能:

StrongUuidGenerator idGenerator =新的StrongUuidGenerator(); processEngineConfiguration.setIdGenerator(idGenerator);

為什么我相信這會有所幫助? 因為您可能正在經歷的樂觀鎖是從數據庫中檢索下一個ID。 Strong UUID生成器不會接觸數據庫,因此更適合於大型應用程序。

希望這可以幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM