# Prototype of reactive components and reactor based streams

## Scope

I recently experimented with reactive streams and a small component framework.
The goal is to have a small API that can encapsulate a protocol and transport. 
The code using a reactive component should not directly depend on the specifics of the transport or protocol.
Another goal is to have reactive features like backpressure. 

Ultimately I am searching for something like Apache Camel Components but with a lot less coupling. 
In camel the big problem is that components depend on camel core which unfortunately is much more than a component API.
So any camel component is coupled quite tightly to all of camel core.

Currently reactive components is built on top of OSGi to leverage configuration mechanisms as well as finding components as OSGi services.
Conceptually this is not limited to OSGi though. With a suitable plugin and config mechanism this could easily be used on spring boot or similar too.
So I am interested in bringing this to other platforms too. 

## Build

```
mvn clean install -DskipTests
```

## Examples

* [Mqtt and Eventadmin](rcomp-examples/rcomp-examples)
* [Alternative Decanter Kafka appender](rcomp-examples/kafka-appender)

## Component API

I was trying to find the simplest API that would allow similar components to camel in one way mode.
This is what I currently use (https://github.com/cschneider/streaming-osgi/blob/master/rcomp-api/src/main/java/component/api/MComponent.java).

```
public interface RComponent {
    <T> Publisher<T> from(String destination, Class<T> type);
    <T> Subscriber<T> to(String destination, Class<T> type);
}
```

A component is a factory for Publishers and Subscribers. From and to have the same meaning as in camel. The component can be given a source / target type to produce / consume. So with the OSGi Converter spec this would allow to have type safe messaging without coding the conversion in every component. Each component is exposed as a service which encapsulates most of the configuration. All endpoint specific configuration can be done using the destination String.

Publisher and Subscriber are interfaces from the reactive streams api (http://www.reactive-streams.org/). So they are well defined and have zero additional dependencies.

One example for such a component is the MqttComponent https://github.com/cschneider/streaming-osgi/blob/master/rcomp-mqtt/src/main/java/component/mqtt/MqttComponent.java.

## Possible use cases

Two big use cases are reactive microservices that need messaging integrations as well as plain camel like integrations.
Another case are the Apache Karaf decanter collectors and appenders. Currently they use a decanter specific API but they could easily be converted into the more general rcomp api.
We could also create a bridge to camel components to leverage the many existing camel components using the rcomp API as well as offering rcomp components to camel.

Components alone are of course not enough. One big strength of Apache Camel is the DSL. In case of rcomp I propose to not create our own DSL and instead use existing DSLs that work well in OSGi. Two examples:

* [Akka and reactive streams](https://de.slideshare.net/ktoso/reactive-integrations-with-akka-streams)
* [Reactor and reactive streams](https://de.slideshare.net/StphaneMaldini/reactor-30-a-reactive-foundation-for-java-8-and-spring)

It is already possible to integrate CXF Rest services with reactive streams using some adapters but we could have native integration.

## Risks and Opportunities

The main risk I see is not gathering a critical mass of components to draw more people. 
Another risk is that the RComponent API or the reactor streams have some unexpected limitations. 
The big opportunity I see is that the rcomp API is very simple so the barrier of entry is low. 
I also hope that this might become a new foundation for a simpler and more modern Apache Camel.

So this all depends on getting some support by you all. 
