/*
* Copyright (c) MuleSoft, Inc. All rights reserved. http://www.mulesoft.com
* The software in this package is published under the terms of the CPAL v1.0
* license, a copy of which has been included with this distribution in the
* LICENSE.txt file.
*/
package org.mule.runtime.core.api.processor.strategy;
import static reactor.core.publisher.Flux.from;
import org.mule.runtime.core.api.Event;
import org.mule.runtime.core.api.construct.FlowConstruct;
import org.mule.runtime.core.api.construct.Pipeline;
import org.mule.runtime.core.api.processor.Processor;
import org.mule.runtime.core.api.processor.ReactiveProcessor;
import org.mule.runtime.core.api.processor.Sink;
/**
* Determines how a list of message processors should processed.
*/
public interface ProcessingStrategy {
/**
* Creates instances of {@link Sink} to be used for emitting {@link Event}'s to be processed. Each {@link Sink} should be used
* independent streams that implement the {@link Pipeline}.
*
* @param flowConstruct pipeline instance.
* @param pipeline function representing the pipeline.
* @return new sink instance
*/
Sink createSink(FlowConstruct flowConstruct, ReactiveProcessor pipeline);
/**
* Enrich {@link Processor} function by adding pre/post operators to implement processing strategy behaviour.
*
* @param pipeline processor representing the the pipeline.
* @return enriched pipeline function/
*/
default ReactiveProcessor onPipeline(ReactiveProcessor pipeline) {
return publisher -> from(publisher).transform(pipeline);
}
/**
* Enrich {@link Processor} function by adding pre/post operators to implement processing strategy behaviour.
*
* @param processor processor instance.
* @return enriched processor function
*/
default ReactiveProcessor onProcessor(ReactiveProcessor processor) {
return publisher -> from(publisher).transform(processor);
}
/**
* Whether the processing that has this instance is synchronous or not
*/
default boolean isSynchronous() {
return false;
}
}