Annotations
The Pipeline Framework uses annotations to simplify configuration and automatic generation of pipeline components.
@PipelineStep
The @PipelineStep annotation marks a class as a pipeline step and enables automatic generation of adapters for the configured transport (gRPC or REST). The framework encourages append-only persistence via plugins, but step implementations can perform any storage behavior required by your application.
Parameters
inputType: The input type for this step (domain type)outputType: The output type for this step (domain type)stepType: The step type (StepOneToOne, StepOneToMany, StepManyToOne, StepManyToMany, StepSideEffect, or blocking variants)inboundMapper: The inbound mapper class for this pipeline service/step - handles conversion from gRPC to domain types (using MapStruct-based unified Mapper interface)outboundMapper: The outbound mapper class for this pipeline service/step - handles conversion from domain to gRPC types (using MapStruct-based unified Mapper interface)runOnVirtualThreads: Whether to offload server processing to virtual threads, i.e. for I/O-bound operations (defaults tofalse)sideEffect: Optional plugin service type used to generate side-effect client/server adaptersordering: Ordering requirement for the generated client stepthreadSafety: Thread safety declaration for the generated client step
backendType is a legacy annotation field and is ignored by the current processor.
Example
@PipelineStep(
inputType = PaymentRecord.class,
outputType = PaymentStatus.class,
stepType = StepOneToOne.class,
inboundMapper = PaymentRecordMapper.class,
outboundMapper = PaymentStatusMapper.class,
ordering = OrderingRequirement.RELAXED,
threadSafety = ThreadSafety.SAFE
)
@ApplicationScoped
public class ProcessPaymentService implements ReactiveService<PaymentRecord, PaymentStatus> {
@Override
public Uni<PaymentStatus> process(PaymentRecord input) {
// Implementation
}
}Usage
Developers only need to:
- Annotate their service class with
@PipelineStep - Create MapStruct-based mapper interfaces that extend the
Mapper<Grpc, Dto, Domain>interface - Implement the service interface (
ReactiveService,ReactiveStreamingService,ReactiveStreamingClientService, orReactiveBidirectionalStreamingService)
Parallelism is configured at the pipeline level (pipeline.parallelism and pipeline.max-concurrency). The ordering and threadSafety values on @PipelineStep are propagated to the generated client step, which the runtime uses to decide parallelism under AUTO.
Transport selection (gRPC vs REST) is configured globally in pipeline.yaml, not on the annotation.
The framework automatically generates and registers the adapter beans at build time.