Camunda использует отдельный пользователь для сценариев создания базы данных - PullRequest
0 голосов
/ 15 апреля 2019

В моем приложении Camunda Spring Boot я использую application.properties для установки информации о подключении к базе данных, т.е.

spring.datasource.url=<database url>
spring.datasource.username=<app username>
spring.datasource.password=<password>
spring.datasource.driverClassName=<driver>

Когда я впервые запускаю ее для пустой базы данных, Камунда повторно использует эту информацию пользователя для запуска своих сценариев создания базы данных. Есть ли возможность указать отдельного пользователя базы данных для сценариев Camunda sql? Я хотел бы иметь 2 пользователей базы данных, один для приложения и один для задач миграции базы данных.

1 Ответ

0 голосов
/ 25 апреля 2019

если вы хотите иметь 2 пользователей базы данных, вы должны определить свойства всех 2 источников данных в application.yml, а затем создать класс CamundaConfiguration для настройки источника данных camnuda при весенней загрузке.

вставить приведенный ниже код в приложение.yml

datasource:
    initialize: false
    type: com.zaxxer.hikari.HikariDataSource
    jdbcUrl: jdbc:oracle:thin:@192.168.0.1:1521:MYDB
    username: MYAPP
    password: MYAPP


camunda.bpm:
        job-execution-enabled:  true
        history-level: FULL
        auto-deployment-enabled: true
        id-generator: strong
        checkProcessDefinitions: true
        deployment-resource-pattern:  classpath:/process/**/*.bpmn
        datasource:
          type: com.zaxxer.hikari.HikariDataSource
          schema-update: true
          schema-name: camunda
          jdbcUrl: jdbc:oracle:thin:@192.168.0.1:1521:MYDB
          username: camunda
          password: camunda

создайте класс CamundaConfiguration

 package org.valz.service.impl;
 import java.io.IOException;
 import java.sql.SQLException;

 import javax.naming.NamingException;
 import javax.sql.DataSource;

 import org.valz.framework.common.core.Constants;
 import org.camunda.bpm.engine.spring.ProcessEngineFactoryBean;
 import org.camunda.bpm.engine.spring.SpringProcessEngineConfiguration;
 import org.camunda.bpm.engine.spring.SpringProcessEngineServicesConfiguration;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.boot.autoconfigure.jdbc.DataSourceBuilder;
 import org.springframework.boot.context.properties.ConfigurationProperties;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
 import org.springframework.context.annotation.Import;
 import org.springframework.context.annotation.Profile;
 import org.springframework.core.io.Resource;
 import org.springframework.core.io.support.ResourcePatternResolver;
 import org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor;
 import org.springframework.jdbc.datasource.DataSourceTransactionManager;
 import org.springframework.jndi.JndiTemplate;
 import org.springframework.transaction.PlatformTransactionManager;
 @Configuration
 @Import( SpringProcessEngineServicesConfiguration.class )
 public class CamundaConfiguration  {
     @Value("${spring.camunda.bpm.history-level}")
     private String historyLevel;

     // add more configuration here
     // ---------------------------

     // configure data source via application.properties

     @Autowired
     private ResourcePatternResolver resourceLoader;

     @Bean
     // @ConfigurationProperties(prefix="spring.camunda.bpm")
     public SpringProcessEngineConfiguration processEngineConfiguration() throws IOException {
         SpringProcessEngineConfiguration config = new SpringProcessEngineConfiguration();

         config.setDataSource(camundaDataSource());
         config.setDatabaseSchemaUpdate("true");

         config.setTransactionManager(transactionManager());
         config.setHistory(historyLevel);

         config.setJobExecutorActivate(false);
         config.setMetricsEnabled(false);
         config.setJdbcBatchProcessing(false);
         // deploy all processes from folder 'processes'classpath:/process/*.bpmn
         Resource[] resources = resourceLoader.getResources("classpath:/process/**/*.bpmn");
         config.setDeploymentResources(resources);

         return config;
     }

     @Bean
     public PlatformTransactionManager transactionManager() {
         return new DataSourceTransactionManager(camundaDataSource());
     }

     @Bean(name="camundaBpmDataSource")
     @ConfigurationProperties(prefix="spring.camunda.bpm.dataSource")
     @Profile(Constants.SPRING_PROFILE_DEVELOPMENT)
     public DataSource camundaDataSource() {
         System.out.println("spring.camunda.bpm.dataSource");
         return DataSourceBuilder.create().build();
     }
     @Bean(name = "camundaBpmDataSource")
     @Profile(Constants.SPRING_PROFILE_PRODUCTION)
     public DataSource jndiDataSource() throws SQLException, NamingException {
         JndiTemplate jndi = new JndiTemplate();
         DataSource dataSource = (DataSource) jndi.lookup("camunda");
         return dataSource;
     }
     @Bean
     public ProcessEngineFactoryBean processEngine() throws IOException {
         ProcessEngineFactoryBean factoryBean = new ProcessEngineFactoryBean();
         factoryBean.setProcessEngineConfiguration(processEngineConfiguration());
         return factoryBean;
     }

 }

и добавьте этот класс тоже

package org.Valz.boot.config;

import javax.sql.DataSource;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.context.annotation.Profile;
import org.springframework.jdbc.datasource.lookup.JndiDataSourceLookup;
import org.springframework.transaction.annotation.EnableTransactionManagement;

@Configuration
@EnableTransactionManagement
public class DatabaseConfiguration {
   public DatabaseConfiguration() {
   }

@Bean(
    name = {"dataSource"}
)
@Primary
@ConfigurationProperties(
    prefix = "spring.datasource"
)

public DataSource dataSource() {
    return DataSourceBuilder.create().build();
}

}

...