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

时间:2014-11-12 14:31:23

标签: java spring datasource spring-boot activiti

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

我希望我的应用程序使用一个dataSource,用于持久化我的模型和一个单独的dataSource供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;
}

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

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

谢谢!

2 个答案:

答案 0 :(得分:3)

@ 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的基本示例。 基本上它会在customerId / WaiterEntity中保留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);
    }
}

注意@Primary上的primaryDataSource。如果不加考虑,WAITER_ENTITY表将在activitiDataSource中创建(没有任何其他特定配置)。

答案 1 :(得分:1)

在Spring启动时,您应该在application.properties中配置数据源配置。

例如:

spring.datasource.url=jdbc:postgresql://localhost:5432/activiti_development
spring.datasource.username=postgres
spring.datasource.password=postgres
spring.datasource.driver-class-name=org.postgresql.Driver

参考:http://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-sql.html