一:首先得安装ribbitmq的服务,参考博客。
二:了解RibbitMq的基本原理,以及使用方法。
关键名词:
ConnectionFactory(连接管理器):应用程序与Rabbit之间建立连接的管理器,程序代码中使用;
Channel(信道):消息推送使用的通道;
Exchange(交换器):用于接受、分配消息;
Queue(队列):用于存储生产者的消息;
RoutingKey(路由键):用于把生成者的数据分配到交换器上;
BindingKey(绑定键):用于把交换器的消息绑定到队列上;
三:本博客将采用Fanount-Exchange消息模型,附上代码,代码上有详细注解
- 首先创建一个springboot多模块项目,创建完后配置生产者和消费者的application.yml
消费者:
生产者:
这里的username和password都是默认的guest
2.springboot整合ribbitMq的配置类:
package com.example.producer.config;
import org.springframework.amqp.core.*;
import org.springframework.beans.factory.annotation.Configurable;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
@Configurable
public class RibbitMqConfig {
//队列名称
public static final String QUEUE_INFROM_EMAIL = "queue_infrom_email";
public static final String QUEUE_INFROM_SMS = "queue_infrom_sms";
//交换机名称
public static final String ExCHANGE_TOPICS_INFROM = "exchange_topics_infrom";
//routingKey
public static final String ROUTINGKEY_EMAIL = "infrom.#.email.#";
public static final String ROUTINGKEY_SMS = "infrom.#.sms.#";
/**
* 声明交换机
* topicExchange : 声明通配符交换机
* fanoutExchange :发布订阅
* directExchange :路由交换机
* @return
*/
@Bean(ExCHANGE_TOPICS_INFROM)
public Exchange ExCHANGE_TOPICS_INFROM(){
//.durable(true) 交换机持久化,mq重启后交换机还在
return ExchangeBuilder.topicExchange(ExCHANGE_TOPICS_INFROM).durable(true).build();
}
/**
* 声明QUEUE_INFROM_EMAIL队列
*/
@Bean(QUEUE_INFROM_EMAIL)
public Queue QUEUE_INFROM_EMAIL(){
return new Queue(QUEUE_INFROM_EMAIL);
}
/**
* 声明QUEUE_INFROM_SMS队列
*/
@Bean(QUEUE_INFROM_SMS)
protected Queue QUEUE_INFROM_SMS(){
return new Queue(QUEUE_INFROM_SMS);
}
/**
* QUEUE_INFROM_EMAIL队列绑定交换机,指定ROUTINGKEY
* @Qualifier :指定名称注入队列和交换机
* .with(ROUTINGKEY_EMAIL) :根据指定的路由key绑定
* .noargs() :没有其他参数
*/
@Bean
public Binding BINDING_QUEUE_INFROM_EMAIL(@Qualifier(QUEUE_INFROM_EMAIL) Queue queue,@Qualifier(ExCHANGE_TOPICS_INFROM) Exchange exchange){
return BindingBuilder.bind(queue).to(exchange).with(ROUTINGKEY_EMAIL).noargs();
}
/**
* QUEUE_INFROM_SMS队列绑定交换机,指定ROUTINGKEY
* @Qualifier :指定名称注入队列和交换机
* .with(ROUTINGKEY_SMS) :根据指定的路由key绑定
* .noargs() :没有其他参数
*/
@Bean
public Binding BINDING_QUEUE_INFROM_SMS(@Qualifier(QUEUE_INFROM_SMS) Queue queue,@Qualifier(ExCHANGE_TOPICS_INFROM) Exchange exchange){
return BindingBuilder.bind(queue).to(exchange).with(ROUTINGKEY_SMS).noargs();
}
}
步骤:声明交换机,声明队列,绑定队列到对应的交换机
四:生产者发送消息
package com.example.producer;
import org.junit.jupiter.api.Test;
import org.junit.runner.RunWith;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
@SpringBootTest
@RunWith(SpringRunner.class)
class SpringBootRibbtmaProducerApplicationTests {
@Autowired
RabbitTemplate rabbitTemplate;
//使用springboot提供的rabbitTemplate发送消息
@Test
void sendEmailMessage() {
/**
* 参数:
* 1. 交换机名称
* 2. routingKey
* 3. 消息内容
*/
rabbitTemplate.convertAndSend("exchange_topics_infrom","inform.email","send email to user");
}
}
使用springboot的rabbitTemplate来发送消息,convertAndSend的重载方法有很多,这里用的参数有:交换机名称,路由key,消息内容。
运行程序之后,我们就能看到交换机、队列已经被声明,并且消息也发送成功了:
交换机:
两个队列:
其中一个队列产生了一个消息:
发送成功!
五:消费者接收消息。
package com.example.consumer;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;
import sun.plugin2.message.Message;
import java.nio.channels.Channel;
@Component
public class ConsumerListener {
/**
* 接收队列消息
* @param mes 可以直接接收字符串消息
* @param message 得到消息内容
* @param channel 得到通道
*/
@RabbitListener(queues = {"queue_infrom_email"}) //存放一个或者多个队列名称
public void receptionEmail(String mes, Message message, Channel channel){
System.out.println(mes);
}
}
注意:该类必须交给spring管理,所以要加上@Component注解。(@service 之类的注解也行)。
完结!