Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Issue integrating Drools with Activiti and SpringBoot - Using Custom Post Deployers

I took help from this forum : https://community.alfresco.com/thread/225090-spring-boot-activiti-5180-and-drools-integration-issue. I was able to Autowire the ProcessEngine, get the process engine configuration and then while adding the deployer I got struck. The snippet of code is :

 SpringProcessEngineConfiguration sp = (SpringProcessEngineConfiguration) 
 processEngine.getProcessEngineConfiguration();

 List<Deployer> listDeployer = new ArrayList<Deployer>();
 listDeployer.add(new RulesDeployer());

 sp.setCustomPostDeployers(listDeployer); // <--setCustomPostDeployers function is not called

How can I achieve this and call the setCustomPostDeployers function to integrate Drools with Activiti. Can any one please help me on this issue?

like image 659
Vikram Avatar asked Nov 18 '25 11:11

Vikram


1 Answers

It takes me time to figure it out, but after reading some interesting posts and some documentation I have finally created an example using Activiti, Spring-Boot and Drools.

In your case, you are modifying the existing SpringBootConfiguration before using the processEngine, but according to my tests, is too late to adding the custom deployers there, due to the resources has been already read. Then you must set the configuration much earlier.

The documentation in general is pointing out to change the 'activiti.cfg.xml' but this is for spring and useless for spring-boot. Then the idea is to generate a configuration class as Spring Boot use to do.

@Configuration
public class ProcessEngineConfigDrlEnabled {

@Autowired
private DataSource dataSource;

@Autowired
private PlatformTransactionManager transactionManager;

@Bean
public SpringProcessEngineConfiguration processEngineConfiguration() {
    SpringProcessEngineConfiguration config = new SpringProcessEngineConfiguration();

    try {
        config.setDeploymentResources(getBpmnFiles());
    } catch (IOException e) {
        e.printStackTrace();
    }

    config.setDataSource(dataSource);
    config.setTransactionManager(transactionManager);

    //Here the rulesdeployer is added. 
    config.setCustomPostDeployers(Arrays.asList(new RulesDeployer()));
    return config;
}

/*Read folder with BPMN files and folder with DLR files */
private Resource[] getBpmnFiles() throws IOException {
    ResourcePatternResolver resourcePatternResolver = new PathMatchingResourcePatternResolver();
    Resource[] bpmnResources = resourcePatternResolver.getResources("classpath*:" + BPMN_PATH + "**/*.bpmn20.xml");
    Resource[] drlResources = resourcePatternResolver.getResources("classpath*:" + DRL_PATH + "**/*.drl");
    return (Resource[]) ArrayUtils.addAll(bpmnResources, drlResources);
}

@Bean
public ProcessEngineFactoryBean processEngine() {
    ProcessEngineFactoryBean factoryBean = new ProcessEngineFactoryBean();
    factoryBean.setProcessEngineConfiguration(processEngineConfiguration());
    return factoryBean;
}

...
}

As usual, this class must be in a packet that Spring boot can read (in the packet hierarchy of the main class).

At this example, I have @Autowired the datasource and the transactionManager to use the original one in from the default configuration. If not, you must implement yours and add them to the configuration.

like image 108
King Midas Avatar answered Nov 21 '25 01:11

King Midas



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!