Cloud Streams (RabbitMQ) ======================== https://github.com/spring-boot-tutorials/cloud-streams-rabbitmq Create Initial Code Base ------------------------ - Go to https://start.spring.io/ - Add the following dependencies: - spring-boot-starter-web - spring-cloud-starter-stream-rabbit - lombok - Click ``Generate`` Dependencies ------------ Dependencies used in ``pom.xml``: .. code-block:: xml org.springframework.boot spring-boot-starter-web org.springframework.cloud spring-cloud-starter-stream-rabbit org.projectlombok lombok true org.springframework.boot spring-boot-starter-test test org.springframework.cloud spring-cloud-stream-test-binder test Install & Run RabbitMQ ---------------------- .. code-block:: sh docker run \ --name some-rabbit \ -e RABBITMQ_DEFAULT_USER=myuser \ -e RABBITMQ_DEFAULT_PASS=mypassword \ -p 5672:5672 \ -p 15672:15672 \ rabbitmq:3-management Properties ---------- Add the following properties into ``src/main/resources/application.yaml``: .. code-block:: yaml spring: cloud: stream: bindings: input: destination: my.input.queue.log.messages binder: local_rabbit output: destination: my.output.queue.log.messages binder: local_rabbit binders: local_rabbit: type: rabbit environment: spring: rabbitmq: host: localhost port: 5672 username: myuser password: mypassword virtual-host: / Configuration ------------- Create new file ``src/main/java/com/example/spring_cloud_streams/DefaultConfiguration.java``: .. code-block:: java @Configuration public class DefaultConfiguration { @Bean Function highlightLogs() { return logMsg -> logMsg.message().toUpperCase(); } } Model ----- Create new file ``src/main/java/com/example/spring_cloud_streams/component/LogMessage.java``: .. code-block:: java public record LogMessage(String message) { } Component --------- Create a new file ``src/main/java/com/example/spring_cloud_streams/component/PlainTextMessageConverter.java``: .. code-block:: java @Component class PlainTextMessageConverter extends AbstractMessageConverter { public PlainTextMessageConverter() { super(new MimeType("text", "plain")); } @Override protected boolean supports(Class clazz) { return (LogMessage.class == clazz); } @Override protected Object convertFromInternal(Message message, Class targetClass, Object conversionHint) { Object payload = message.getPayload(); String text = payload instanceof String ? (String) payload : new String((byte[]) payload); return new LogMessage(text); } } Run Application --------------- .. code-block:: sh mvn spring-boot:run Create Tests ------------ Create a new file ````: .. code-block:: java @EnableTestBinder @SpringBootTest class SpringCloudStreamsApplicationTests { @Autowired private InputDestination input; @Autowired private OutputDestination output; @Test void whenHighlightingLogMessage_thenItsTransformedToUppercase() { Message messageIn = MessageBuilder.withPayload("hello") .setHeader("contentType", "text/plain") .build(); input.send(messageIn, "highlightLogs-in-0"); Message messageOut = output.receive(1000L, "highlightLogs-out-0"); assertThat(messageOut.getPayload()) .asString() .isEqualTo("HELLO"); } } Run Tests --------- .. code-block:: sh mvn clean package