¿Cómo configurar Spring Boot para vincular un proveedor a una cola rabbitmq con Spring-Cloud-Stream y Rabbit-Binder?

Nov 24 2020

Quiero enviar mensajes a una cola de rabbitmq demo-queueusando una aplicación de arranque de primavera muy simple:

package com.example.demo;

import java.time.LocalDateTime;
import java.util.function.Supplier;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;

@SpringBootApplication
public class DemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }
    
    @Bean
    public Supplier<String> sampleProducer() {
        return () -> {
            System.out.println("producing message");
            return LocalDateTime.now().toString();
        };
    }
}

Actualmente tengo lo siguiente application.yml:

---
spring:
  rabbitmq:
    addresses: amqp://guest:guest@localhost:5672

Cuando inicio la aplicación, registra que está conectado a rabbitmq e imprime mensajes en la consola escritos en sampleProducer. Por lo tanto, se inicia el proveedor y se le solicita nuevos mensajes. Sin embargo, no veo que se cree una cola en rabbitmq y se llene con los mensajes producidos.

El pom.xmles:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.6.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.example</groupId>
    <artifactId>demo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>demo</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
        <spring-cloud.version>Hoxton.SR9</spring-cloud.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-amqp</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-stream</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-stream-binder-rabbit</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-stream-rabbit</artifactId>
        </dependency>
    </dependencies>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

Estoy perdido en la documentación y los ejemplos de primavera porque no encontré un ejemplo allí que ponga un mensaje creado por a Supplieren una cola.

¿Qué debo hacer para enviar los mensajes a la cola? Solo me gustaría cambiar application.ymly no agregar código adicional si eso es posible.

Respuestas

1 GaryRussell Nov 24 2020 at 22:29

Los productores de RabbitMQ no publican en colas, publican en intercambios.

Los productores de Spring Cloud Stream no vinculan una cola al intercambio de destino de forma predeterminada.

RabbitMQ descarta los mensajes que no se pueden enrutar de forma predeterminada.

Puedes añadir

spring.cloud.stream.bindings.sampleProducer-out-0.producer.required-groups=foo

y el productor vinculará una cola al intercambio de destino.