使用RabbitMQ tut1教程时无法让rabbitmq发送者打印消息

问题描述 投票:0回答:1

我在这里有这个项目的 github 存储库的链接:https://github.com/luiz-miotto/rabbitmqTut1v4

我一直在尝试使用 RabbitMQ 提供的教程来学习如何将 RabbitMQ 与 Spring AMQP 结合使用:https://www.rabbitmq.com/tutorials/tutorial-one-spring-amqp.html

我遇到的问题是,运行项目时,我没有打印输出,也没有从发送者到接收者类的通信。

要运行它,我在终端中运行两个 jar 命令:

java -Dserver.port=8889  -jar target/rabbitmq4-0.0.1-SNAPSHOT.jar --spring.profiles.active=hello-world,sender

java -Dserver.port=8888 -jar target/rabbitmq4-0.0.1-SNAPSHOT.jar --spring.profiles.active=hello-world,receiver

运行罐子告诉我它们已准备就绪并正在运行,并且

The following 2 profiles are active: "hello-world", "receiver"

但是,我在终端上打印出来,也没有在 RabbitMQ UI 中看到任何内容(我正在运行 RabbitMQ,以防有人问起)

我怀疑这个问题在某种程度上与@Profile有关,因为我无法打印出接收者或发送者类的信息,但我不确定。

我尝试在 Tut1Config 类中的 sender 方法中添加日志记录,以查看该方法是否被调用,但我还没有看到其中任何一个被注销。

包 com.example.rabbitmq4.tut1;

import org.springframework.amqp.core.Queue;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Profile;
import org.springframework.scheduling.annotation.EnableScheduling;


@Profile({"tut1","hello-world"})
@Configuration
public class Tut1Config {

    @Bean
    public Queue hello(){
        return new Queue("hello");
    }

    @Profile("receiver")
    @Bean
    public Tut1Receiver receiver(){
        return new Tut1Receiver();
    }

    @Profile("sender")
    @Bean
    public Tut1Sender sender(){
        System.out.println("this shit working for sender?");
        return new Tut1Sender();
    }
}
package com.example.rabbitmq4;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.CommandLineRunner;
import org.springframework.context.ConfigurableApplicationContext;

public class RabbitAmqpTutorialsRunner implements CommandLineRunner {

    @Value("${tutorial.client.duration:0}")
    private int duration;

    @Autowired
    private ConfigurableApplicationContext ctx;

    @Override
    public void run(String... arg0) throws Exception {
        System.out.println("Ready ... running for " + duration + "ms");
        Thread.sleep(duration);
        ctx.close();
    }
}

import org.springframework.amqp.core.Queue;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;



public class Tut1Sender {
    @Autowired
    private RabbitTemplate template;

    @Autowired
    private Queue queue;


    @Scheduled(fixedDelay = 1000, initialDelay = 500)
    public void send() {
        String message = "Hello World!";
        this.template.convertAndSend(queue.getName(), message);
        System.out.println(" [x] Sent '" + message + "'");
    }
}
java spring rabbitmq spring-rabbit
1个回答
0
投票

我已经运行了你的代码,正如 Reveson 所说,你错过了

application.yml
中的一些配置。像那个教程一样做:

spring:
  profiles:
    active: usage_message

logging:
  level:
    org: ERROR

tutorial:
  client:
    duration: 10000

并且您的

Rabbitmq4Application.java
类中的包名称错误,请更改此:

package com.example.rabbitmq4.tut1;

对此:

package com.example.rabbitmq4;

我已经使用 docker-compose 文件运行 Rabbitmq,如下所示:

version: "3.2"
services:
rabbitmq:
  image: rabbitmq:3-management-alpine
  container_name: "rabbitmq"
  ports:
    - 5672:5672
    - 15672:15672
  volumes:
    - ~/.docker-conf/rabbitmq/data/:/var/lib/rabbitmq/
    - ~/.docker-conf/rabbitmq/log/:/var/log/rabbitmq
  networks:
    - rabbitmq
  restart: unless-stopped

networks:
  rabbitmq:
    driver: bridge

我在终端和 Rabbitmq 管理 UI 中看到了消息。 但请注意,当应用程序从队列中读取消息时,该消息将从该队列中删除。因为您在终端中进行了打印,所以您有队列,但如果您想在 Rabbitmq 管理 UI 中查看消息,您只能运行发送者。

© www.soinside.com 2019 - 2024. All rights reserved.