目录
部署demo项目
首先配置好一个mq的练习demo,并配置好相关依赖
链接:https://pan.baidu.com/s/1oXAqgoz9Y_5V7YxC_rLa-Q?pwd=v2sg
提取码:v2sg
如图
父xml文件已经配置好了 AMQP依赖了
什么是基本消息模型
基本消息模型 : 生产者直接将消息发送到队列,消费者直接监听消息队列, 少了一个交换机接收和路由消息的步骤
实现基本消息模型
1.控制台创建队列
2.编写生产者代码
首先配置MQ地址,在publisher
服务的application.yml
中添加配置:
spring: rabbitmq: host: 47.115.204.241 # 你的虚拟机IP port: 5672 # 端口 virtual-host: / # 虚拟主机 username: itheima # 你的用户名 password: 123321 # 你的密码
在配置虚拟主机时,我最开始用的是ALL,然后报错;了,后来我改为用 / 就成功运行了
在使用 Spring AMQP 进行消息传递时,虚拟主机(Virtual Host)是用于隔离不同应用程序之间的消息队列和交换机的机制。通常情况下,虚拟主机的名称是一个路径样式的字符串,类似于文件系统中的路径,可以使用斜杠
/
来表示不同的层级。问题可能出在使用
ALL
作为虚拟主机名称时,导致了异常。一般来说,虚拟主机名称中不建议使用特殊字符或保留字,因为这可能会引起解析问题或与系统关键字冲突。在你的情况下,将虚拟主机名称从
ALL
更改为/
可能是一个有效的解决方法,因为/
是一个合法的虚拟主机名称,而且符合常规的命名约定。请记住,在配置虚拟主机名称时,最好遵循标准的命名约定,避免使用特殊字符或保留字,以确保系统能够正确解析和处理。
然后在publisher
服务中编写测试类SpringAmqpTest
,并利用RabbitTemplate
实现消息发送:
java
package cn.itcast.mq.helloworld;
import org.junit.jupiter.api.Test;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.messaging.Message;
@SpringBootTest
public class SpringAMQPTest {
@Autowired
private RabbitTemplate rabbitTemplate;
@Test
void testSendMessage(){
String queueName = "simple.queue";
String message = "hello,基本消息类型";
rabbitTemplate.convertAndSend(queueName, message);
}
}
查看控制台可以看到收到消息了
代码解析
@Autowired
是 Spring 框架提供的注解,用于自动装配(依赖注入)对象。通过在需要使用的地方添加 @Autowired
注解,Spring 将会根据类型或名称来自动查找相应的 Bean 对象,并将其注入到目标对象中。
rabbitTemplate.convertAndSend(queueName, message)
是 Spring AMQP 提供的方法,用于将消息发送到指定的 RabbitMQ 队列中。它需要传递两个参数:queueName
表示目标队列的名称,message
表示要发送的消息内容。
java
@Autowired
private RabbitTemplate rabbitTemplate;
public void sendMessage(String queueName, String message) {
rabbitTemplate.convertAndSend(queueName, message);
}
总结起来,@Autowired
是用于自动装配对象的注解,而 rabbitTemplate.convertAndSend(queueName, message)
是用于发送消息到 RabbitMQ 的方法。通过结合使用它们,你可以方便地将消息发送到指定的队列中。
3.编写消费者代码
首先在消费者的yml文件也要配置好相关代码
然后创建一个类
java
package cn.itcast.mq.lintener;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;
@Slf4j
@Component
public class MQListener {
@RabbitListener(queues = "simple.queue")
public void listenSimpleQueue(String message){
System.out.println("消费者收到了消息: " + message);
}
}
代码解析
@RabbitListener(queues = "simple.queue")
是 Spring AMQP 中用于声明消息监听器的注解。通过使用这个注解,你可以指定要监听的 RabbitMQ 队列名称,以便在消息到达该队列时执行相应的消息处理逻辑。具体来说,@RabbitListener
注解标记在一个方法上,表示这个方法是一个 RabbitMQ 消息监听器。当监听的队列中有消息到达时,Spring 将自动调用被注解的方法,并将消息内容作为参数传递给这个方法。
在你提供的例子中,@RabbitListener(queues = "simple.queue")
表示将一个方法标记为监听名为 "simple.queue" 的 RabbitMQ 队列的消息。当这个队列中有消息到达时,被注解的方法就会被触发,并处理接收到的消息内容。