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

str*_*ear 3 java spring datasource activiti spring-boot

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

我希望我的应用程序使用一个数据源,用于持久化我的模型和一个单独的数据源供 Activiti 引擎使用,因此它可以将其实体保存在单独的数据库中。

截至目前,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;
}
Run Code Online (Sandbox Code Playgroud)

但是我如何通知 Activiti 使用 activitiDataSource?

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

谢谢!

Don*_*ler 6

@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);
    }
}
Run Code Online (Sandbox Code Playgroud)

Activiti 将使用它activitiDataSource来创建它的表并持久化它的数据。

现在您可以创建另一个DataSource来承载您的应用程序表和数据。这是一个基于spring-boot-sample-basic. 基本上它customerIdWaiterEntity/ WaiterRepository(使用 Spring Data JPA - 为简洁起见省略)中保留 a,然后将该持久值传递给 Activitibasic2.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);
    }
}
Run Code Online (Sandbox Code Playgroud)

注意@PrimaryprimaryDataSource。如果您忽略这一点,您的WAITER_ENTITY表将在activitiDataSource(没有任何其他特定配置)中创建。