folio-flow-engine
- 1 Overview
- 2 Key Functionality
- 3 Interfaces and models
- 3.1 Flow / Flow Builder
- 3.2 Flow Engine
- 3.2.1 Builder
- 3.2.2 Stage Report Provider
- 3.3 Stage
- 3.3.1 Flow Methods
- 3.3.2 Listenable Methods
- 3.4 Parallel Stage
- 3.4.1 Parallel Stage Builder
- 3.5 Dynamic Stage
- 3.6 Stage Context
- 3.7 Stage executor
- 4 Logging
Overview
folio-flow-engine
is a Java library, that utilizes native classes for Asynchronous execution like CompletableFuture
, ExecutorService
etc. to provide a friendly interface for composing tasks to be executed with different rules.
GitHub repository: https://github.com/folio-org/folio-flow-engine
Key Functionality
Flow engine provides the following functionality:
Asynchronous execution
Stage execution in sequence
Stage execution in parallel
Complex flow execution, including execution of nested flows in parallel
Dynamic stage generation based on context data
Stage cancellation of one of the upstream stages failed
Stage execution observability
methods to observe critical moments of stage execution
explicit logging, including flow engine reports in logs
Java-friendly context management using the Decorator pattern
Sequence Task Execution
Description
The Flow Engine allows tasks to be executed in a specific order, ensuring each task is completed before the next one begins.
Usage
Define a sequence of tasks in the desired order.
The Flow Engine will execute each task one after the other.
If a task fails, subsequent tasks in the sequence will not be executed.
Flow engine follows the following scenarios:
Simple flow execution
A flow engine can execute stages in sequence, waiting for the previous stage to be finished before executing the next one.
Data can be transferred between stages using StageContext model.
Stage context store data with key as String
and value as Object
. There is a way to make context more Java-friendly using AbstractStageContextWrapper
Flow.builder()
.id("Simple Flow")
.stage(task1)
.stage(task2)
.stage(task3)
.build();
Simple flow execution (failed stage)
When one of the stages in flow fails - the flow manager stops the execution and calls onFlowErrorStage
(if defined)
Flow.builder()
.id("Simple Flow")
.stage(task1)
.stage(task2)
.stage(task3)
.stage(task4)
.onFlowError(onFlowErrorStage)
.build();
This behavior is default, and it can be re-configured:
Simple flow execution (failed stage with cancellation)
Parallel Task Execution
Description
The Flow Engine supports the execution of multiple tasks simultaneously, leveraging concurrency to improve efficiency and reduce total execution time.
Usage
Define tasks that can be executed in parallel.
The Flow Engine will manage the concurrent execution of these tasks.
parallelism is configured in the
FlowEngine
component
If one task fails, all parallel tasks will be canceled except failed ones (if the strategy is
CANCEL_ON_ERROR
).
Parallel Stage execution
Note that parallelism is customizable by defining an executor when building FlowEngine
component
Parallel Stage execution(stage failed)
Parallel Stage execution (stage failed with cancellation)
Nested flow execution
Interfaces and models
Flow / Flow Builder
Provides a Flow
object, containing a sequence of stages and flows to be executed
Method | Description |
---|---|
| Used to define flow identifier that will be used for report and in the trace logs |
| Allows to define a |
| Allows to define a general flow parameter that will be available for all stages in the flow |
| Allow to define a map with flow parameters that will be available for all stages in the flow |
| Allows to define flow execution strategy:
|
| Allows to define a |
| Allows to define a |
| Allows to define a |
| Allows to define a |
Flow Engine
A flow engine is an object that is used to execute a flow defined by a developer
Method | Description |
---|---|
| Executes flow using executor and timeout from |
| Executes flow using executor and timeout from |
| Allows to get flow status from Posible flow statuses:
|
| Provides a |
Builder
Flow engine builder allows to customize a FlowEngine
object
Method | Description |
---|---|
| Allows to define flow engine name |
| Allows to define how much history preserve in memory for latest flow executions |
| Allows to define custom executor for the |
| Defines if flow result must be printed in logs |
| Allows to define custom stage report provider instead of custom one |
Stage Report Provider
Stage report is a useful way to customize intends and stage execution messages
Default stage report example:
Custom stage report example:
Stage
This interface is functional, which means that it can be used as lambda for stage definition
Flow Methods
The flow engine uses flow methods to determine, what capabilities the stage provides:
Stage cancellation
Stage recovery
Method | Description |
---|---|
| Main method, which is must be defined for stage with business logic |
| Returns stage identifier, which will be printed in the final report or in listenable methods |
| Provides the ability to recover a stage after fail in |
| Provides an ability to revert changed, done in |
| Defines execution of |
Listenable Methods
Listenable methods provided at crucial points of stage execution to provide better observability for the stage execution status
Method | Description |
---|---|
| This method is called before stage execution |
| This method is called after successful stage execution including successful execution of |
| This method is called after unsuccessful stage execution ( |
| This method is called after successful execution of |
| This method is called after unsuccessful execution of |
Parallel Stage
A parallel stage is used to specify a group of stages that need to be executed simultaneously.
Parallel Stage Builder
| Used to define flow identifier that will be used for report and in the trace logs |
| Allows to define a |
| Allows to define a list of |
| Defines if parallel stage must call |
Dynamic Stage
A dynamic stage generates a stage, flow, or parallel stage based on the data within StageContext.
Stage Context
Stage context is generated before execution of the stage and it will contain the following data
Current flow identifier
Previous stage context data
Flow parameters (nested flow parameters will always override main flow parameters until exiting the nested flow)
Stage executor
A StageExecutor is an interface that allows developers to implement a custom stage execution method. It has already been implemented as follows:
DefaultStageExecutor
- used to execute all stages implementingStage
interfaceFlowExecutor
- used to execute allFlow
objectsParallelStageExecutor
- used to execute stages in parallelDynamicStageExecutor
- used to executeDynamicStage
objects
| Used to define flow identifier that will be used for report and in the trace logs |
| Allows to define a |
| Allows to define a list of |
| Defines if parallel stage must call |
Logging
flow engine provides a general logger with the name folio-flow-engine
, and the log level can be customized
By default - all execution logs appear at the DEBUF
level, and flow engine reports at the INFO
level