Spring Boot AMQP - создание соединения / объявление очереди при запуске - PullRequest
0 голосов
/ 19 июня 2020

Spring boot 2.3.1 spring-boot-starter-amqp

Если я запускаю приложение Spring Boot как приложение java, запустив основной метод (Intellij - Создайте конфигурацию запуска введите Application и укажите основной класс DemoApplication), соединение RabbitMQ не создается при запуске. Однако, когда я запускаю приложение Spring Boot (Intellij - создайте конфигурацию запуска типа Spring Boot и предоставьте основной класс DemoApplication), соединение RabbitMQ создается во время запуска.

Что такое разница между двумя? Почему RabbitMQ не может создать соединение при запуске, когда основной метод запускается как приложение java? Эта строка не отображается.

INFO 32385 --- [*.*.*.*] o.s.a.r.c.CachingConnectionFactory       : Created new connection: rabbitConnectionFactory.publisher#3f499c2f:0/SimpleConnection@4e5ef6a0 [delegate=amqp://guest@127.0.0.1:5672/, localPort= 62061]

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.1.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>14</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-amqp</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.springframework.amqp</groupId>
            <artifactId>spring-rabbit-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

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

</project>

application.yaml

spring:
  rabbitmq:
    host: ${RABBITMQ_HOST:localhost}
    port: ${RABBITMQ_PORT:5672}
    username: ${RABBITMQ_USERNAME:guest}
    password: ${RABBITMQ_PASSWORD:guest}

Основной класс

package com.example.demo;

import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.DirectExchange;
import org.springframework.amqp.core.Queue;
import org.springframework.beans.factory.annotation.Value;
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
    DirectExchange demoExchange() {
        return new DirectExchange("demo-exchange");
    }

    @Bean
    Queue demoQueue() {
        return new Queue("demo-queue");
    }

    @Bean
    Binding demoBinding() {
        return BindingBuilder.bind(demoQueue()).to(demoExchange()).with("demo-routing");
    }

}

Intellij - Создайте конфигурацию запуска типа Application и укажите основной класс (DemoApplication)

1 Ответ

1 голос
/ 19 июня 2020

В вашем коде нет ничего, что открывало бы соединение (например, @RabbitListener).

Возможно, исполнительный механизм (RabbitHealthIndicator) открывает соединение - не уверен, почему это имеет значение, как вы запускаете это хотя.

Я не вижу, чтобы соединение работало в любом случае (с STS).

Если вы добавите @RabbitListener в свое приложение; в любом случае вы увидите соединение.

...