代码之家  ›  专栏  ›  技术社区  ›  SpaceTrucker

如何配置spring boot以使用spring cloud stream和rabbit binder将供应商绑定到rabbitmq队列?

  •  0
  • SpaceTrucker  · 技术社区  · 5 年前

    我想向rabbitmq队列发送消息 demo-queue 使用一个非常简单的spring boot应用程序:

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

    我目前有以下几点 application.yml :

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

    当我启动应用程序时,它会记录其已连接到rabbitmq,并在控制台中打印出在 sampleProducer 。因此,将启动供应商并查询新消息。然而,我在rabbitmq中并没有看到创建并填充生成的消息的队列。

    这个 pom.xml 是:

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

    我在spring文档和示例中迷失了方向,因为我还没有找到一个示例,其中包含一条由 Supplier 排队。

    我需要做什么才能真正将消息发送到队列?我只想改变 应用yml 如果可能的话,不要添加额外的代码。

    0 回复  |  直到 5 年前
        1
  •  1
  •   Gary Russell    5 年前

    RabbitMQ生产者不会发布到队列,而是发布到Exchange。

    默认情况下,Spring Cloud Stream生产者不会将队列绑定到目标exchange。

    默认情况下,RabbitMQ丢弃不可终止的消息。

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

    生产者将队列绑定到目的地交换。