https://github.com/daggerok/yet-another-messaging-app
Building reactive pipelines with spring cloud stream
https://github.com/daggerok/yet-another-messaging-app
fabric8-maven-plugin rabbit rabbitmq rabbitmq-management spring-cloud-function spring-cloud-stream spring-cloud-stream-binder-rabbit spring-cloud-stream-rabbitmq spring-cloud-stream-reactive
Last synced: about 1 year ago
JSON representation
Building reactive pipelines with spring cloud stream
- Host: GitHub
- URL: https://github.com/daggerok/yet-another-messaging-app
- Owner: daggerok
- Created: 2020-02-02T01:29:48.000Z (about 6 years ago)
- Default Branch: master
- Last Pushed: 2020-02-02T05:34:04.000Z (about 6 years ago)
- Last Synced: 2025-01-10T00:37:28.511Z (about 1 year ago)
- Topics: fabric8-maven-plugin, rabbit, rabbitmq, rabbitmq-management, spring-cloud-function, spring-cloud-stream, spring-cloud-stream-binder-rabbit, spring-cloud-stream-rabbitmq, spring-cloud-stream-reactive
- Language: Java
- Size: 66.4 KB
- Stars: 0
- Watchers: 3
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
# yet-another-messaging-app [](https://travis-ci.org/daggerok/yet-another-messaging-app)
Build reactive pipelines with spring cloud stream
## how too
### source
#### create java bean
```java
@Log4j2
@Configuration
class DeskAgent {
@Bean
Supplier> checkIn() {
Supplier randomPassenger = randomPassenger(names());
return () -> Flux.interval(Duration.ofMillis(345))
.onBackpressureDrop()
.map(aLong -> randomPassenger.get())
.doOnNext(passenger -> log.info("generated: {}", passenger));
}
}
```
### configure bindings
```properties
spring.cloud.stream.bindings.checkIn-out-0.destination=processorTransformingApp
#spring.cloud.function.definition=checkIn
```
### processor
#### create java bean
```java
@Log4j2
@Configuration
class GateAgent {
@Bean
Function, Flux> transfer() {
ThreadLocalRandom random = ThreadLocalRandom.current();
Supplier randomStatus = () -> random.nextInt(5) == 0 ? Status.PREMIUM : Status.VALUED;
return flux -> flux.map(passenger -> new FlyingPassenger(passenger.getId(),
passenger.getName(),
randomStatus.get()))
.doOnNext(passenger -> log.info("transformed: {}", passenger));
}
}
```
### configure bindings
```properties
spring.cloud.stream.bindings.transfer-in-0.destination=processorTransformingApp
spring.cloud.stream.bindings.transfer-in-0.group=processorTransformingApp
spring.cloud.stream.bindings.transfer-out-0.destination=sinkInputApp
#spring.cloud.function.definition=transfer
```
### sink
#### create java bean
```java
@Log4j2
@Configuration
class FlyAttendant {
@Bean
Consumer> attendee() {
return flux -> flux.subscribe(passenger -> log.info("received: {}", passenger));
}
}
```
### configure bindings
```properties
spring.cloud.stream.bindings.attendee-in-0.destination=sinkInputApp
spring.cloud.stream.bindings.attendee-in-0.group=sinkInputApp
#spring.cloud.function.definition=attendee
```
## build, run and test
```bash
./mvnw -f rabbitmq docker:build docker:start
./mvnw
java -jar ./source-output-app/target/*.jar &
java -jar ./processor-transforming-app/target/*.jar &
java -jar ./sink-input-app/target/*.jar &
sleep 15s
killall -9 java
./mvnw -f rabbitmq docker:stop docker:remove
```
## resources
* [spring-cloud-stream functional binding](https://cloud.spring.io/spring-cloud-static/spring-cloud-stream/current/reference/html/spring-cloud-stream.html#_functional_binding_names)
* [spring-cloud-stream reactive functions support](https://github.com/spring-cloud/spring-cloud-stream/blob/master/docs/src/main/asciidoc/spring-cloud-stream.adoc#reactive-functions-support)
* [Old example daggerok/spring-cloud-function-stream-integration](https://github.com/daggerok/spring-cloud-function-stream-integration)