Camunda использует отдельного пользователя для скриптов создания базы данных

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

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

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


person Radu Dumbrăveanu    schedule 15.04.2019    source источник


Ответы (1)


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

вставьте ниже код в application.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();
}

}

person Vahid Alizadeh    schedule 25.04.2019
comment
к сожалению, он использует второго пользователя базы данных, т.е. camunda как для создания схемы, так и для запуска бизнес-процесса. - person Radu Dumbrăveanu; 20.05.2019
comment
Я редактирую свой пост и добавляю класс DatabaseConfiguration. добавьте этот класс в свой код. - person Vahid Alizadeh; 22.05.2019
comment
Это все еще не дает ответа на вопрос об использовании разных пользователей для DDL и DML. - person LIU ShouHai; 30.06.2020