我在这里有这个项目的 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 + "'");
}
}
我已经运行了你的代码,正如 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 中查看消息,您只能运行发送者。