今天在写程式的时候发现一个问题,就是有多个系统都各自有自己的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上,使用起来效能上和速度上都会打折扣,所以,除非必要,不建议如此操作。
结语:
这个作为一次记录,防止忘了,如果以后找到更好的方法,再来更新,另外网上已经有不少类似的方法,汲取前人经验,感谢前人栽树!