在ACTIVITI 7中将defaultExecutorType设置为BATCH

问题描述

我正在使用具有基于弹簧的配置的ACTIVITI 7。 因此,我们知道ACTIVITI内部使用mybatis框架,因此我们要求批量执行操作,即批量创建和删除实例。 Activiti使用的认ExecutorType为SIMPLE。我们正在寻找性能,因此我们尝试在ACTIVITI中设置defaultExecutorType = Batch(如mybatis https://mybatis.org/mybatis-3/configuration.html#settings所建议)。

我正在尝试在mappings.xml文件(org.activiti.db.mapping)的activiti-engine-7.0.0 jar中设置此配置。

<settings>
    <setting name="lazyLoadingEnabled" value="false" />
    <setting name="defaultFetchSize" value="1000" />
    <setting name="defaultExecutorType" value="BATCH" />
  </settings>

但是将defaultExecutorType设置为BATCH后,它没有提交数据库中的数据。

注意:如果我将StandaloneProcessEngineConfiguration与defaultExecutorType = Batch一起使用,则它工作正常。

我要添加我的类文件,进程定义,pom.xml和activiti配置文件

请建议我。

最好的问候

工件:

activiti.cfg.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       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">
 
    <bean id="dataSource"
          class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver" />
        <property name="url" value="jdbc:oracle:thin:@localhost:1521:xe" />
        <property name="username" value="username" />
        <property name="password" value="password" />
    </bean>
            
    <bean id="sessionFactory"
          class="org.springframework.orm.hibernate4.LocalSessionfactorybean">
        <property name="dataSource">
            <ref bean="dataSource" />
        </property>
        <property name="hibernateProperties">            
            <props>
                <prop key="hibernate.show_sql">true</prop>
                  
            </props>
          
        </property> 
    </bean>
    
    <bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">   
        <property name="sessionFactory" ref="sessionFactory" />
    </bean>
            
    <bean id="processEngineConfiguration" class="org.activiti.spring.SpringProcessEngineConfiguration">
         <property name="dataSource" ref="dataSource" />
        <property name="transactionManager" ref="transactionManager" />
        <property name="databaseSchemaUpdate" value="true" />      
    </bean>
 
    <bean id="processEngine" class="org.activiti.spring.ProcessEnginefactorybean">
        <property name="processEngineConfiguration" ref="processEngineConfiguration" />
    </bean>
 
    <bean id="runtimeService" factory-bean="processEngine"
          factory-method="getRuntimeService" />
    <bean id="taskService" factory-bean="processEngine"
          factory-method="getTaskService" />
    <bean id="repositoryService" factory-bean="processEngine"
          factory-method="getRepositoryService" />
</beans> 

TestClient.java

/*
 * To change this license header,choose License Headers in Project Properties.
 * To change this template file,choose Tools | Templates
 * and open the template in the editor.
 */
package com.mycompany.onlyactiviti;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngineConfiguration;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration;
import org.activiti.engine.runtime.Execution;
import org.activiti.engine.runtime.ProcessInstance;

/**
 *
 * @author developer
 */
public class TestClient {

    public static ProcessEngine processEngine;
    private static RuntimeService runtimeService;

    static String currentActiveNode;
    static String transitionName;
    static String transitionDecision = null;


    public static void main(String[] args) {

        System.out.println("******************************************************************************** ");

        System.out.println("Starting Process Engine .............. ");

        //processEngine = getProcessConfiguration().buildProcessEngine();//Working properly if we use standalone mode
        processEngine = ProcessEngines.getDefaultProcessEngine();//Not committing data if we use SpringbasedConfiguration
        runtimeService = processEngine.getRuntimeService();

        System.out.println("Process Engine  Started.............. ");
        System.out.println("******************************************************************************** ");

        System.out.println("******************************************************************************** ");
        System.out.println(" deploying process deFinition ....");
        RepositoryService repositoryService = processEngine.getRepositoryService();
        repositoryService.createDeployment().addClassPathResource("State_Machine.bpmn").deploy();
        System.out.println("Process DeFinition Deployed Successfully");
        System.out.println("******************************************************************************** ");

        String pdName = "State_Machine";
        String instancekey = "MyKey2";
        Map transientvars = new HashMap();

        ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(pdName,instancekey,transientvars);
        System.out.println(" Process Defintion Name :" + processInstance.getProcessDeFinitionName());
        System.out.println(" Created Process Instance :" + processInstance.getId());
        System.out.println(" ProcessInstance.getActivityId() " + processInstance.getActivityId());

        System.out.println("******************************************************************************** ");
        System.out.println(" List Available Executions :  ");
        List<Execution> executions = runtimeService.createExecutionQuery().processInstanceId(processInstance.getId()).list();
        System.out.println("size of executions::" + executions.size());//If spring based configuration is used then it return 0 and if standalone configuration is used it return 2
        for (Execution ex : executions) {
            if (ex.getActivityId() != null) {
                List<String> activities = runtimeService.getActiveActivityIds(ex.getId());
                System.out.println("\tPrinting activities for execution with id " + ex.getId() + ",ex.isEnded()=" + ex.isEnded() + ",ex.getActivityId()='" + ex.getActivityId() + "'");
                for (String activity : activities) {
                    System.out.println("\t\tFound activity:" + activity);
                    currentActiveNode = activity;
                }
            } else {
                System.out.println("execution activiti id is null - " + ex.getName());
            }
        }
        System.out.println("******************************************************************************** ");

        System.out.println("******************************************************************************** ");
        System.out.println("Performing Transition to next state ");
        transitionName = "Step2";

        List<Execution> executions1 = runtimeService.createExecutionQuery().processInstanceId(processInstance.getId()).processInstanceBusinessKey(instancekey,true).activityId(currentActiveNode).list();
        if (executions1.size() > 0) {
            Execution execution = executions1.get(0);
            Map processVariablesForTrigger = new HashMap();
            processVariablesForTrigger.put("transition",transitionName);
            runtimeService.trigger(execution.getId(),processVariablesForTrigger);
            System.out.println("\n Execute Transition Sucessfully.");
        } else {
            System.out.println("\n Execution Size is ." + executions1.size());
        }

        System.out.println("******************************************************************************** ");
        System.out.println(" List Available Executions :  ");
        executions = runtimeService.createExecutionQuery().processInstanceId(processInstance.getId()).list();
        System.out.println("size of executions::" + executions.size());//If spring based configuration is used then it return 0 and if standalone configuration is used it return 2
        for (Execution ex : executions) {
            if (ex.getActivityId() != null) {//Not sure what such records represent,but one execution is found per instance like this!
                List<String> activities = runtimeService.getActiveActivityIds(ex.getId());
                System.out.println("\tPrinting activities for execution with id " + ex.getId() + ",ex.getActivityId()='" + ex.getActivityId() + "'");
                for (String activity : activities) {
                    System.out.println("\t\tFound activity:" + activity);
                    currentActiveNode = activity;
                }
            } else {
                System.out.println("execution activiti id is null - " + ex.getName());
            }
        }
        System.out.println("******************************************************************************** ");

        System.out.println("******************************************************************************** ");

        transitionName = "End";

        System.out.println("Performing Transition to next state ");
        executions1 = runtimeService.createExecutionQuery().processInstanceId(processInstance.getId()).processInstanceBusinessKey(instancekey,processVariablesForTrigger);
            System.out.println("\n Execute Transition Sucessfully.");
        } else {
            System.out.println("\n Execution Size is ." + executions1.size());
        }

        processEngine.close();

    }

    public static ProcessEngineConfiguration getProcessConfiguration() {
        ProcessEngineConfiguration cfg = new StandaloneProcessEngineConfiguration()
                .setJdbcUrl("jdbc:oracle:thin:@(DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))) (CONNECT_DATA = (SERVICE_NAME = xe)))")
                .setJdbcUsername("username")
                .setJdbcPassword("password")
                .setJdbcDriver("oracle.jdbc.OracleDriver")
                .setDatabaseSchemaUpdate(ProcessEngineConfiguration.DB_SCHEMA_UPDATE_TRUE);
        return cfg;
    }

}

pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>ActivitiDeveloperQuickStart</groupId>
    <artifactId>ActivitiDeveloperQuickStart</artifactId>
    <version>0.0.1-SNAPSHOT</version>

    <!-- ... other configurations may exist,such as a build stanza,depending your environment ... -->
    <properties>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.activiti</groupId>
            <artifactId>activiti-engine</artifactId>
            <version>7.0.0.GA</version>              
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.7.21</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
            <version>1.7.21</version>
        </dependency>
        <dependency>
            <groupId>com.oracle.database.jdbc</groupId>
            <artifactId>ojdbc8</artifactId>
            <version>19.7.0.0</version>
        </dependency>
       
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-core</artifactId>
            <version>4.3.8.Final</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
            <version>4.2.5.RELEASE</version>
       </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>4.2.5.RELEASE</version>               
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-orm</artifactId>
            <version>4.2.5.RELEASE</version>
       </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-beans</artifactId>
            <version>4.2.5.RELEASE</version>   
        </dependency>
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.17</version>
        </dependency>
    </dependencies>
</project>

State_Machine.bpmn

<?xml version="1.0" encoding="UTF-8"?>
<deFinitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:activiti="http://activiti.org/bpmn" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:omgdc="http://www.omg.org/spec/DD/20100524/DC" xmlns:omgdi="http://www.omg.org/spec/DD/20100524/DI" typeLanguage="http://www.w3.org/2001/XMLSchema" expressionLanguage="http://www.w3.org/1999/XPath" targetNamespace="http://www.activiti.org/test">
  <process id="State_Machine" name="State Machine" isExecutable="true">
    <startEvent id="startevent1" name="Start"></startEvent>
    <receiveTask id="step1" name="Step1_Success"></receiveTask>
    <receiveTask id="step2" name="Step2_Success"></receiveTask>
    <endEvent id="endevent1" name="End"></endEvent>
    <sequenceFlow id="flow1" sourceRef="startevent1" targetRef="step1"></sequenceFlow>
    <sequenceFlow id="flow2" sourceRef="step1" targetRef="step2">
      <conditionExpression xsi:type="tFormalExpression"><![CDATA[#{"Step2".equals(transition)}]]></conditionExpression>
    </sequenceFlow>
    <sequenceFlow id="flow3" sourceRef="step2" targetRef="endevent1">
      <conditionExpression xsi:type="tFormalExpression"><![CDATA[#{"End".equals(transition)}]]></conditionExpression>
    </sequenceFlow>
  </process>
</deFinitions>

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)