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

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;
    }
}

Thanks for posting the solution.