Environment (Required on creation):
- Spring Boot 2.6.4
- Java 17
- Camunda DB - MySQL
dependencies
- "org.camunda.bpm.springboot:camunda-bpm-spring-boot-starter:7.16.0"
- "org.camunda.bpm.springboot:camunda-bpm-spring-boot-starter-webapp:7.16.0"
- "org.camunda.bpm.springboot:camunda-bpm-spring-boot-starter-rest:7.16.0"
- "com.sun.xml.bind:jaxb-impl:3.0.2"
- "org.graalvm.js:js:22.0.0.2"
- "org.graalvm.js:js-scriptengine:22.0.0.2"
- "org.camunda.bpm.assert:camunda-bpm-assert:14.0.0"
Description (Required on creation; please attach any relevant screenshots, stacktraces, log files, etc. to the ticket):
Our team tried to upgrade from camunda 7.14.0 to 7.16.0 (sql patches also applied). After that our `tests` (unit and integration) `started to fail`, but when manually checking camunda behavior - it is ok. First version after 7.14.0 where tests started to fail is 7.15-alpha2. Tests are passing without problems in the same environment with camunda 7.14.0.
Steps to reproduce (Required on creation):
## Unit Test
### Configuration
```java
package camunda.shared.configuration;import java.io.IOException;
import java.util.List;
import javax.sql.DataSource;
import org.camunda.bpm.engine.ProcessEngineConfiguration;
import org.camunda.bpm.engine.impl.cfg.CompositeProcessEnginePlugin;
import org.camunda.bpm.engine.impl.cfg.ProcessEngineConfigurationImpl;
import org.camunda.bpm.engine.impl.cfg.ProcessEnginePlugin;
import org.camunda.bpm.engine.impl.cfg.SpringBeanFactoryProxyMap;
import org.camunda.bpm.engine.impl.el.ExpressionManager;
import org.camunda.bpm.engine.spring.SpringProcessEngineConfiguration;
import org.camunda.bpm.extension.process_test_coverage.spring.SpringProcessWithCoverageEngineConfiguration;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.transaction.PlatformTransactionManager;@Configuration
public class UnitTestsProcessEngineConfiguration {
@Bean
public ProcessEngineConfigurationImpl processEngineConfiguration(
final List<ProcessEnginePlugin> processEnginePlugins,
final ExpressionManager expressionManager,
final PlatformTransactionManager transactionManager,
final DataSource dataSource,
final ApplicationContext applicationContext
) throws IOException {
SpringProcessEngineConfiguration config =
new SpringProcessWithCoverageEngineConfiguration();
config.setExpressionManager(expressionManager);
config.setTransactionManager(transactionManager);
config.setDataSource(dataSource);
config.setDatabaseSchemaUpdate("true");
config.setHistory(ProcessEngineConfiguration.HISTORY_FULL);
config.setJobExecutorActivate(false); // <---
config.setProcessEnginePlugins(
processEnginePlugins
); config.getProcessEnginePlugins().add(
new CompositeProcessEnginePlugin(processEnginePlugins)
);
config.setBeans(new SpringBeanFactoryProxyMap(applicationContext));
return config; }
}```
Here is sample process and test for it:
![[DAV-2_POC_1.bpmn]]
```kotlin
@Test
@DeployProcess(["DAV-2_POC_1.bpmn"])
fun `POC 1 - variables are deleted`() {
val builder: ProcessInstantiationBuilder = this.processEngine.runtimeService
.createProcessInstanceByKey("DAV-2_POC_1")
builder.setVariable("featureIssueId", 178825)
builder.setVariable("implementationCategory", "category-value")
builder.startBeforeActivity("Implement_feature")
val processInstance: ProcessInstance = builder.execute();
// waiting for task to be resolved
BpmnAwareTests.assertThat(processInstance).isWaitingAt("Implement_feature")
val processExecution: Execution = this.processEngine.runtimeService
.createExecutionQuery()
.processInstanceId(processInstance.id)
.active()
.list()
.firstOrNull()!!
// process variables are there
assertEquals(178825, getVariable(processExecution.id, "featureIssueId"))
assertEquals("category-value", getVariable(processExecution.id, "implementationCategory"))
assertNull(getVariable(processExecution.id, "implementationIssue"))
// triggering script task that will set `issueId`
this.processEngine
.runtimeService.createProcessInstanceModification(processInstance.id)
.startBeforeActivity("Set_issue_id")
.execute()
// `implementationIssue` is set by event `Implement_feature_issue_id_set` after `issueId` was set
assertEquals(777, getVariable(processExecution.id, "implementationIssue"))
// !!! process variables are not there after event is executed !!!
assertEquals(178825, getVariable(processExecution.id, "featureIssueId")) // assert fails
assertEquals("category-value", getVariable(processExecution.id, "implementationCategory")) // assert fails
} fun getVariable(executionId: String, variableName: String): Any? {
return this.processEngine.runtimeService.getVariable(executionId, variableName)
}
```
Output (last asserts):
```
Expected :178825
Actual :null
```
## Integration Test
### Configuration
```java
package camunda.shared.configuration;import java.io.IOException;
import java.util.List;
import javax.sql.DataSource;
import org.camunda.bpm.engine.ProcessEngineConfiguration;
import org.camunda.bpm.engine.impl.cfg.CompositeProcessEnginePlugin;
import org.camunda.bpm.engine.impl.cfg.ProcessEngineConfigurationImpl;
import org.camunda.bpm.engine.impl.cfg.ProcessEnginePlugin;
import org.camunda.bpm.engine.impl.cfg.SpringBeanFactoryProxyMap;
import org.camunda.bpm.engine.impl.el.ExpressionManager;
import org.camunda.bpm.engine.spring.SpringProcessEngineConfiguration;
import org.camunda.bpm.extension.process_test_coverage.spring.SpringProcessWithCoverageEngineConfiguration;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.transaction.PlatformTransactionManager;@Configuration
public class IntegrationTestsProcessEngineConfiguration {
@Bean
public ProcessEngineConfigurationImpl processEngineConfiguration(
final List<ProcessEnginePlugin> processEnginePlugins,
final ExpressionManager expressionManager,
final PlatformTransactionManager transactionManager,
final DataSource dataSource,
final ApplicationContext applicationContext
) throws IOException {
SpringProcessEngineConfiguration config =
new SpringProcessWithCoverageEngineConfiguration();
config.setExpressionManager(expressionManager);
config.setTransactionManager(transactionManager);
config.setDataSource(dataSource);
config.setDatabaseSchemaUpdate("true");
config.setHistory(ProcessEngineConfiguration.HISTORY_FULL);
config.setJobExecutorActivate(true); // <---
config.getProcessEnginePlugins().add(
new CompositeProcessEnginePlugin(processEnginePlugins)
);
config.setBeans(new SpringBeanFactoryProxyMap(applicationContext));
return config; }
}```Test is the same as above.
Output is the same, variables are removed.
Observed Behavior (Required on creation):
Output (last asserts):
```
Expected :178825
Actual :null
```
Process variables are erased.
Expected behavior (Required on creation):
Process variables must not be erased.
Root Cause (Required on prioritization):
camunda-bpm engine
Solution Ideas (Optional):
Hints (optional):
### The place variables are removed
ExecutionEntity.java
```java
...
protected void moveVariableTo(VariableInstanceEntity variable, ExecutionEntity other) {
if (other.variableStore.containsKey(variable.getName())) {
// this is executed when ExecutionEntity.replace(PvmExecutionImpl execution) where commant says: // on compaction, move all variables
CoreVariableInstance existingInstance = other.variableStore.getVariable(variable.getName());
existingInstance.setValue(variable.getTypedValue(false));
invokeVariableLifecycleListenersUpdate(existingInstance, this);
invokeVariableLifecycleListenersDelete( // <-- here VariableInstanceEntityPersistenceListener.delete()
variable,
this,
Collections.singletonList(getVariablePersistenceListener()));
}
else {
// this is executed when new concurrent execution is created
// scenario 2 in PvmExecutionImpl.createConcurrentExecution()
other.variableStore.addVariable(variable);
}
}
...
```
It seems like it is happening when there are `concurrent execution` takes place.
-
-
- Manual check:
Started process via Cockpit:
- Manual check:
-

After 10 seconds - expected results (how it should be in tests)

-
-
- Modified verison of process with same (failing in tests) result
-

It is happening when concurrent executions come into play, like message events, timers, boundary events etc...
This is the controller panel for Smart Panels app
- duplicates
-
CAM-14506 Variable gets concurrent local when starting process from activity with input/output parameters
-
- Closed
-