Configure isDeployChangedOnly for embedded engine in Spring

I’m using Spring with embedded process engine. I want to configure isDeployChangedOnly for process-archive.

This is usually configured in processes.xml but I understand that I don’t need this file and I think this file is not working with my Spring configuration. Is it correct? How can I configure these attributes about process-archive?

Here is my configuration about Camunda:


<bean id="processEngineConfiguration" class="org.camunda.bpm.engine.spring.SpringProcessEngineConfiguration">
	<property name="processEngineName" value="default" />
	<property name="dataSource" ref="processEngineDS" />
	<property name="transactionManager" ref="blTransactionManager" />
	<property name="history" value="full" />
	<property name="databaseSchemaUpdate" value="noop" />
	<property name="deploymentResources" value="classpath*:process/*.bpmn" />
	<property name="authorizationEnabled" value="true" />
	<property name="jobExecutorActivate" value="true" />
	<property name="jobExecutorDeploymentAware" value="false" />
	<property name="idGenerator">
		<bean class="org.camunda.bpm.engine.impl.persistence.StrongUuidGenerator" />
	</property>
</bean>

<bean id="processEngine" class="org.camunda.bpm.engine.spring.ProcessEngineFactoryBean">
	<property name="processEngineConfiguration" ref="processEngineConfiguration" />
</bean>

<bean id="repositoryService" factory-bean="processEngine" factory-method="getRepositoryService" />
<bean id="runtimeService" factory-bean="processEngine" factory-method="getRuntimeService" />
<bean id="taskService" factory-bean="processEngine" factory-method="getTaskService" />
<bean id="historyService" factory-bean="processEngine" factory-method="getHistoryService" />
<bean id="managementService" factory-bean="processEngine" factory-method="getManagementService" />

I used this processes.xml located at META-INF\processes.xml but this doesn’t work. I think that configuration from this file is not used.

<?xml version="1.0" encoding="UTF-8" ?>

<process-application
    xmlns="http://www.camunda.org/schema/1.0/ProcessApplication"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

	<process-archive name="workflows">
		<process-engine>default</process-engine>
		<properties>
			<property name="isDeleteUponUndeploy">false</property>
			<property name="isScanForProcessDefinitions">true</property>
			<property name="isDeployChangedOnly">true</property>
		</properties>
	</process-archive>

</process-application>

I think you can’t use the configuration property deploymentResources in case you want to modify the deployment. Instead, make a deployment via Java API. RepositoryService#createDeployment is the entry point and you can use its methods to configure the deployment as you like. processes.xml is not needed.

Cheers,
Thorben

1 Like

Thank you thorben, your answer was very helpful.

I extend existing SpringProcessEngineConfiguration to add property deployChangedOnly and override method autoDeployResources.

Here is example of final configuration:

<bean id="processEngineConfiguration" class="com.my.ProcessEngineConfiguration">
	<property name="processEngineName" value="default" />
	<property name="dataSource" ref="processEngineDS" />
	<property name="transactionManager" ref="blTransactionManager" />
	<property name="history" value="full" />
	<property name="databaseSchemaUpdate" value="noop" />
	<property name="deploymentResources" value="classpath*:process/*.bpmn" />
	<property name="deployChangedOnly" value="true" />
	<property name="authorizationEnabled" value="true" />
	<property name="jobExecutorActivate" value="true" />
	<property name="jobExecutorDeploymentAware" value="false" />
	<property name="idGenerator">
		<bean class="org.camunda.bpm.engine.impl.persistence.StrongUuidGenerator" />
	</property>
</bean>

<bean id="processEngine" class="org.camunda.bpm.engine.spring.ProcessEngineFactoryBean">
	<property name="processEngineConfiguration" ref="processEngineConfiguration" />
</bean>

<bean id="repositoryService" factory-bean="processEngine" factory-method="getRepositoryService" />
<bean id="runtimeService" factory-bean="processEngine" factory-method="getRuntimeService" />
<bean id="taskService" factory-bean="processEngine" factory-method="getTaskService" />
<bean id="historyService" factory-bean="processEngine" factory-method="getHistoryService" />
<bean id="managementService" factory-bean="processEngine" factory-method="getManagementService" />

My SpringProcessEngineConfiguration class:

public class ProcessEngineConfiguration extends SpringProcessEngineConfiguration {
    protected boolean deployChangedOnly;
    
    protected void autoDeployResources(ProcessEngine processEngine) {
        if (deploymentResources!=null && deploymentResources.length>0) {
          RepositoryService repositoryService = processEngine.getRepositoryService();

          DeploymentBuilder deploymentBuilder = repositoryService
            .createDeployment()
            .enableDuplicateFiltering(deployChangedOnly)
            .name(deploymentName)
            .tenantId(deploymentTenantId);

...
see method SpringProcessEngineConfiguration.autoDeployResources
...
      }

    public boolean isDeployChangedOnly() {
        return deployChangedOnly;
    }

    public void setDeployChangedOnly(boolean deployChangedOnly) {
        this.deployChangedOnly = deployChangedOnly;
    }
}
3 Likes

Thanks for posting the solution.