Wie konfiguriere ich Spring Boot, um einen Lieferanten mit Spring-Cloud-Stream und Rabbit-Binder an eine Rabbitmq-Warteschlange zu binden?

Nov 24 2020

Ich möchte demo-queuemit einer sehr einfachen Spring-Boot-App Nachrichten an eine Rabbitmq-Warteschlange senden :

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();
        };
    }
}

Ich habe derzeit Folgendes application.yml:

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

Wenn ich die Anwendung starte, protokolliert sie, dass sie mit rabbitmq verbunden ist, und druckt Nachrichten in der Konsole aus, die in der sampleProducer. So wird der Lieferant gestartet und nach neuen Nachrichten abgefragt. Ich sehe jedoch keine Warteschlange in rabbitmq, die erstellt und mit den produzierten Nachrichten gefüllt wird.

Das pom.xmlist:

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

Ich habe mich in der Frühjahrsdokumentation und den Beispielen verlaufen, weil ich dort ein Beispiel gefunden habe, das eine von a erstellte Nachricht Supplierin eine Warteschlange stellt.

Was muss ich tun, um die Nachrichten tatsächlich an die Warteschlange zu senden? Ich möchte nur ändern application.ymlund keinen zusätzlichen Code hinzufügen, wenn dies möglich ist.

Antworten

1 GaryRussell Nov 24 2020 at 22:29

RabbitMQ-Produzenten veröffentlichen nicht in Warteschlangen, sondern in Börsen.

Spring Cloud Stream-Produzenten binden standardmäßig keine Warteschlange an den Zielaustausch.

RabbitMQ verwirft standardmäßig nicht routbare Nachrichten.

Du kannst hinzufügen

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

und der Produzent bindet eine Warteschlange an die Zielvermittlung.