Activity专题(一)-Activity流程引擎配置

一、 使用Activity的API设置流程引擎

1.读取默认的配置文件

public static void main(String[] args) {
		//使用Activiti默认的方式创建ProcessEngineConfiguration
		ProcessEngineConfiguration config = ProcessEngineConfiguration.createProcessEngineConfigurationFromResourceDefault();	
	}

默认到Classpath下读取activity.cfg.xml文件。找到processEngineConfigration的Bean,找不到则报错。

public static ProcessEngineConfiguration parseProcessEngineConfiguration(Resource springResource, String beanName) {
    DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory();
    XmlBeanDefinitionReader xmlBeanDefinitionReader = new XmlBeanDefinitionReader(beanFactory);
    xmlBeanDefinitionReader.setValidationMode(XmlBeanDefinitionReader.VALIDATION_XSD);
    xmlBeanDefinitionReader.loadBeanDefinitions(springResource);
    ProcessEngineConfigurationImpl processEngineConfiguration = (ProcessEngineConfigurationImpl) beanFactory.getBean(beanName);
    processEngineConfiguration.setBeans(new SpringBeanFactoryProxyMap(beanFactory));
    return processEngineConfiguration;
  }

2.读取自定义的配置文件

public static void main(String[] args) {
		// 指定配置文件创建ProcessEngineConfiguration
		ProcessEngineConfiguration config = ProcessEngineConfiguration
				.createProcessEngineConfigurationFromResource(
						"my-activiti2.xml", "test2");
		System.out.println(config.getProcessEngineName());
	}

告诉Activity需要到Classpath查找my-activiti2.xml文件,并且创建名称为test2的bean。

3.读取输入流配置

image-20210125082523975

	public static void main(String[] args) throws Exception {
		File file = new File("resource/activiti.cfg.xml");
		System.out.println(file.getAbsolutePath());
		System.out.println(file.getName());
		// 得到文件输入流
		InputStream fis = new FileInputStream(file);
		// 使用createProcessEngineConfigurationFromInputStream方法创建ProcessEngineConfiguration
		ProcessEngineConfiguration config = ProcessEngineConfiguration
				.createProcessEngineConfigurationFromInputStream(fis);
	}

二、数据源配置

1.DBCP数据源配置

<?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">

	<!-- 使用DBCP数据源 -->
	<bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource">
		<property name="driverClassName" value="com.mysql.jdbc.Driver" />
		<property name="url" value="jdbc:mysql://10.224.221.199:3306/activiti_study" />
		<property name="username" value="dble" />
		<property name="password" value="dble" />
	</bean>

	<bean id="processEngineConfiguration"
		class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration">
		<property name="dataSource" ref="dataSource" />
	</bean>

</beans>
public static void main(String[] args) throws Exception {
		// 读取 dbcp-config.xml配置
		ProcessEngineConfiguration config = ProcessEngineConfiguration
				.createProcessEngineConfigurationFromResource("dbcp-config.xml");
		// 能正常输出,即完成配置
		DataSource ds = config.getDataSource();
		// 查询数据库元信息,如果能查询则表示连接成功
		ds.getConnection().getMetaData();
		// 结果为 org.apache.commons.dbcp.BasicDataSource
		System.out.println(ds.getClass().getName());
	}

也可以在Bean中不进行指定,使用时再Setter

<?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.StandaloneProcessEngineConfiguration">
	</bean>

</beans>
	public static void main(String[] args) throws Exception {
		// 创建DBCP数据源
		BasicDataSource ds = new BasicDataSource();
		// 设置JDBC连接的各个属性
		ds.setUsername("dble");
		ds.setPassword("dble");
		ds.setUrl("jdbc:mysql://10.224.221.199:3306/activiti_study");
		ds.setDriverClassName("com.mysql.jdbc.Driver");
		// 验证是否连接成功
		ds.getConnection().getMetaData();
		// 读取Activiti配置文件
		ProcessEngineConfiguration config = ProcessEngineConfiguration
				.createProcessEngineConfigurationFromResource("dbcp-coding.xml");
		// 为ProcessEngineConfiguration设置dataSource属性
		config.setDataSource(ds);
		System.out.println(config.getDataSource());
	}

2.C3P0数据源配置

<?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">

	<!-- 使用C3P0数据源 -->
	<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
		<property name="driverClass" value="com.mysql.jdbc.Driver" />
		<property name="jdbcUrl" value="jdbc:mysql://10.224.221.199:3306/activiti_study" />
		<property name="user" value="dble" />
		<property name="password" value="dble" />
	</bean>

	<bean id="processEngineConfiguration"
		class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration">
		<property name="dataSource" ref="dataSource" />
	</bean>

</beans>

public static void main(String[] args) throws Exception {
		// 读取c3p0-config.xml配置
		ProcessEngineConfiguration config = ProcessEngineConfiguration
				.createProcessEngineConfigurationFromResource("config/c3p0-config.xml");
		// 能正常输出,即完成配置
		DataSource ds = config.getDataSource();
		// 查询数据库元信息,如果能查询则表示连接成功
		ds.getConnection().getMetaData();
		// 结果为 com.mchange.v2.c3p0.ComboPooledDataSource
		System.out.println(config.getDataSource().getClass().getName());
	}

3.数据库策略配置

​ activiti数据库表处理策略
​ false(默认):检查数据库表的版本和依赖库的版本, 如果版本不匹配就抛出异常。
​ true: 构建流程引擎时,执行检查,如果需要就执行更新。 如果表不存在,就创建。(常用)
​ create-drop: 构建流程引擎时创建数据库表, 关闭流程引擎时删除这些表。
​ drop-create:先删除表再创建表。(常用,使用完成后改为true)
​ create: 构建流程引擎时创建数据库表, 关闭流程引擎时不删除这些表。


<bean id="processEngineConfiguration"
	class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration">
	<!-- 数据源 -->
	<property name="dataSource" ref="dataSource" />
	<!-- activiti数据库表处理策略 -->
	<!--    false(默认):检查数据库表的版本和依赖库的版本, 如果版本不匹配就抛出异常。
			true: 构建流程引擎时,执行检查,如果需要就执行更新。 如果表不存在,就创建。(常用)
			create-drop: 构建流程引擎时创建数据库表, 关闭流程引擎时删除这些表。
			drop-create:先删除表再创建表。(常用,使用完成后改为true)
			create: 构建流程引擎时创建数据库表, 关闭流程引擎时不删除这些表。
	 -->
	<property name="databaseSchemaUpdate" value="true"/>
</bean>

4.databaseType配置

<property name="databaseType" value="mysql"/>

<!-- 将databaseType设置为oracle -->
	<bean id="processEngineConfiguration"
		class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration">
		<property name="jdbcUrl" value="jdbc:mysql://10.224.221.199:3306/act_test" />
		<property name="jdbcDriver" value="com.mysql.jdbc.Driver" />
		<property name="jdbcUsername" value="dble" />
		<property name="jdbcPassword" value="dble" />
		<property name="databaseSchemaUpdate" value="true"/>
        <!-- 可以设置数据库类型 -->
		<property name="databaseType" value="mysql"/>
	</bean>

默认可以不指定,会根据数据库连接进行推测数据库类型

image-20210125132549375

三、其他属性配置

1.history配置

可以配置如下的历史级别:

  • none: skips all history archiving. This is the most performant for runtime process execution, but no historical information will be available.

    忽略所有的历史归档。尽管对于运行期流程执行来说这是性能最高的,但是没有历史信息保留。

  • activity: archives all process instances and activity instances. No details will be archived

    归档所有流程实例和活动实例。不归档细节。

  • audit: This is the default. It archives all process instances, activity instances and all form properties that are submitted so that all user interaction through forms is traceable and can be audited.

    这是默认级别。它归档所有流程实例,活动实例和提交的表单属性。以至于通过表单的所有用户交互都是可跟踪并可以被审计。

  • full: This is the highest level of history archiving and hence the slowest. This level stores all information as in the audit level plus all other possible details like process variable updates.

    这是历史归档的最高级别。所以是最慢的。这个水平保存audit级别的所有信息加上像流程变量的所有其它可能的细节。

2.邮箱服务器配置

<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="yangenxiong@163.com"></property>
		<property name="mailServerUsername" value="yangenxiong@163.com"></property>
		<property name="mailServerPassword" value="123456"></property>
	</bean>

四、ProcessEngineConfigration及其子类

ProcessEngineConfiguration代表Activiti的一个配置实例,ProcessEngineConfiguration本身是一个抽象类,因此要配置bean需要知道它的子类。在定制自己的ProcessEngineConfiguration之前,我们先来了解它及其几个子类:

image-20210128131949696

如上图所示,ProcessEngineConfiguration是全部配置类的父类,它有一个ProcessEngineConfigurationImpl子类,这个子类也是个抽象类,在这三个子类下面又有三个直接子类。

org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration:使用该类作为配置对象,Activiti将会对事务进行管理,默认情况下,流程引擎启动时会检查数据库结构以及版本是否正确。

org.activiti.engine.impl.cfg.StandaloneInMemProcessEngineConfiguration:该类同样由Activiti进行事务管理,但是该类设置了databaseSchemaUpdate(create-drop)和jdbcUrl(jdbc:h2:mem:activiti)属性,以便可以在单元测试中使用。

org.activiti.spring.SpringProcessEngineConfiguration:当Activiti与Spring进行整合时,可以使用该类。

org.activiti.engine.impl.cfg.JtaProcessEngineConfiguration:不使用Activiti的事务,使用JTA进行事务管理。

1.自定义ProcessEngineConfiguration

如果我们想自定义一个ProcessEngineConfiguration抽象类可以选择继承ProcessEngineConfiguration或者它的直接子类ProcessEngineConfigurationImpl。

继承ProcessEngineConfiguration类需要实现buildProcessEngine方法,继承ProcessEngineConfigurationImpl需要实现getDefaultCommandInterceptorsTxRequired和getDefaultCommandInterceptorsTxRequiresNew方法。如果需要添加自定义属性,可以为自己的ProcessEngineConfiguration类添加属性,并且添加相应的setter方法。

五、Activity的命令拦截器

1.自定义拦截器

Activiti提供了命令拦截器的功能,外界对Activit流程中各个实例进行操作,实际可以被看作是对数据进行相应的操作,在此过程中,Activiti使用了设计模式中的 命令模式,
每一个操作数据库CRUD的操作,均可被看做为一个命令 Command,然后交由命令执行者 CommandExecutor去执行。除此之外,为了能让使用者可以对这些命令进行相应的拦截,Activiti还使用了设计模式中的 职责链模式,使用者可以在其中添加相应的拦截器。

职责模式让多个对象都有机会处理请求,从而避免了请求发送者和请求接收者之间的耦合。这些请求接收者将组成一条链,并沿着这条链传递下去,
直到有一个对象处理这个请求为止,这就形成了一条责任链。

命令设计模式:http://blog.csdn.net/u012867699/article/details/76778699

职责链设计模式:http://blog.csdn.net/u012867699/article/details/76778926

Activiti使用了一个CommandContext类作为命令接收者,该对象维护一系列的Manager对象,这些Manager对象就是J2EE中的DAO对象。
除了命令接收者外,Activiti还使用一系列的CommandInterceptor(命令拦截器),这些命令拦截器扮演命令模式中的命令执行者角色。

参考链接学习:https://blog.csdn.net/u012867699/article/details/76777088

1.创建拦截器

package org.crazyit.activiti;

import org.activiti.engine.impl.interceptor.Command;
import org.activiti.engine.impl.interceptor.CommandConfig;
import org.activiti.engine.impl.interceptor.CommandInterceptor;

/**
 * 拦截器实现A
 * 
 */
public class InterceptorA implements CommandInterceptor {

	private CommandInterceptor next;
	
	@Override
	public <T> T execute(CommandConfig config, Command<T> command) {
		// 输出字符串和命令
		System.out.println("this is interceptor A:"
				+ command.getClass().getName());
		// 然后让责任链中的下一请求处理者处理命令
		return getNext().execute(config, command);
	}
	
	public CommandInterceptor getNext() {
		return this.next;
	}
	
	public void setNext(CommandInterceptor next) {
		this.next = next;
	}
}

2.配置拦截器

package org.crazyit.activiti;

import java.util.ArrayList;
import java.util.List;

import org.activiti.engine.impl.cfg.ProcessEngineConfigurationImpl;
import org.activiti.engine.impl.interceptor.CommandInterceptor;

/**
 * 自定义配置类
 */
public class TestConfiguration extends ProcessEngineConfigurationImpl {
	
	public CommandInterceptor createTransactionInterceptor() {
		// 不实现事务拦截器
		return null;
	}
	
	/**
	 * 重写初始化命令拦截器方法
	 */
	public void initCommandInterceptors() {
		// 为父类的命令集合添加拦截器
		customPreCommandInterceptors = new ArrayList<CommandInterceptor>();
		// 依次将A和B两个拦截器加入集合(责任链)
		customPreCommandInterceptors.add(new InterceptorA());
		customPreCommandInterceptors.add(new InterceptorB());
		// 再调用父类的实始化方法
		super.initCommandInterceptors();
	}
}

3.运行

package org.crazyit.activiti;

import java.util.HashMap;
import java.util.Map;

import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngineConfiguration;
import org.activiti.engine.ProcessEngines;

public class MyConfig {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		ProcessEngines.getDefaultProcessEngine();
		// 创建Activiti配置对象
		ProcessEngineConfiguration config = ProcessEngineConfiguration
				.createProcessEngineConfigurationFromResource("my-config.xml");		
		// 初始化流程引擎
		ProcessEngine engine = config.buildProcessEngine();
		// 部署一个最简单的流程
		engine.getRepositoryService().createDeployment()
				.addClasspathResource("bpmn/config.bpmn20.xml").deploy();
		// 构建流程参数
		Map<String, Object> vars = new HashMap<String, Object>();
		vars.put("day", 10);
		// 开始流程
		engine.getRuntimeService().startProcessInstanceByKey("vacationProcess",
				vars);
		System.exit(0);
	}
}

image-20210129135402694

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: activity是Android中的一个组件,用于构建用户界面和处理用户交互。其工作流程如下: 1. 创建activity:当用户启动应用程序或从其他activity转换到当前activity时,系统会创建一个新的activity实例。 2. 加载布局:activity创建后,系统会加载与之关联的布局文件,并将其显示在屏幕上。 3. 处理用户交互:用户与activity交互时,系统会调用相应的回调方法,例如onCreate、onStart、onResume等。 4. 处理生命周期:当用户离开当前activity或者屏幕被覆盖时,系统会调用相应的回调方法,例如onPause、onStop、onDestroy等。 5. 保存和恢复状态:当activity被销毁并重新创建时,系统会保存和恢复其状态,以确保用户体验的连续性。 总之,activity是Android应用程序中最重要的组件之一,负责处理用户界面和用户交互,同时也需要处理生命周期和状态保存等问题。 ### 回答2: activity工作流程是指在软件开发过程中,将一个复杂的业务流程拆分成一系列的简单的活动或任务,并通过定义这些活动之间的逻辑关系,实现任务的协作和执行。 首先,需要明确定义业务流程的目标和要求。然后,通过业务分析,将业务流程拆分成各个子任务或活动,并确定它们的执行顺序和依赖关系。 接下来,需要对每个活动进行详细设计和实现。这包括确定活动的输入和输出,定义活动所需的资源和工具,以及编写执行该活动的代码。 在实际执行过程中,根据活动之间的关系,可以采用串行、并行或条件分支的方式来组织活动的执行顺序。每个活动在执行时,需要根据预设条件进行判断,确定是否满足执行条件。如果满足条件,则执行该活动;如果不满足条件,则等待条件满足后再执行。 在活动执行过程中,还需要及时记录活动的执行结果和状态,并根据需要进行相应的处理。如果某个活动执行失败,可以根据事先定义的异常处理策略,进行异常处理,并进行相应的后续操作。 最后,根据整个业务流程的执行结果,进行相应的汇总和统计,并输出相应的报告或结果。 总结来说,activity工作流程是通过将复杂的业务流程拆分成若干个简单的活动,并通过定义它们之间的逻辑关系和执行顺序,实现业务流程的自动化执行和协作。它可以提高工作效率,减少人为操作的错误,并方便对业务流程进行管理和监控。 ### 回答3: Activity工作流程是一种流行的、灵活的工作流程管理框架。它适用于各种类型的应用程序,包括企业、电子商务和科学应用。下面是Activity工作流程的详细解释。 Activity工作流程由一系列活动(Activity)组成,这些活动表示可以在应用程序中执行的任务或操作。每个活动都有一个特定的目标,并且通常是按照特定的顺序进行的。 工作流程开始于一个起始活动(Start Activity),表示工作流程的起点。然后,根据定义的规则和条件,系统将根据不同的条件选择执行不同的活动。 在Activity工作流程中,活动可以是串行的(Sequential),也可以是并行的(Parallel)。串行活动按顺序执行,而并行活动可以同时执行。这使得Activity工作流程非常灵活,可以适应各种业务场景的需求。 每个活动都可以定义输入和输出数据,以及执行的规则和条件。这些规则和条件可用于控制工作流程的流转,并在需要时触发特定的行为或决策。 在Activity工作流程中,活动之间可以有依赖关系,也可以有分支和合并。这些依赖关系和控制结构可以用来管理工作流程的执行顺序和条件。例如,如果某个活动的执行条件不满足,工作流程可以跳过该活动并继续执行其他活动。 工作流程的最后一个活动通常是结束活动(End Activity),表示工作流程的终点。当活动执行到结束活动时,工作流程就完成了。 总的来说,Activity工作流程是一种灵活而强大的工作流程管理框架,可以在各种场景中使用。它的特点包括定义明确的活动、支持串行和并行执行、具有条件和规则控制等。通过使用Activity工作流程,可以更加有效地管理和执行复杂的业务流程

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

潘顾昌

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值