一尘不染

在Spring Boot应用中为Activiti指定单独的数据源

spring-boot

如何在Spring Boot应用程序中使用两个单独的数据源?

我希望应用程序使用一个dataSource,用于持久化模型,而Activiti引擎使用一个单独的dataSource,以便将其实体保存在单独的数据库中。

到目前为止,Activiti的表和我的应用程序的表是在同一数据库中创建的。

[编辑]:

我知道我可以定义两个单独的DataSource bean,例如:

@Bean
public DataSource appDataSource() {
    BasicDataSource dataSource = new BasicDataSource();
    dataSource.setDriverClassName("org.hsqldb.jdbcDriver");
    dataSource.setUrl("xxx");
    dataSource.setUsername("xxx");
    dataSource.setPassword("xxx");
    return dataSource;
}

@Bean
public DataSource activitiDataSource() {
    BasicDataSource dataSource = new BasicDataSource();
    dataSource.setDriverClassName("xxx");
    dataSource.setUrl("xxx");
    dataSource.setUsername("xxx");
    dataSource.setPassword("xxx");
    return dataSource;
}

但是如何通知Activiti使用activitiDataSource?

我正在使用Activiti 5.16.4,顺便说一句…

谢谢!


阅读 1112

收藏
2020-05-30

共1个答案

一尘不染

@ andy-
wilkinson给出了答案,但这是如何使用它的示例。根据您的建议,创建另一个DataSource,然后将其连接到SpringProcessEngineConfiguration。像这样:

@Configuration
public class ActivitiConfiguration extends AbstractProcessEngineAutoConfiguration {

    @Bean
    @ConfigurationProperties(prefix = "datasource.activiti")
    public DataSource activitiDataSource() {
        return DataSourceBuilder
                .create()
                .url("jdbc:h2:mem:activiti")
                .username("activiti")
                .driverClassName("org.h2.Driver")
                .build();
    }

    @Bean
    public SpringProcessEngineConfiguration springProcessEngineConfiguration(
            PlatformTransactionManager transactionManager,
            SpringAsyncExecutor springAsyncExecutor) throws IOException {

        return baseSpringProcessEngineConfiguration(
                activitiDataSource(),
                transactionManager,
                springAsyncExecutor);
    }
}

Activiti将用于activitiDataSource创建其表并保留其数据。

现在,您可以创建另一个DataSource来携带应用程序表和数据。这是基于的基本示例spring-boot-sample- basic。基本上,它customerIdWaiterEntity/中保留a WaiterRepository(使用Spring Data
JPA-为简洁起见,然后将其保留)传递到Activiti basic2.bpmn进程,该进程仅将其打印出到控制台。

@SpringBootApplication
public class Application {

    @Bean
    @Primary
    @ConfigurationProperties(prefix = "datasource.primary")
    public DataSource primaryDataSource() {
        return DataSourceBuilder
                .create()
                .url("jdbc:h2:mem:primary")
                .username("primary")
                .driverClassName("org.h2.Driver")
                .build();
    }

    @Bean
    CommandLineRunner basics(final RuntimeService runtimeService,
                             final WaiterRepository repository) {
        return new CommandLineRunner() {

            @Override
            public void run(String... strings) throws Exception {
                runtimeService.startProcessInstanceByKey(
                        "waiter2",
                        Collections.singletonMap(
                                "customerId",
                                (Object) repository.save(new WaiterEntity(123L)).getCustomerId()));
            }
        };
    }

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

注意@PrimaryprimaryDataSource。如果您省略该WAITER_ENTITY表,则将在中创建表activitiDataSource(没有任何其他特定配置)。

2020-05-30