Comment configurer Spring Boot pour lier un fournisseur à une file d'attente rabbitmq avec spring-cloud-stream et rabbit-binder?

Nov 24 2020

Je souhaite envoyer des messages à une file d'attente rabbitmq à l' demo-queueaide d'une application Spring Boot très 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();
        };
    }
}

J'ai actuellement les éléments suivants application.yml:

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

Lorsque je lance l'application, elle enregistre qu'elle est connectée à rabbitmq et imprime les messages dans la console écrits dans le sampleProducer. Ainsi, le fournisseur est démarré et interrogé pour de nouveaux messages. Cependant, je ne vois pas de file d'attente dans rabbitmq créée et remplie avec les messages produits.

Le pom.xmlest:

<?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>

Je suis perdu dans la documentation et les exemples du printemps parce que j'ai trouvé un exemple qui place un message créé par a Supplierdans une file d'attente.

Que dois-je faire pour envoyer réellement les messages à la file d'attente? Je voudrais seulement changer application.ymlet ne pas ajouter de code supplémentaire si cela est possible.

Réponses

1 GaryRussell Nov 24 2020 at 22:29

Les producteurs de RabbitMQ ne publient pas dans les files d'attente, ils publient sur les bourses.

Les producteurs Spring Cloud Stream ne lient pas une file d'attente à l'échange de destination par défaut.

RabbitMQ rejette les messages non routables par défaut.

Vous pouvez ajouter

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

et le producteur liera une file d'attente à l'échange de destination.