精华内容
下载资源
问答
  • Flowable 快速入门教程:SpringBoot 集成 Flowable + Flowable Modeler 流程配置可视化(超详细)版本加依赖内部日志初始化 ProcessEngine代码初始化flowable.cfg.xml 初始化我的初始化示例 版本 这里选择的版本为...

    版本

    这里选择的版本为 6.4.1

    Flowable 6.4.1 release

    中文版用户手册:Flowable BPMN 用户手册

    如果需要集成 Flowable Modeler 的请下载源码

    PS:不要选择 6.4.2 版本,这个版本有发版问题

    加依赖

    由于是 spring-boot 集成,因此直接选择 flowable-spring-boot-starter,里面提供了齐全的 REST API

    <!-- Flowable spring-boot 版套餐 -->
    <dependency>
        <groupId>org.flowable</groupId>
        <artifactId>flowable-spring-boot-starter</artifactId>
        <version>6.4.1</version>
    </dependency>
    

    其他的也可以直接选择 flowable-engine

    <!-- flowable-engine -->
    <dependency>
        <groupId>org.flowable</groupId>
        <artifactId>flowable-engine</artifactId>
        <version>6.4.1</version>
    </dependency>
    
    

    加配置

    # flowable 配置
    flowable:
      # 关闭异步,不关闭历史数据的插入就是异步的,会在同一个事物里面,无法回滚
      # 开发可开启会提高些效率,上线需要关闭
      async-executor-activate: false
    

    内部日志

    Flowable 使用 SLF4J 作为内部日志框架。在这个例子中,我们使用 log4j 作为 SLF4J 的实现。

    加依赖

    <!-- Flowable 内部日志采用 SLF4J -->
    <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>
    

    resource 目录下新建文件 log4j.properties

    log4j.rootLogger=DEBUG, CA
    log4j.appender.CA=org.apache.log4j.ConsoleAppender
    log4j.appender.CA.layout=org.apache.log4j.PatternLayout
    log4j.appender.CA.layout.ConversionPattern= %d{hh:mm:ss,SSS} [%t] %-5p %c %x - %m%n
    

    初始化 ProcessEngine

    代码初始化

    // 流程引擎配置
    ProcessEngineConfiguration cfg = new StandaloneProcessEngineConfiguration()
                        .setJdbcUrl(url)
                        .setJdbcUsername(username)
                        .setJdbcPassword(password)
                        .setJdbcDriver(driverClassName)
                        // 初始化基础表,不需要的可以改为 DB_SCHEMA_UPDATE_FALSE
                        .setDatabaseSchemaUpdate(ProcessEngineConfiguration.DB_SCHEMA_UPDATE_TRUE);
    // 初始化流程引擎对象
    ProcessEngine processEngine = cfg.buildProcessEngine();
    

    flowable.cfg.xml 初始化

    代码部分

    // 流程引擎配置
    ProcessEngineConfiguration cfg = ProcessEngineConfiguration
    	// 根据文件名获取配置文件
            //.createProcessEngineConfigurationFromResource("activiti.cfg.xml");
            // 获取默认配置文件,默认的就是 activiti.cfg.xml
            .createProcessEngineConfigurationFromResourceDefault()
            // 初始化基础表,不需要的可以改为 DB_SCHEMA_UPDATE_FALSE
            .setDatabaseSchemaUpdate(ProcessEngineConfiguration.DB_SCHEMA_UPDATE_TRUE);
    // 初始化流程引擎对象
    ProcessEngine processEngine = cfg.buildProcessEngine();
    

    新建 flowable.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="processEngineConfiguration" class="org.flowable.engine.impl.cfg.StandaloneProcessEngineConfiguration">
            <property name="jdbcUrl" value="jdbc:mysql://127.0.0.1:3306/test"/>
            <property name="jdbcDriver" value="com.mysql.jdbc.Driver"/>
            <property name="jdbcUsername" value="root"/>
            <property name="jdbcPassword" value="123456"/>
            <property name="databaseSchemaUpdate" value="true"/>
        </bean>
    </beans>
    

    我的初始化示例

    我的配置文件 ProcessEngineConfig.java

    依赖

    • spring-boot-configuration-processor 加载配置文件
    • lomok 简化 java 代码
    <!-- 配置文件处理器 -->
    <dependency>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-configuration-processor</artifactId>
     </dependency>
     <!-- lombok -->
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>1.18.0</version>
        <scope>provided</scope>
    </dependency>
    
    /**
     * 流程引擎配置文件
     * @author: linjinp
     * @create: 2019-10-21 16:49
     **/
    @Configuration
    @ConfigurationProperties(prefix = "spring.datasource")
    @Data
    public class ProcessEngineConfig {
    
        private Logger logger = LoggerFactory.getLogger(ProcessEngineConfig.class);
    
        @Value("${spring.datasource.url}")
        private String url;
    
        @Value("${spring.datasource.driver-class-name}")
        private String driverClassName;
    
        @Value("${spring.datasource.username}")
        private String username;
    
        @Value("${spring.datasource.password}")
        private String password;
    
        @Value("${spring.datasource.publicKey}")
        private String publicKey;
    
        /**
         * 初始化流程引擎
         * @return
         */
        @Primary
        @Bean(name = "processEngine")
        public ProcessEngine initProcessEngine() {
            logger.info("=============================ProcessEngineBegin=============================");
    
            // 流程引擎配置
            ProcessEngineConfiguration cfg = null;
    
            try {
                cfg = new StandaloneProcessEngineConfiguration()
                        .setJdbcUrl(url)
                        .setJdbcUsername(username)
                        .setJdbcPassword(ConfigTools.decrypt(publicKey, password))
                        .setJdbcDriver(driverClassName)
                        // 初始化基础表,不需要的可以改为 DB_SCHEMA_UPDATE_FALSE
                        .setDatabaseSchemaUpdate(ProcessEngineConfiguration.DB_SCHEMA_UPDATE_TRUE)
                        // 默认邮箱配置
                        // 发邮件的主机地址,先用 QQ 邮箱
                        .setMailServerHost("smtp.qq.com")
                        // POP3/SMTP服务的授权码
                        .setMailServerPassword("xxxxxxx")
                        // 默认发件人
                        .setMailServerDefaultFrom("836369078@qq.com")
                        // 设置发件人用户名
                        .setMailServerUsername("管理员")
                        // 解决流程图乱码
                        .setActivityFontName("宋体")
                        .setLabelFontName("宋体")
                        .setAnnotationFontName("宋体");
            } catch (Exception e) {
                e.printStackTrace();
            }
            // 初始化流程引擎对象
            ProcessEngine processEngine = cfg.buildProcessEngine();
            logger.info("=============================ProcessEngineEnd=============================");
            return processEngine;
        }
    }
    

    PS:这里没有单独对流程引擎中的 8 个核心服务做初始化,是因为使用 flowable-spring-boot-starter 依赖,会自动帮忙注册好,不需要自己再注册,直接使用即可

    如果你使用的依赖是 flowable-engine,你可能还需要

    //八大接口
    // 业务流程的定义相关服务
    @Bean
    public RepositoryService repositoryService(ProcessEngine processEngine){
        return processEngine.getRepositoryService();
    }
    
    // 流程对象实例相关服务
    @Bean
    public RuntimeService runtimeService(ProcessEngine processEngine){
        return processEngine.getRuntimeService();
    }
    
    // 流程任务节点相关服务
    @Bean
    public TaskService taskService(ProcessEngine processEngine){
        return processEngine.getTaskService();
    }
    
    // 流程历史信息相关服务
    @Bean
    public HistoryService historyService(ProcessEngine processEngine){
        return processEngine.getHistoryService();
    }
    
    // 表单引擎相关服务
    @Bean
    public FormService formService(ProcessEngine processEngine){
        return processEngine.getFormService();
    }
    
    // 用户以及组管理相关服务
    @Bean
    public IdentityService identityService(ProcessEngine processEngine){
        return processEngine.getIdentityService();
    }
    
    // 管理和维护相关服务
    @Bean
    public ManagementService managementService(ProcessEngine processEngine){
        return processEngine.getManagementService();
    }
    
    // 动态流程服务
    @Bean
    public DynamicBpmnService dynamicBpmnService(ProcessEngine processEngine){
        return processEngine.getDynamicBpmnService();
    }
    //八大接口 end
    

    集成 Flowable Modeler

    下载源码

    版本为 6.4.1,不多说了,看文章开头下载源码

    文件位置

    打开文件夹 flowable-ui-modeler

    路径:flowable-engine-flowable-6.4.1\modules\flowable-ui-modeler

    • flowable-ui-modeler-app:主要为前端界面,文件在 resource/static
    • flowable-ui-modeler-conf:主要为一些配置文件 Configuration
    • flowable-ui-modeler-logic:主要为一些业务逻辑还有 SQL
    • flowable-ui-modeler-rest:主要为 rest 接口

    这些都是需要用到的

    新增依赖

    使用 rest,logic,conf 的依赖

    <!-- flowable 集成依赖 rest,logic,conf -->
    <dependency>
        <groupId>org.flowable</groupId>
        <artifactId>flowable-ui-modeler-rest</artifactId>
        <version>6.4.1</version>
    </dependency>
    <dependency>
        <groupId>org.flowable</groupId>
        <artifactId>flowable-ui-modeler-logic</artifactId>
        <version>6.4.1</version>
    </dependency>
    <dependency>
        <groupId>org.flowable</groupId>
        <artifactId>flowable-ui-modeler-conf</artifactId>
        <version>6.4.1</version>
    </dependency>
    

    代码集成

    前端代码集成

    在项目中的 resource 文件夹下新建一个 static 文件夹

    SpringBoot 能自动读取 static 目录下的静态文件,因此文件夹名称不可随意更改

    复制 flowable-ui-modeler-app 包中 resources\static 下所有文件,复制到新建的 static

    路径:flowable-engine-flowable-6.4.1\modules\flowable-ui-modeler\flowable-ui-modeler-app\src\main\resources\static

    在这里插入图片描述

    后端代码集成

    复制以下文件到自己的项目中

    ApplicationConfiguration.java

    路径:flowable-engine-flowable-6.4.1\modules\flowable-ui-modeler\flowable-ui-modeler-conf\src\main\java\org\flowable\ui\modeler\conf

    原因:这个文件是启动中必要的配置文件,需要做修改,详细的可以看下 app 中启动类,文件路径随意

    AppDispatcherServletConfiguration.java

    路径:flowable-engine-flowable-6.4.1\modules\flowable-ui-modeler\flowable-ui-modeler-conf\src\main\java\org\flowable\ui\modeler\servlet

    原因:这个文件是启动中必要的配置文件,需要做修改,详细的可以看下 app 中启动类,文件路径随意

    StencilSetResource.java

    路径:flowable-engine-flowable-6.4.1\modules\flowable-ui-modeler\flowable-ui-modeler-rest\src\main\java\org\flowable\ui\modeler\rest\app

    同时在 resource 下新建一个 stencilset 文件夹用来放汉化文件,可以直接下载我上传的

    原因:国际化配置加载,为了使用我们自己的汉化文件因此把文件拿出来并修改,文件路径随意

    PS:复制出来后要对这个文件进行重命名,否则会与 Jar 包里的文件产生 Bean 存在的冲突

    我这重命名后叫 FlowableStencilSetResource.java

    SecurityUtils

    路径:flowable-engine-flowable-6.4.1\modules\flowable-ui-common\src\main\java\org\flowable\ui\common\security

    原因:流程模型加载需要调用的工具类,文件路径需要与原路径保持一致

    也就是包路径必须是 org.flowable.ui.common.security 这样在 Jar 中的方法在调用时会覆盖原 Jar 里的工具类

    结构

    在这里插入图片描述

    代码修改

    ApplicationConfiguration 修改

    此文件不需要过多说明,主要移除 IDM 方面的配置

    注意 conf 目录不要引入,里面也包含和 IDM 相关的配置

    @Configuration
    @EnableConfigurationProperties(FlowableModelerAppProperties.class)
    @ComponentScan(basePackages = {
    //        "org.flowable.ui.modeler.conf", // 不引入 conf
            "org.flowable.ui.modeler.repository",
            "org.flowable.ui.modeler.service",
    //        "org.flowable.ui.modeler.security", //授权方面的都不需要
    //        "org.flowable.ui.common.conf", // flowable 开发环境内置的数据库连接
    //        "org.flowable.ui.common.filter", // IDM 方面的过滤器
            "org.flowable.ui.common.service",
            "org.flowable.ui.common.repository",
            //
    //        "org.flowable.ui.common.security",//授权方面的都不需要
            "org.flowable.ui.common.tenant" },excludeFilters = {
            // 移除 RemoteIdmService
            @ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE, value = RemoteIdmService.class)
        }
    )
    public class ApplicationConfiguration {
    
        @Bean
        public ServletRegistrationBean modelerApiServlet(ApplicationContext applicationContext) {
            AnnotationConfigWebApplicationContext dispatcherServletConfiguration = new AnnotationConfigWebApplicationContext();
            dispatcherServletConfiguration.setParent(applicationContext);
            dispatcherServletConfiguration.register(ApiDispatcherServletConfiguration.class);
            DispatcherServlet servlet = new DispatcherServlet(dispatcherServletConfiguration);
            ServletRegistrationBean registrationBean = new ServletRegistrationBean(servlet, "/api/*");
            registrationBean.setName("Flowable Modeler App API Servlet");
            registrationBean.setLoadOnStartup(1);
            registrationBean.setAsyncSupported(true);
            return registrationBean;
        }
    }
    

    AppDispatcherServletConfiguration 修改

    同理,为了不引入 IDM 的配置

    @Configuration
    @ComponentScan(value = { "org.flowable.ui.modeler.rest.app",
            // 不加载 rest,因为 getAccount 接口需要我们自己实现
    //        "org.flowable.ui.common.rest"
        },excludeFilters = {
            // 移除 EditorUsersResource 与 EditorGroupsResource,因为不使用 IDM 部分
            @ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE, value = EditorUsersResource.class),
            @ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE, value = EditorGroupsResource.class),
            // 配置文件用自己的
            @ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE, value = StencilSetResource.class),
        }
    )
    @EnableAsync
    public class AppDispatcherServletConfiguration implements WebMvcRegistrations {
    
        private static final Logger LOGGER = LoggerFactory.getLogger(AppDispatcherServletConfiguration.class);
    
        @Bean
        public SessionLocaleResolver localeResolver() {
            return new SessionLocaleResolver();
        }
    
        @Bean
        public LocaleChangeInterceptor localeChangeInterceptor() {
            LOGGER.debug("Configuring localeChangeInterceptor");
            LocaleChangeInterceptor localeChangeInterceptor = new LocaleChangeInterceptor();
            localeChangeInterceptor.setParamName("language");
            return localeChangeInterceptor;
        }
    
        @Override
        public RequestMappingHandlerMapping getRequestMappingHandlerMapping() {
            LOGGER.debug("Creating requestMappingHandlerMapping");
            RequestMappingHandlerMapping requestMappingHandlerMapping = new RequestMappingHandlerMapping();
            requestMappingHandlerMapping.setUseSuffixPatternMatch(false);
            requestMappingHandlerMapping.setRemoveSemicolonContent(false);
            Object[] interceptors = { localeChangeInterceptor() };
            requestMappingHandlerMapping.setInterceptors(interceptors);
            return requestMappingHandlerMapping;
        }
    }
    

    SecurityUtils 修改

    这个主要保存时候会调这里的接口

    getCurrentUserObject 方法进行修改,让他获取默认的 admin

    /**
     * @return the {@link User} object associated with the current logged in user.
     */
    public static User getCurrentUserObject() {
        if (assumeUser != null) {
            return assumeUser;
        }
    
        RemoteUser user = new RemoteUser();
        user.setId("admin");
        user.setDisplayName("Administrator");
        user.setFirstName("Administrator");
        user.setLastName("Administrator");
        user.setEmail("admin@flowable.com");
        user.setPassword("123456");
        List<String> pris = new ArrayList<>();
        pris.add(DefaultPrivileges.ACCESS_MODELER);
        pris.add(DefaultPrivileges.ACCESS_IDM);
        pris.add(DefaultPrivileges.ACCESS_ADMIN);
        pris.add(DefaultPrivileges.ACCESS_TASK);
        pris.add(DefaultPrivileges.ACCESS_REST_API);
        user.setPrivileges(pris);
        return user;
    }
    

    新增 getAccount 接口

    新建文件 FlowableController,自己随意

    在加载页面时候会调用这个接口获取用户信息,由于我们绕过了登陆,因此给个默认的用户 admin

    为了不和原文件冲突,所以 @RequestMapping("/login")

    /**
     * Flowable 相关接口
     * @author linjinp
     * @date 2019/10/31 10:55
     */
    @RestController
    @RequestMapping("/login")
    public class FlowableController {
    
        /**
         * 获取默认的管理员信息
         * @return
         */
        @RequestMapping(value = "/rest/account", method = RequestMethod.GET, produces = "application/json")
        public UserRepresentation getAccount() {
            UserRepresentation userRepresentation = new UserRepresentation();
            userRepresentation.setId("admin");
            userRepresentation.setEmail("admin@flowable.org");
            userRepresentation.setFullName("Administrator");
    //        userRepresentation.setLastName("Administrator");
            userRepresentation.setFirstName("Administrator");
            List<String> privileges = new ArrayList<>();
            privileges.add(DefaultPrivileges.ACCESS_MODELER);
            privileges.add(DefaultPrivileges.ACCESS_IDM);
            privileges.add(DefaultPrivileges.ACCESS_ADMIN);
            privileges.add(DefaultPrivileges.ACCESS_TASK);
            privileges.add(DefaultPrivileges.ACCESS_REST_API);
            userRepresentation.setPrivileges(privileges);
            return userRepresentation;
        }
    }
    

    url-config.js 修改

    路径:resource\static\scripts\configuration\url-conf.js

    getAccountUrl 的路径改为上面自己的 getAccount 接口的路径
    在这里插入图片描述

    StencilSetResource汉化

    记得重命名,我这重命名后叫 FlowableStencilSetResource

    把配置文件路径改为我们自己目录下的路径

    stencilset/stencilset_bpmn.jsonstencilset/stencilset_cmmn.json

    在这里插入图片描述

    启动器修改

    主要修改三个

    1. 引入 自己目录 下的 ApplicationConfigurationAppDispatcherServletConfiguration,可参考 app 的启动器
    2. 引入 Jar 包 里的 DatabaseConfiguration,这个文件是对表进行更新的,由于 conf 目录不引入,因此我们只能单独引入,具体内容可以自己看下这个文件
    3. 移除 Security 自动配置
      1. Spring Cloud 为 Finchley 版本:@SpringBootApplication(exclude={SecurityAutoConfiguration.class})
      2. Spring Cloud 为 Greenwich 版本:@SpringBootApplication(exclude={SecurityAutoConfiguration.class, ManagementWebSecurityAutoConfiguration.class, SecurityFilterAutoConfiguration.class})
    //启用全局异常拦截器
    @Import(value={
            // 引入修改的配置
            ApplicationConfiguration.class,
            AppDispatcherServletConfiguration.class,
            // 引入 DatabaseConfiguration 表更新转换
            DatabaseConfiguration.class})
    // Eureka 客户端
    @EnableDiscoveryClient
    @ComponentScan(basePackages = {"com.springcloud.*"})
    @MapperScan("com.springcloud.*.dao")
    // 移除 Security 自动配置
    // Spring Cloud 为 Finchley 版本
    // @SpringBootApplication(exclude={SecurityAutoConfiguration.class})
    // Spring Cloud 为 Greenwich 版本
    @SpringBootApplication(exclude={SecurityAutoConfiguration.class, ManagementWebSecurityAutoConfiguration.class, SecurityFilterAutoConfiguration.class})
    public class FlowableApplication {
        public static void main(String[] args) {
            SpringApplication.run(FlowableApplication.class, args);
        }
    }
    

    访问页面

    http://localhost:8087/

    自动跳转

    在这里插入图片描述

    关闭数据库自动更新

    在这里插入图片描述
    创建完数据库后,关闭自动更新。原因是更新的标准并非是你引入的流程引擎的版本,而是官方发布的版本,所以如果一直开启,以后重启之类的可能导致提示版本升级失败,毕竟你的依赖版本并没有升级。

    Factory method 'initProcessEngine' threw exception; nested exception is
    org.flowable.common.engine.api.FlowableException: 
    Could not update Flowable database schema: unknown version from database: '6.5.0.1'
    

    因此除非你确实要提高你的引擎版本到最新,否则不要开启

    假如你出现了上述问题,可尝试:
    1.删掉所有表重建
    这样会创建你当前版本的数据库,这种肯定可以,但是基本上数据是没了,除非你有耐心迁移下。

    2.直接修改当前数据库版本
    就是这张 ACT_GE_PROPERTY 的数据,如果出问题了,这里的版本就会变成更新的版本,如:6.5.0.1,状态从创建变为更新,手动直接修正所有参数。本人没尝试过这种方式,应该可行。
    在这里插入图片描述

    自身 XML 扫描不到的问题

    首页不建议将业务代码和流程引擎混在一个项目中

    如果一定要这样,遇到自己的 XML 总扫描不到,转下面的文章

    SpringBoot 集成 Flowable + Flowable Modeler 导致自身 XML 扫描不到解决方案

    结尾

    文章如果存在什么问题,请及时留言反馈

    集成后的代码:https://gitee.com/linjinp-spring-cloud/linjinp-spring-cloud
    代码在 flowable-demo 包,IDEA Active profiles 配置为 sit 测试分支,单独启动即可

    展开全文
  • Activiti中的流程配置文件

    千次阅读 2018-09-06 22:43:00
    Activiti中的流程配置文件类型可以分为以下两种: 1)普通配置,即Activiti的配置风格,通常情况下,使用该方式的文件名称为activiti.cfg.xml。 2)Spring配置,即Spring配置风格,使用该方式的文件名称可以自定义...

    Activiti中的流程配置文件类型可以分为以下两种:

    1)普通配置,即Activiti的配置风格,通常情况下,使用该方式的文件名称为activiti.cfg.xml。

    2)Spring配置,即Spring配置风格,使用该方式的文件名称可以自定义,例如activiti-context.xml、spring-activiti.xml等。

     

    Activiti配置风格

    activiti.cfg.xml配置文件的内容如下:

    <beans xmlns="http://www.springframework.org/schema/beans"
    	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"         
        xmlns:mvc="http://www.springframework.org/schema/mvc"
    	xmlns:context="http://www.springframework.org/schema/context"
    	xmlns:aop="http://www.springframework.org/schema/aop" 
        xmlns:tx="http://www.springframework.org/schema/tx"
    	xsi:schemaLocation="http://www.springframework.org/schema/beans 
    		http://www.springframework.org/schema/beans/spring-beans-3.1.xsd 
    		http://www.springframework.org/schema/mvc 
    		http://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd 
    		http://www.springframework.org/schema/context 
    	    http://www.springframework.org/schema/context/spring-context-3.1.xsd 
    		http://www.springframework.org/schema/aop 
    		http://www.springframework.org/schema/aop/spring-aop-3.1.xsd 
    		http://www.springframework.org/schema/tx 
    		http://www.springframework.org/schema/tx/spring-tx-3.1.xsd ">
        <!-- 定义一个id为processEngineConfiguration的流程引擎配置类,然后为它设置属性值 -->
        <bean id="processEngineConfiguration" 
                class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration">
            <!-- 数据库连接配置 -->
            <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/activiti_test?
                createDatabaseIfNotExist=true"></property>
            <property name="jdbcDriver" value="com.mysql.jdbc.Driver"></property>
            <property name="jdbcUsername" value="root"></property>
            <property name="jdbcPassword" value="root"></property>
            <!-- 建表策略 -->
            <property name="databaseSchemaUpdate" value="true"></property>
            <!-- 其它省略 -->
        </bean>
    </beans>

     

    Spring配置风格

     

    spring方式创建流程引擎与Activiti单独创建流程引擎是不一样的,区别在于:使用的引擎配置类不一样。

    Activiti单独创建:org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration

    spring方式创建:org.activiti.spring.SpringProcessEngineConfiguration

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:context="http://www.springframework.org/schema/context"
        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.xsd">
        <!-- 使用DBCP配置数据源 -->
        <bean id="dataSource_act" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
            <property name="driverClassName" value="com.mysql.jdbc.Driver" />
            <property name="url" value="jdbc:mysql://127.0.0.1:3306/activiti_test" />
            <property name="username" value="root" />
            <property name="password" value="root" />
        </bean>
        <!-- 事务管理 -->
        <bean id="trManager_act" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
            <property name="dataSource" ref="dataSource_act" />
        </bean>
        <!-- 自定义流程流程表ID生成策略 -->
        <bean id="uuidGenerator" class="com.zwj.activiti.UUIDGenerator"></bean>
        <!-- 定义流程引擎配置类 -->
        <bean id="processEngineConfiguration" class="org.activiti.spring.SpringProcessEngineConfiguration">
            <property name="dataSource" ref="dataSource_act" />
            <property name="transactionManager" ref="trManager_act" />
            <!-- 
                制定要使用的数据库类型
                支持这些值:h2, mysql, oracle, postgres, mssql, db2
            -->
            <property name="databaseType" value="mysql"></property>
            <!-- activiti表中使用uuid主键 -->
        	<property name="idGenerator" ref="uuidGenerator" />
            <!-- 
                设置流程引擎启动和关闭时数据库执行的策略,官方文档提供了以下三个值:
                false:Activiti在启动时,会对比数据库中保存的版本,如果没有表或者版本不匹配,将在启动时抛出异常。
                true:Activiti在启动时,会对数据库中所有表进行更新,如果表不存在,则Activiti会自动创建。
                create-drop:Activiti在启动时会执行表的创建工作,在关闭时会执行表的删除工作。
             -->
            <property name="databaseSchemaUpdate" value="true" />
            <!-- 对数据库中所有表进行更新操作,如果表不存在,则自动创建 -->
        	<property name="databaseSchema" value="ACT"/>
           <!-- 启动或关闭jobexecutor -->
        	<property name="jobExecutorActivate" value="false" />
        	<!-- 不创建identity表,使用视图 -->
        	<property name="dbIdentityUsed" value="false" />
        	<!-- 
                保存流程相关的历史数据
                none:不保存任何历史数据,因此在流程执行中,这是最高效的。
                activity:级别高于none,保存流程实例与流程行为,其他数据不保存。 
                audit:在前者的基础上,还会保存全部的流程任务极其属性。 
                full:保存历史数据的最高级别,除了会保存audit级别的数据外,还会保存其他全部流程相关的细节数据,包括一些流程参数等。
             -->
        	<property name="history" value="full"/>
        	<!-- 邮件服务相关配置 -->
        	<property name="mailServerHost" value="smtp.163.com" />
            <property name="mailServerPort" value="25" />
            <property name="mailServerUsername" value="123456"></property>
            <property name="mailServerPassword" value="xxx"></property>
            <property name="mailServerDefaultFrom" value="123456@163.com"></property>
            <!-- 生成流程图的字体 -->
            <property name="activityFontName" value="宋体"/>
            <property name="labelFontName" value="宋体"/>
            <!-- 其它省略 -->
        </bean>
        <!-- 定义流程引擎接口 -->
        <bean id="processEngine" class="org.activiti.spring.ProcessEngineFactoryBean">
            <property name="processEngineConfiguration" ref="processEngineConfiguration" />
        </bean>
        <!-- 定义Service服务接口 -->
        <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="IdentityService" factory-bean="processEngine" factory-method="getIdentityService" />
        <bean id="managementService" factory-bean="processEngine" factory-method="getManagementService" />
        <bean id="formService" factory-bean="processEngine" factory-method="getFormService" />
    
        <!--自定发布资源文件处理,这里进行处理只有改动的流程引擎才会进行再次发布。 -->
        <!-- <bean id="activitiDeployer" class="wsylp.plugins.WorkflowDeployer"> <property name="deploymentResources" value="classpath*:diagrams/autoDeploy" 
            /> </bean> -->
    </beans>

     

    history 配置

    在流程执行的过程中,会产生一些流程相应的数据,例如流程实例、流程任务和流程参数等数据,随着流程的进行与结束,这些数据将会从流程数据表中删除,为了能保存这些数据,Activiti 提供了历史数据表,可以让这些数据保存到历史数据表中。

    对于这些历史数据,保存到何种粒度,Activiti 提供了 history 属性对其进行配置。history属性有点像 log4j 的日志输出级别,该属性有以下四个值:

    none:不保存任何的历史数据,因此,在流程执行过程中,这是最高效的。

    activity:级别高于 none,保存流程实例与流程行为,其他数据不保存。

    audit:除 activity 级别会保存的数据外,还会保存全部的流程任务及其属性。audit为 history 的默认值。

    full:保存历史数据的最高级别,除了会保存 audit 级别的数据外,还会保存其他全部流程相关的细节数据,包括一些流程参数等。

     

    邮件服务器配置

    Activiti 支持邮件服务,当流程执行到某一个节点时,Activiti 会根据流程文件配置(EmailTask),发送邮件到相应的邮箱。以下为 ProcessEngineConfiguration 中提供的邮件服务器配置项:

    mailServerHost:邮件服务器地址,非必填,默认值为 localhost。

    mailServerPort:SMTP 发送邮邮件服务器端口,默认值为 25。

    mailServerDefaultFrom:非必填,发送人的邮箱地址,默认值为 activiti@activiti.org。

    mailServerUsername:邮箱登录用户名。

    mailServerPassword:邮箱登录密码。

    mailServerUseSSL:是否使用 SSL 协议通信,默认为 false。

    mailServerUseTLS:是否使用 TLS 协议通信,默认为 false。

    使用 SMTP 协议发送邮件,需要知道邮件服务器地址、SMTP 端口、邮箱登录用户名和密码。以下例子中以网易邮箱为例子,列出如何设置这几个邮件配置项。

    <bean id="processEngineConfiguration" class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration">
        <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/act" />
        <property name="jdbcDriver" value="com.mysql.jdbc.Driver" />
        <property name="jdbcUsername" value="root" />
        <property name="jdbcPassword" value="123456" />
        <property name="mailServerHost" value="smtp.163.com"></property>
        <property name="mailServerPort" value="25"></property>
        <property name="mailServerDefaultFrom" value="zwj@163.com"></property>
        <property name="mailServerUsername" value="zwj@163.com"></property>
        <property name="mailServerPassword" value="123456"></property>
    </bean> 

     

    jobExecutorActivate配置

    Activiti中提供了一个工作执行器,执行器会定时到数据库中扫描没有执行的工作,然后使用JobExecutor执行这些工作。JobExecutor会启动一条线程,定时到数据库中查询需要执行的工作,当查询到符合条件的工作时,就会调用executeJobs方法去执行这些工作。

    需要注意的是,JobExecutor类是一个抽象类,执行工作的方法交由子类去实现,默认情况下,Activiti使用DefaultJobExecutor类作为JobExecutor。在DefaultJobExecutor中维护了一个ThreadPoolExecutor线程池对象,当工作扫描线程扫描到工作时,就会以这些工作的数据键创建一条线程并交由ThreadPoolExecutor执行。

    属性jobExecutorActivate为true,则表示Activiti在流程引擎创建时,需要启动JobExecutor;为false表示不启动JobExecutor,该属性默认值为false。

     

    asyncExecutorActivate配置

    Async executor通过线程池的方式管理线程。activiti默认激活使用job executor,要使用async executor替代job executor需在配置文件中定义一下两个属性:

    属性asyncExecutorEnabled定义为true,使用async executor代替默认的job executor。

    属性asyncExecutorActivate定义为true,工作流引擎在启动时就建立启动async executor线程池。

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

     


    相关文章

    Activiti流程引擎架构概述

    Activiti数据源配置

    获取Activiti流程引擎配置信息

     

     

    展开全文
  • 流程配置文件分为两类:一类是普通的基本配置,称作 plain Activiti Style Configuration,使用的文件名为 activiti.cfg.xml一类是复杂配置,称作 Spring Style Configuration , 使用的文件名为 activiti-context.xml...

    流程配置文件分为两类:

    一类是普通的基本配置,称作 plain Activiti Style  Configuration,使用的文件名为 activiti.cfg.xml

    一类是复杂配置,称作 Spring Style Configuration , 使用的文件名为  activiti-context.xml


    除了配置内容的不同,本质上两者都是Spring的配置文件。


    下面是两个文件的样例:

    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="processEngineConfiguration" class="org.activiti.engine.impl.cfg.StandaloneInMemProcessEngineConfiguration">
    		<property name="databaseSchemaUpdate" value="true"/>
    	</bean>
    </beans>
      

    activiti-context.xml

     
    <?xml version="1.0" encoding="UTF-8"?>
    
    <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" xmlns:security="http://www.springframework.org/schema/security"
    	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.1.xsd
                               http://www.springframework.org/schema/security   http://www.springframework.org/schema/security/spring-security-3.1.xsd">
    
        <!-- Embedded ldap test server -->
    	<security:ldap-server ldif="classpath:users.ldif" root="o=activiti" manager-dn="uid=admin, ou=users" manager-password="admin"/>
    
    	<bean id="dataSource"
    		class="org.springframework.jdbc.datasource.SimpleDriverDataSource">
    		<property name="driverClass" value="org.h2.Driver" />
    		<property name="url" value="jdbc:h2:mem:activiti;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.activiti.spring.SpringProcessEngineConfiguration">
    		<property name="dataSource" ref="dataSource" />
    		<property name="transactionManager" ref="transactionManager" />
    		<property name="databaseSchemaUpdate" value="true" />
    		<property name="jobExecutorActivate" value="false" />
    		<property name="configurators">
    		  <list>
    		      <bean class="org.activiti.ldap.LDAPConfigurator">
    		      
    		        <!-- Server connection params -->
                    <property name="server" value="ldap://localhost" />
                    <property name="port" value="33389" />
                    <property name="user" value="uid=admin, ou=users, o=activiti" />
                    <property name="password" value="pass" />
                    
                    <!-- Query params -->
                    <property name="baseDn" value="o=activiti" />
                    <property name="queryUserByUserId" value="(&(objectClass=inetOrgPerson)(uid={0}))" />
                    <property name="queryUserByFullNameLike" value="(&(objectClass=inetOrgPerson)(|({0}=*{1}*)({2}=*{3}*)))" />
                    <property name="queryGroupsForUser" value="(&(objectClass=groupOfUniqueNames)(uniqueMember={0}))" />
                    
                    <!-- Attribute config -->
                    <property name="userIdAttribute" value="uid" />
                    <property name="userFirstNameAttribute" value="cn" />
                    <property name="userLastNameAttribute" value="sn" />
                    
                    <property name="groupIdAttribute" value="uid" />
                    <property name="groupNameAttribute" value="cn" />
                    
    		      </bean>
    		  </list>
    		</property>
    	</bean>
    
    	<bean id="processEngine" class="org.activiti.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>
      


    两个文件最主要的区别就是用  实现 ProcessEngineConfiguration 接口,继承了 ProcessEngineConfigurationImpl 的不同配置子类,实现不同环境下的配置。

    在配置文件中,指明 ProcessEngineConfiguration 由哪个子类实现提供信息。


    Activiti 提供的 ProcessEngineConfiguration 子类,列举在下图中配置类边界中。




    前面文章 http://blog.csdn.net/teamlet/article/details/43097141 提到过,ProcessEngine的名字会作为 key 保存引擎的配置文件。

    Activiti 默认提供了一个引擎名字,名字为 default 

    上面的两个配置文件中都没有提供引擎的名字,会导致使用默认的引擎名字 default

    使用相同的引擎名字,会移除上一个同名引擎实例并重新创建同名引擎。

    这个机制比较适合动态刷新一个引擎,利于引擎的动态修改。

    如果想要多个引擎同时运行,注意修改或在配置文件中增加引擎名字。


    代码方法:

     
    ProcessEngine processEngine = new StandaloneProcessEngineConfiguration()
          .setProcessEngineName("myProcessEngine")
       

    配置方法:

       
    <bean id="processEngineConfiguration" class="org.activiti.spring.SpringProcessEngineConfiguration">
    	<property name="processEngineName" value="myProcessEngine" />
         ...
    </bean>
      



    展开全文
  • SAP 采购订单四级审批流程配置

    千次阅读 2011-12-05 11:34:38
    SAP 采购订单四级审批流程配置   http://jiahongguang12.blog.163.com/blog/static/3346657201112394137254/   SAP 采购订单四级审批流程配置  SAP所提供的审批特性有N种,具体用哪一种审批特性,要看自己...

     SAP 采购订单四级审批流程配置

     

    http://jiahongguang12.blog.163.com/blog/static/3346657201112394137254/

     

    SAP  采购订单四级审批流程配置

           SAP所提供的审批特性有N种,具体用哪一种审批特性,要看自己的实际情况;如按公司代码特性审批:采购申请或采购订单如果属于某一个公司,就对此类单子进行审批;按供应商代码特性审批:建立PR OR PO 属于某一个供应商,就对此类单子进行审批;按采购组织代码特性审批:专对某个采购组织下的单子进行审批……..;

    下面以PO 的采购审批为例子:

        此操作手册为三年前制作,现上传BLOG 以防在需求时快速找到加以参考,有补充;

    审批策略为:对某一采购组织下创建的所有采购订单,进行四级审批;

    第一步:创建特性:T_code: CT04

      特性值在很多方面可以用得到:生产企业中应用最之广;如生产BOM的特性值选择,也即变式BOM的配置;

     如:一产成品要出口到世界的各个国家,而这些产成口结构一样,仅只有贴标或说明书的语言不同,此时就要用到生产变式BOM。在客户下单时,据客户的国家或客户特殊需求不同,勾选特性值,重组成一专属于此客户的成品结构;

    下面创建采购订单的审批特性值:

      路径:后台->Materials Management->purchshing->Purchase Order->Release Procedure For Purchase Orders -> Edit Characteristic.

    SAP 采购订单四级审批流程配置 - 本本_SAP - ERP SAP 学习与交流
    点击“Edit Charscteristic” 进入以下界面
    SAP 采购订单四级审批流程配置 - 本本_SAP - ERP SAP 学习与交流
     

    输入:特性值:Z_PO_ORG, 壮态(Status):下达;格式化:字符格式化,长度为4个字符;值分配:选“多值”(Multiple Values),“多值”选项为审批特性采购组织,是确定一个采购组织,或多个采购组织;我们选多个采购组织,也就是说,指定的多个采购组织下的PO 都要进行审批;

    维护好以上数据后:点击标签页“附加数据”(Addnl data)进入以下界面;

     注: 引用结构cekko-ekorg的数据类型
    SAP 采购订单四级审批流程配置 - 本本_SAP - ERP SAP 学习与交流
     

    如图所示:Table Name: CEKKO, Field Name: EKORG, 引用数据类型

    < xmlnamespace prefix ="o" ns ="urn:schemas-microsoft-com:office:office" /> 

    然后点击保存;弹出对话框;

     
    SAP 采购订单四级审批流程配置 - 本本_SAP - ERP SAP 学习与交流

    格式数据,取自ABAP字典;回车保存特性;

     

    第二步:创建类(T_code: CL01

      路径:前台->Logistics->Materials Management->Purchasing->Master Data->subsequent Settlement->Vendor Rebate Arrangements->Environment->Vendor->Environment ->General Classification->class-CL01(create);

     
    SAP 采购订单四级审批流程配置 - 本本_SAP - ERP SAP 学习与交流

    点击“Create

    进入以下界面

     
    SAP 采购订单四级审批流程配置 - 本本_SAP - ERP SAP 学习与交流

    输入类:Z_po_Cekko_ekorg.  类类型:032,为审批策略类;

    点击“特性”标签;

     
    SAP 采购订单四级审批流程配置 - 本本_SAP - ERP SAP 学习与交流

    填入第一步创建的特性值,然后保存;退出!

     

    第三定义审批流程

    路径:后台->Materials Management->purchasing->Purchase Order-> Release Procedure For

         Purchase Order -> Define Release Procedure For Purchase Order;

     
    SAP 采购订单四级审批流程配置 - 本本_SAP - ERP SAP 学习与交流
     

    双击进入以下初始界面;

    SAP 采购订单四级审批流程配置 - 本本_SAP - ERP SAP 学习与交流

    选“Release Groups”审批组

    点击“New Entries”新的分录填入以下值;

    审批组为:PO,类为: z_po_cekko_ekorg

    SAP 采购订单四级审批流程配置 - 本本_SAP - ERP SAP 学习与交流

    保存

    回到“Relaese Codes”点击进入!点击“新的分录”级护以下审批代码值;

     

    SAP 采购订单四级审批流程配置 - 本本_SAP - ERP SAP 学习与交流

    保存退出。

    点击“Release Indicator“批准标识;

     

    SAP 采购订单四级审批流程配置 - 本本_SAP - ERP SAP 学习与交流

    定义审批条件中的各个标识;“Chgable”列中的数据,4 表示,可修改,审批可回退,

    只有审到标识G的时候,定单才核发;故对“核发”列,G行中的复选框,选中!

     

     

    点击“Release Strategies”审批策略 

    点击“NEW Enteries”新的分录进入以下界面

     

    SAP 采购订单四级审批流程配置 - 本本_SAP - ERP SAP 学习与交流

    填入的值如上图所示;

     

    然后点击“Release prorequisites”按钮进入下图;

     

    SAP 采购订单四级审批流程配置 - 本本_SAP - ERP SAP 学习与交流

     

    点击“Continue

     

    再点击“Release statues”审批状态,按钮;

     

    SAP 采购订单四级审批流程配置 - 本本_SAP - ERP SAP 学习与交流

    点击”CONTINUE”

     

    再点击“Classification”分类,

    注意:这里维护的就是具体的哪些采购组织;

     

    SAP 采购订单四级审批流程配置 - 本本_SAP - ERP SAP 学习与交流

    后退;

    保存全部退出

     

     

    下面手工创建一采购订单试试结果;

    采购组织必须为“Y999

     

    SAP 采购订单四级审批流程配置 - 本本_SAP - ERP SAP 学习与交流

     T_code: ME29N 审批采购订单

     
    SAP 采购订单四级审批流程配置 - 本本_SAP - ERP SAP 学习与交流

     

    SAP 采购订单四级审批流程配置 - 本本_SAP - ERP SAP 学习与交流

    注:因为我使用的是SAP_ALL 权限的帐户,所以这四种状态,我都能审批;为了使审批对谁某一个人,就要启用权限控制,给不同的人,分配审批组,及审批代码,进而控制不同的级别审批对准不同的人;

     

    第二部分

    PFCG 进入创建权限;

    对于权限的控制这里就不再细述;

    只给出一级审批人员的权限对像M_EINK_FRG的权限值;

     

     

    SAP 采购订单四级审批流程配置 - 本本_SAP - ERP SAP 学习与交流

    以次类退,二级审批的人员的,值应该是:R2PO

     

    第三部分

    对采购审批配置有相当影响的 用户出口
    采购订单的审批配置完毕后,在前台生成采购订单的同时,系统自动发送采购订单的审批
    参数,以便生成此审购订单的审批界面等,在相关参数流动的时候,经过用户出口“M06E0004”
    如有需要,程序员可以据业务需要,改变生成审批时初始参数;如果此出口激活后,而没有
    任何代码,数据流不向下一下暂存区,生成的采购订单,将无法进行审批,
    下面图解用户出口“M06E0004”
    T_code:smod

    SAP 采购订单四级审批流程配置 - 本本_SAP - ERP SAP 学习与交流

     

    SAP 采购订单四级审批流程配置 - 本本_SAP - ERP SAP 学习与交流

     

    SAP 采购订单四级审批流程配置 - 本本_SAP - ERP SAP 学习与交流
    此图是专门写逻辑代码的地方;
        程序接收I_cekko里传过来的参数,加工后,要把参数传给E_cekko;
    E_cekko接收完参数后,此出口功能完毕!

    注:上图的代码没有做任何逻辑运算;直接把系统生成的参数传出;

     

    第三部分:

        工作流的中所用到的BAPI

        当保存采购订单时,触发工作流;

    BAPI: MEP_PURCHDOC_POSTED

     

     

    展开全文
  • jira自定义流程配置方式

    千次阅读 2017-10-27 16:47:35
    1、单独定义好流程要用的问题属性-->>状态的节点。 2、定义问题类型。 3、定义问题类型方案。 3、新建工作流。 4、新建工作流方案。 5、新建项目管理项目。 6、设置项目管理版本。 7、重新选择项目流程,同时为流程...
  • 原文转载
  • NC流程配置开发指南(推式生单)

    千次阅读 2012-02-05 11:57:50
    1. 流程配置说明 1.1 必要条件 一、业务建模时主实体实现接口流程信息获取(nc.itf.uap.pf.metadata.IFlowBizItf),上游单据还要实现交换前后对单据VO的调整处理(nc.itf.uap.pf.metadata.IVoChangeAdjustItf) ...
  • SAP 采购订单/采购申请审批流程配置

    千次阅读 2019-04-11 15:26:31
    http://blog.itpub.net/29829936/viewspace-1762470/
  • Activity6 快速入门安装 BPM 插件加依赖Log4j 配置初始化 ProcessEngine代码初始化activiti.cfg.xml 初始化 安装 BPM 插件 我这里用的是 IDEA Settings ➡ Plugins 搜索 actiBPM 安装即可 加依赖 <!-- ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 893,302
精华内容 357,320
关键字:

流程配置