Simplify and speed up the development of message-driven,
asynchronous Java applications using Enterprise Integration Patterns.
FlowDefinition flow = Pipelite.defineFlow("order-router")
.fromSource("http://orders/inbound")
.wireTap("audit-log", "slf4j://audit?level=INFO")
.filter("only-valid", "payload.status == 'CONFIRMED'")
.transformPayload("to-invoice", OrderMapper::toInvoice)
.toRoute(route -> route
.when("payload.type == 'STANDARD'", "kafka://billing.standard")
.when("payload.type == 'EXPRESS'", "kafka://billing.express"))
.withRetryChannel()
.build();Features
Pipelite brings Enterprise Integration Patterns to Java without the complexity of heavyweight ESB frameworks.
Define integration flows with a fluent Java builder — defineFlow(), fromSource(), toSink(). No XML, no annotations on domain objects.
Route messages to different endpoints based on payload expressions with toRoute(). Fan out to multiple recipients with toRecipientList().
Apply payload transformations with transformPayload() and drop unwanted messages with expression-based filter() steps.
Inspect messages in transit without interrupting the main flow. Use wireTap() to forward a copy to a logging or monitoring endpoint.
Attach withRetryChannel() for automatic message re-delivery on failure, or define a custom withErrorChannel() handler per flow.
Add @EnablePipelite to any @Configuration class and expose FlowDefinition beans. Autoconfiguration handles the rest.
How it works
Each FlowDefinition connects a source endpoint to a sink through composable processing steps. The framework handles threading and lifecycle.
fromSource()
http://orders
wireTap()
slf4j://audit
filter()
expression
transformPayload()
mapper::map
toSink()
kafka://billing
Standalone
public class TimeLoggerFlow {
public static void main(String[] args) {
PipeliteContext ctx = Pipelite.createContext();
FlowDefinition flow = Pipelite
.defineFlow("time-logger")
.fromSource(
"time://poll?period=1&timeUnit=SECONDS")
.process("handler", msg -> {
// process the message
})
.toSink("slf4j://logger?level=INFO")
.build();
ctx.registerFlowDefinition(flow);
ctx.start();
}
}Spring Boot
@SpringBootApplication
public class TimeLoggerFlow {
@Configuration
@EnablePipelite
public static class Config {
@Bean
public FlowDefinition timeLoggerFlow() {
return Pipelite
.defineFlow("time-logger")
.fromSource(
"time://poll?period=1&timeUnit=SECONDS")
.process("handler", msg -> {
// process the message
})
.toSink("slf4j://logger?level=INFO")
.build();
}}
}Channel Adapters
Endpoints are identified by URL scheme. Swap source or sink without changing your flow logic.
http://
HTTP
Embedded Undertow server. Expose or consume HTTP endpoints for ingress and egress.
kafka://
Kafka
Apache Kafka consumer and producer with JSON serialization built-in.
time://
Timer
Polling source that fires at a configurable period: time://poll?period=1&timeUnit=SECONDS.
link://
Internal
Connect flows together in-process. Chain output of one flow as input to another.
slf4j://
Logging
Sink messages directly to SLF4J loggers. Configurable level: ?level=INFO.
custom://
SPI
Implement ChannelAdapter via the SPI to register your own URL scheme and endpoints.
Get started
Choose pipelite-core for standalone use,
or pipelite-spring-starter for Spring Boot autoconfiguration.
<dependency>
<groupId>io.pipelite</groupId>
<artifactId>pipelite-core</artifactId>
<version>0.1.0</version>
</dependency><dependency>
<groupId>io.pipelite</groupId>
<artifactId>pipelite-spring-starter</artifactId>
<version>0.1.0</version>
</dependency>implementation 'io.pipelite:pipelite-core:0.1.0'implementation 'io.pipelite:pipelite-spring-starter:0.1.0'