MQ 简单队列发送消息
1.在消息发送服务项目 和消息接收服务项目 引入依赖包
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-amqp</artifactId> <version>2.3.9.RELEASE</version> </dependency>
2. 在消息发送服务项目和消息接收服务项目的application.yml文件配置MQ信息
spring: rabbitmq: host: 192.168.126.195 mq所在主机ip virtual-host: / mq虚拟主机 username: mqroot mq登录账号 password: mq1234 mq登录密码 port: 5672 mq安装时设定的发送消息端口号
3. 在消息发送服务项目写入
4.在消息接收服务项目写下如下:
此类消息队列 需要建立连接创建出 消息队列
***SpringAMQP发布订阅模型***
第一种:Fanout Exchange 广播
1.在消息接收服务项目 声明交换机 队列 并把队列绑定到交换机上
@Configuration
public class fanoutFig {
// 注册交换机
@Bean
public FanoutExchange fanout_jiaohuanji() {
return new FanoutExchange("Fanout_jiaohuanji"); //交换机名称
}
// 注册队列1
@Bean
public Queue queue_duilie1() {
return new Queue("Queue_duilie1"); //队列1名称
}
// 注册队列2
@Bean
public Queue queue_duilie2() {
return new Queue("Queue_duilie2"); //队列2名称
}
//绑定队列1到交换机
@Bean
public Binding fanout_binding1(Queue queue_duilie1, FanoutExchange fanout_jiaohuanji) {
return BindingBuilder.bind(queue_duilie1).to(fanout_jiaohuanji);
}
//绑定队列2到交换机
@Bean
public Binding fanout_binding2(Queue queue_duilie2, FanoutExchange fanout_jiaohuanji) {
return BindingBuilder.bind(queue_duilie2).to(fanout_jiaohuanji);
}
}
2. 在消息接收服务项目 编写两个方法分别监听 队列1和2
// FanoutExchange交换机接收消息
@RabbitListener(queues = "Queue_duilie1")
public void springAMQPjieshou1(String xiaoxi) {
System.out.println("spring 消费者Queue_duilie1接收到消息 :【" +xiaoxi + "】");
}
@RabbitListener(queues = "Queue_duilie2")
public void springAMQPjieshou2(String xiaoxi) {
System.err.println("spring 消费者Queue_duilie2接收到消息 :【" + xiaoxi + "】");
}
3.在消息发送服务项目 发送消息
// 向 FanoutExchange 交换机发送消息
@Test
public void fanoutfasong() { // 此处交换机名称和服务接收的交换机名称一致
String fanoutexchange = "Fanout_jiaohuanji"; //交换机名称
String xiaoxi = "hello FanoutExchange"; // 消息
rabbitTemplate.convertAndSend(fanoutexchange, "", xiaoxi);
}
第二种 :Direct Exchange 根据指定key 匹配到正确的key的队列上 并接收该队列的消息。会将接收到的消息根据规则路由到指定的Queue,因此称为路由模式(routes)
1.在消息接收服务项目 注册交换机 队列并声明 key值
2. 在消息发送服务项目 发送消息
第三种:TopicExchange,TopicExchange与DirectExchange类似,区别在于routingKey必须是多个单词的列表,并且以.分割 。 Queue与Exchange指定BindingKey时可以使用通配符
#: 代指0个或多个单词
*: 代指一个单词
1. 在消息接收服务项目 声明 交换机 队列 key
// TopicExchange 路由 交换机配置 接收消息
@RabbitListener(bindings = @QueueBinding( //交换机名称,type指定交换机类型
exchange = @Exchange(value = "top_exchange", type = ExchangeTypes.TOPIC),
value = @Queue("topic_queue_1"), //队列名称
key = {"fan.#"}
))
public void Topic_exchange1(String msg) {
System.out.println("spring 消费者topic_queue_1_fan.#接收到消息 :【" + msg + "】");
}
// TopicExchange 路由 交换机配置 接收消息
@RabbitListener(bindings = @QueueBinding( //交换机名称,type指定交换机类型
exchange = @Exchange(value = "top_exchange", type = ExchangeTypes.TOPIC),
value = @Queue("topic_queue_2"), //队列名称
key = {"jun.#"}
))
public void Topic_exchange2(String msg) {
System.err.println("spring 消费者topic_queue_2_jun.#接收到消息 :【" + msg + "】");
}
2.在消息发送服务项目 发送消息 @Test
public void TopicExchangefasong1() {
String fanoutexchange = "top_exchange";
String xiaoxi = "hello fan.jun";
rabbitTemplate.convertAndSend(fanoutexchange, "fan.key", xiaoxi);
}
@Test
public void TopicExchangefasong2() {
String fanoutexchange = "top_exchange";
String xiaoxi = "hello jun.ning";
rabbitTemplate.convertAndSend(fanoutexchange, "jun.ning", xiaoxi);
}