Skip to content

Commit 57fbd33

Browse files
Unlock exclusive jobs when unacquiring all jobs of a worker
1 parent 5c2e37d commit 57fbd33

3 files changed

Lines changed: 119 additions & 0 deletions

File tree

modules/flowable-cmmn-engine/src/test/java/org/flowable/cmmn/test/externalworker/ExternalWorkerServiceTaskTest.java

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1082,6 +1082,62 @@ public void testCaseInstanceIsUnlockedWhenUnacquiringExclusiveJob() {
10821082
assertThat(caseInstance.getLockOwner()).isEqualTo("worker1");
10831083
assertThat(caseInstance.getLockTime()).isNotNull();
10841084
}
1085+
1086+
@Test
1087+
@CmmnDeployment(resources = "org/flowable/cmmn/test/externalworker/ExternalWorkerServiceTaskTest.testSimpleExclusive.cmmn")
1088+
public void testCaseInstanceIsUnlockedWhenUnacquiringAllExclusiveJobs() {
1089+
cmmnRuntimeService.createCaseInstanceBuilder()
1090+
.caseDefinitionKey("simpleExternalWorker")
1091+
.variable("name", "kermit")
1092+
.start();
1093+
1094+
List<AcquiredExternalWorkerJob> acquiredJobs = cmmnManagementService.createExternalWorkerJobAcquireBuilder()
1095+
.topic("simple", Duration.ofHours(1))
1096+
.acquireAndLock(1, "worker1");
1097+
1098+
AcquiredExternalWorkerJob acquiredJob = acquiredJobs.get(0);
1099+
1100+
assertThat(acquiredJob.getLockOwner()).isEqualTo("worker1");
1101+
assertThat(acquiredJob.getLockExpirationTime()).isNotNull();
1102+
1103+
CaseInstanceEntity caseInstance = (CaseInstanceEntity) cmmnRuntimeService.createCaseInstanceQuery()
1104+
.caseInstanceId(acquiredJob.getScopeId())
1105+
.singleResult();
1106+
1107+
assertThat(caseInstance.getLockOwner()).isEqualTo("worker1");
1108+
assertThat(caseInstance.getLockTime()).isNotNull();
1109+
1110+
acquiredJobs = cmmnManagementService.createExternalWorkerJobAcquireBuilder()
1111+
.topic("simple", Duration.ofHours(1))
1112+
.acquireAndLock(1, "worker1");
1113+
1114+
assertThat(acquiredJobs).isEmpty();
1115+
1116+
cmmnManagementService.unacquireAllExternalWorkerJobsForWorker("worker1");
1117+
1118+
caseInstance = (CaseInstanceEntity) cmmnRuntimeService.createCaseInstanceQuery()
1119+
.caseInstanceId(acquiredJob.getScopeId())
1120+
.singleResult();
1121+
1122+
assertThat(caseInstance.getLockOwner()).isNull();
1123+
assertThat(caseInstance.getLockTime()).isNull();
1124+
1125+
acquiredJobs = cmmnManagementService.createExternalWorkerJobAcquireBuilder()
1126+
.topic("simple", Duration.ofHours(1))
1127+
.acquireAndLock(1, "worker1");
1128+
1129+
acquiredJob = acquiredJobs.get(0);
1130+
1131+
assertThat(acquiredJob.getLockOwner()).isEqualTo("worker1");
1132+
assertThat(acquiredJob.getLockExpirationTime()).isNotNull();
1133+
1134+
caseInstance = (CaseInstanceEntity) cmmnRuntimeService.createCaseInstanceQuery()
1135+
.caseInstanceId(acquiredJob.getScopeId())
1136+
.singleResult();
1137+
1138+
assertThat(caseInstance.getLockOwner()).isEqualTo("worker1");
1139+
assertThat(caseInstance.getLockTime()).isNotNull();
1140+
}
10851141

10861142
@Test
10871143
@CmmnDeployment(resources = "org/flowable/cmmn/test/externalworker/ExternalWorkerServiceTaskTest.testSimple.cmmn")

modules/flowable-engine/src/test/java/org/flowable/engine/test/externalworker/ExternalWorkerServiceTaskTest.java

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1099,6 +1099,62 @@ void testProcessInstanceIsUnlockedWhenUnacquiringExclusiveJob() {
10991099
assertThat(processInstance.getLockTime()).isNotNull();
11001100

11011101
}
1102+
1103+
@Test
1104+
@Deployment(resources = "org/flowable/engine/test/externalworker/ExternalWorkerServiceTaskTest.testSimpleExclusive.bpmn20.xml")
1105+
void testProcessInstanceIsUnlockedWhenUnacquiringAllExclusiveJobs() {
1106+
runtimeService.createProcessInstanceBuilder()
1107+
.processDefinitionKey("simpleExternalWorker")
1108+
.variable("name", "kermit")
1109+
.start();
1110+
1111+
List<AcquiredExternalWorkerJob> acquiredJobs = managementService.createExternalWorkerJobAcquireBuilder()
1112+
.topic("simple", Duration.ofHours(1))
1113+
.acquireAndLock(1, "worker1");
1114+
1115+
AcquiredExternalWorkerJob acquiredJob = acquiredJobs.get(0);
1116+
1117+
assertThat(acquiredJob.getLockOwner()).isEqualTo("worker1");
1118+
assertThat(acquiredJob.getLockExpirationTime()).isNotNull();
1119+
1120+
ExecutionEntity processInstance = (ExecutionEntity) runtimeService.createProcessInstanceQuery()
1121+
.processInstanceId(acquiredJob.getProcessInstanceId())
1122+
.singleResult();
1123+
1124+
assertThat(processInstance.getLockOwner()).isEqualTo("worker1");
1125+
assertThat(processInstance.getLockTime()).isNotNull();
1126+
1127+
acquiredJobs = managementService.createExternalWorkerJobAcquireBuilder()
1128+
.topic("simple", Duration.ofHours(1))
1129+
.acquireAndLock(1, "worker1");
1130+
1131+
assertThat(acquiredJobs).isEmpty();
1132+
1133+
managementService.unacquireAllExternalWorkerJobsForWorker("worker1");
1134+
1135+
processInstance = (ExecutionEntity) runtimeService.createProcessInstanceQuery()
1136+
.processInstanceId(acquiredJob.getProcessInstanceId())
1137+
.singleResult();
1138+
1139+
assertThat(processInstance.getLockOwner()).isNull();
1140+
assertThat(processInstance.getLockTime()).isNull();
1141+
1142+
acquiredJobs = managementService.createExternalWorkerJobAcquireBuilder()
1143+
.topic("simple", Duration.ofHours(1))
1144+
.acquireAndLock(1, "worker1");
1145+
1146+
acquiredJob = acquiredJobs.get(0);
1147+
1148+
assertThat(acquiredJob.getLockOwner()).isEqualTo("worker1");
1149+
assertThat(acquiredJob.getLockExpirationTime()).isNotNull();
1150+
1151+
processInstance = (ExecutionEntity) runtimeService.createProcessInstanceQuery()
1152+
.processInstanceId(acquiredJob.getProcessInstanceId())
1153+
.singleResult();
1154+
1155+
assertThat(processInstance.getLockOwner()).isEqualTo("worker1");
1156+
assertThat(processInstance.getLockTime()).isNotNull();
1157+
}
11021158

11031159
@Test
11041160
@Deployment(resources = "org/flowable/engine/test/externalworker/ExternalWorkerServiceTaskTest.testSimple.bpmn20.xml")

modules/flowable-job-service/src/main/java/org/flowable/job/service/impl/cmd/UnacquireAllExternalWorkerJobsForWorkerCmd.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,13 @@ public Void execute(CommandContext commandContext) {
5252
}
5353
}
5454
}
55+
56+
for (ExternalWorkerJobEntity externalWorkerJob : jobEntities) {
57+
if (externalWorkerJob.isExclusive()) {
58+
new UnlockExclusiveJobCmd(externalWorkerJob, jobServiceConfiguration).execute(commandContext);
59+
}
60+
}
61+
5562
externalWorkerJobEntityManager.bulkUpdateJobLockWithoutRevisionCheck(jobEntities, null, null);
5663
}
5764

0 commit comments

Comments
 (0)