feat: add ACTION steps that run after the approval transaction commits

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
0264408
2026-09-11 17:26:02 +08:00
co-authored by Cursor
parent 87b449e45c
commit bdc4dd4473
19 changed files with 341 additions and 49 deletions
@@ -1,5 +1,6 @@
package com.jetlumen.ordo.spring;
import com.jetlumen.ordo.api.ActionHandler;
import com.jetlumen.ordo.api.AssigneeResolver;
import com.jetlumen.ordo.api.OrdoEngine;
import com.jetlumen.ordo.api.RoutingCondition;
@@ -65,6 +66,12 @@ public class OrdoJdbcAutoConfiguration {
return RoutingCondition.always();
}
@Bean
@ConditionalOnMissingBean
public ActionHandler ordoActionHandler() {
return ActionHandler.noop();
}
@Bean
@ConditionalOnMissingBean
@DependsOnDatabaseInitialization
@@ -101,12 +108,14 @@ public class OrdoJdbcAutoConfiguration {
public OrdoEngine ordoEngine(Clock ordoClock,
AssigneeResolver ordoAssigneeResolver,
RoutingCondition ordoRoutingCondition,
ActionHandler actionHandler,
TransactionExecutor ordoTransactionExecutor,
ProcessDefinitionRepository ordoProcessDefinitionRepository,
ProcessInstanceRepository ordoProcessInstanceRepository,
ApprovalTaskRepository ordoApprovalTaskRepository) {
return new DefaultOrdoEngine(ordoClock, ordoAssigneeResolver, ordoRoutingCondition, ordoTransactionExecutor,
ordoProcessDefinitionRepository, ordoProcessInstanceRepository, ordoApprovalTaskRepository);
return new DefaultOrdoEngine(ordoClock, ordoAssigneeResolver, ordoRoutingCondition, actionHandler,
ordoTransactionExecutor, ordoProcessDefinitionRepository, ordoProcessInstanceRepository,
ordoApprovalTaskRepository);
}
@Bean
@@ -1,5 +1,6 @@
package com.jetlumen.ordo.spring;
import com.jetlumen.ordo.api.ActionHandler;
import com.jetlumen.ordo.api.ApprovalStep;
import com.jetlumen.ordo.api.ApprovalTask;
import com.jetlumen.ordo.api.AssigneeResolver;
@@ -20,6 +21,7 @@ import java.util.List;
import java.util.UUID;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatThrownBy;
class OrdoJdbcAutoConfigurationTest {
@@ -138,6 +140,17 @@ class OrdoJdbcAutoConfigurationTest {
});
}
@Test
void honoursUserDefinedActionHandler() {
withDataSourceRunner.withUserConfiguration(CustomActionHandlerConfig.class)
.run(context -> {
assertThat(context).hasSingleBean(OrdoEngine.class);
assertThatThrownBy(() -> context.getBean(ActionHandler.class).execute("any", null))
.isInstanceOf(IllegalStateException.class)
.hasMessage("custom-action");
});
}
@Configuration
static class CustomAssigneeResolverConfig {
@Bean
@@ -153,4 +166,14 @@ class OrdoJdbcAutoConfigurationTest {
return (key, context) -> true;
}
}
@Configuration
static class CustomActionHandlerConfig {
@Bean
ActionHandler ordoActionHandler() {
return (key, context) -> {
throw new IllegalStateException("custom-action");
};
}
}
}