一.介绍
flowable相比activity,增加了一个新的特性,即异步处理历史数据。
我们在操作流程的过程中都会保存历史数据到不同的历史表中,如果流程数量很多的情况下,同步保存历史数据便会带来一定的性能压力。
flowable给我们提供了一种异步处理的方法,其中这种方式的原理其实就是开启历史定时器,然后定期轮训历史作业,然后解析并将其插入到不同的历史表。
这种方式本质还是使用的线程池以及数据库的轮训处理方式,flowable在6.1.2版本之后引入了消息队列机制来处理历史作业。
JMS被用作传输协议,当然了任何协议都是有效的。
这里我采用RabbitMQ,通过异步消息处理历史数据。
1.不使用轮训数据库的方式,而是采用将消息发到到消息队列,并指示消息作业已经准备ok。
2.历史作业数据与运行数据是在同一个事务中的。这样就可以避免脏数据。
3.Flowable提供了一个消息监听器,这样监听器就可以监听到指定的队列消息并进行处理。比如作业的获取,将其存储到历史表中。
4.如果我们实际项目开发中,不希望将历史数据放置到flowable引擎表中,那我们可以扩展相应的代码,将历史作业以及历史数据存放到其他介质,比如mongodb或者es等搜索引擎。
如果使用这种方式,那么消息监听器可以完全与流程引擎解耦,也就是各做各的事情。
架构示意图如下所示:
一.flowable服务端(消息的提供端)
1.引入依赖
<!--flowable工作流依赖--> <dependency> <groupId>org.flowable</groupId> <artifactId>flowable-spring-boot-starter-process</artifactId> <version>${flowable.version}</version> </dependency> <!--jms--> <dependency> <groupId>org.flowable</groupId> <artifactId>flowable-jms-spring-executor</artifactId> <version>${flowable.version}</version> </dependency> <!--mysql依赖--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>${mysql-version}</version> </dependency> <!-- rabbitmq --> <dependency> <groupId>org.springframework.amqp</groupId> <artifactId>spring-rabbit</artifactId> <version>${amqp.version}</version> </dependency> <!-- flowable-dmn--> <dependency> <groupId>org.flowable</groupId> <artifactId>flowable-dmn-spring-configurator</artifactId> <version>${flowable.version}</version> </dependency> <!-- flowable-form--> <dependency> <groupId>org.flowable</groupId> <artifactId>flowable-form-spring-configurator</artifactId> <version>${flowable.version}</version> </dependency> |
2.配置Config
@Configuration public class FlowableRabbitConfig { public static final String EXCHANGE = "mbo-flowable"; public static final String QUEUE = "mbo-flowable-history"; /** * 配置mysql连接 * @return */ @Bean @ConfigurationProperties("spring.datasource") public DataSource dataSource() { return new DataSource(); } /** * 事务配置 * @return */ @Bean public PlatformTransactionManager transactionManager() { DataSourceTransactionManager transactionManager = new DataSourceTransactionManager(); transactionManager.setDataSource(dataSource()); return transactionManager; |