基于SpringBoot,Activiti7,activiti分散在不同的schema,需要连接多个不同schema和不同DB的解决方法。

今天在写程式的时候发现一个问题,就是有多个系统都各自有自己的activitiDB,现在我需要写一个Job,去扫这几个系统的在跑的数据,然后要用到各自的activiti,然后问题来了,在Springboot启动的时候只能指定一个activiti的schema,也即是说我只能同时连接一个系统的activiti,那么我要如何连接第二个系统的activiti呢?网上有不少解决方法,可以自行百度,我就是用了其中一种:

一:当需要连接不同DB的时候:

1.首先需要用到自定义的DriverManagerDataSource ,写一个动态的获取dataSource的方法:

public DriverManagerDataSource getDataSource() {
    DriverManagerDataSource ds = new DriverManagerDataSource();
    try {
        ds.setUsername("account");
        ds.setPassword("password");
        ds.setUrl("url");
        ds.setDriverClassName("driver");
        ds.getConnection().getMetaData();
    } catch (Exception e) {
        e.printStackTrace();
    }
    return ds;
}

不同的数据来源可以写不同的方法或者通过switch case的方式写成一个方法,根据实际出发自行选择。

2.接着就是调用:

@Autowired
DataInitService dataInitService;
@Transactional
public void processor() throws Exception {
    //open connection
    dataSource = dataInitService.getDataSource();
    Connection conn = dataSource.getConnection();
    JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
    List<Map<String, Object>> list = jdbcTemplate.queryForList("select * from abs")

    //close connection
    if (dataSource != null) {
        conn.close();
    }
}

二:抱歉,这里才是本文主题连接activiti:

1.首先第一步和上面一样也是先重新init一个新的dataSource,但是返回的东西稍有不同,这次我们返回的不再是dataSource,而是一个ProcessEngineConfiguration:

public ProcessEngineConfiguration getDataSource() {
    ProcessEngineConfiguration config = ProcessEngineConfiguration.createStandaloneProcessEngineConfiguration();
    DriverManagerDataSource ds = new DriverManagerDataSource();
    try {
        ds.setUsername("account");
        ds.setPassword("password");
        ds.setUrl("url");
        ds.setDriverClassName("driver");
        ds.getConnection().getMetaData();

        config.setDataSource(ds); 
        //使用PG数据库的时候,多个activiti分别在不同的schema,
        //但是SpringBoot启动只会跑yml写好的指定的那个schema
        //所以这里的schema可以根据需要自行变更
        config.setDatabaseSchema("schema");
        config.setDatabaseSchemaUpdate("true");
    } catch (Exception e) {
        e.printStackTrace();
    }
    return config;
}

不同的schema可以写成不同的方法,各自调用,或者通过switch case的方式写成一个方法,统一调用,根据实际需要出发,自行选择。

2.然后我们同样来调用它:

@Autowired
DataInitService dataInitService;
TaskService taskService;
@Transactional
public void processor() {
    ProcessEngine engine = dataInitService.getDataSource().buildProcessEngine();
    taskService = engine.getTaskService();
    
    //close engine
    if (engine != null) {
        engine.close();
    }
}

和上面不同的是,这里是直接拿到了不同系统底下的activiti自带的TaskSerivce,然后我们就可以通过taskId去获取对应的task。

问题:

在实操过程中发现了一些问题:

1.如果activiti有采用监听器的话会导致无法进行set的动作,只能get数据,因为暂时找不到不重启后端,动态跟随DB变更到对应监听器的方法。

2.如果在使用了这种方法进行去获取不同DB的数据之后,要想再次获取不同DB的数据,得重新刷新一次connection,把connection变更到你想要获取的那个DB上,使用起来效能上和速度上都会打折扣,所以,除非必要,不建议如此操作。

结语:

这个作为一次记录,防止忘了,如果以后找到更好的方法,再来更新,另外网上已经有不少类似的方法,汲取前人经验,感谢前人栽树!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值