前言:小刘在复习路上不断前行。这不,想到了和springboot一起使用。
MQ介绍就不再赘述;
配置:
SpringBoot 整合rabbitMq
Maven:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
配置:
spring.application.name=Spring-boot-rabbitmq
spring.rabbitmq.host=192.168.0.86
spring.rabbitmq.port=5672
spring.rabbitmq.username=admin
spring.rabbitmq.password=123456
五种常用的工作模式
HelloWorld---和工作队列
配置:
@Configuration
public class RabbitMqConfigHelloWorld {
/**
* 声明队列
* @return
*/
@Bean
public Queue Queue() {
return new Queue("hello_springBoot");
}
}
广播---发布订阅
package com.example.rmq_springboot_demo01.rabbitConfig;
import org.springframework.amqp.core.*;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* 广播---发布订阅模式
*/
@Configuration
public class FanoutRabbitConfig {
/**
* 声明队列
* @return
*/
public final static String FANOUT_QUEUE_NAME1 = "fanout.springboot.message1";//队列1
public final static String FANOUT_QUEUE_NAME2 = "fanout.springboot.message2";//队列2
public final static String EXCHANGE_FANOUT="exchange.springboot";//交换机名称
/**
* 队列一
* @return
*/
@Bean(name = "FANOUT_QUEUE_NAME1")
public Queue QUEUE_NAME1() {
return new Queue(FanoutRabbitConfig.FANOUT_QUEUE_NAME1);
}
/**
* 队列二
* @return
*/
@Bean(name = "FANOUT_QUEUE_NAME2")
public Queue QUEUE_NAME2() {
return new Queue(FanoutRabbitConfig.FANOUT_QUEUE_NAME2);
}
/**
* 声明广播类型的交换机
* @return
*/
@Bean(name = "EXCHANGE_FANOUT")
FanoutExchange EXCHANGE_FANOUT() {
return new FanoutExchange(FanoutRabbitConfig.EXCHANGE_FANOUT);
}
/**
* 队列绑定交换机
* @param FANOUT_QUEUE_NAME1
* @param fanoutExchange
* @return
*/
@Bean
Binding bindingExchangeA(@Qualifier("FANOUT_QUEUE_NAME1") Queue FANOUT_QUEUE_NAME1, @Qualifier("EXCHANGE_FANOUT") FanoutExchange fanoutExchange) {
return BindingBuilder.bind(FANOUT_QUEUE_NAME1).to(fanoutExchange);
}
@Bean
Binding bindingExchangeB(@Qualifier("FANOUT_QUEUE_NAME2") Queue FANOUT_QUEUE_NAME2,@Qualifier("EXCHANGE_FANOUT") FanoutExchange fanoutExchange) {
return BindingBuilder.bind(FANOUT_QUEUE_NAME2).to(fanoutExchange);
}
}
路由配置:
/**
* Routing----根据routing key的不同将消息发送给不同的队列
*/
@Configuration
public class RoutingRabbitConfig {
public final static String ROUTING_QUEUE_NAME1 = "routing.springboot.message1";//队列1
public final static String ROUTING_QUEUE_NAME2 = "routing.springboot.message2";//队列2
public final static String EXCHANGE_ROUTING="routing.exchange.springboot";//交换机名称
public final static String ROUTING_KEY1="routing.routing_key.springboot";//routing1
public final static String ROUTING_KEY2="routing.routing_key.springboot";//routing2
/**
* 声明队列一
* @return
*/
@Bean(name = "ROUTING_QUEUE_NAME1")
public Queue ROUTING_QUEUE_NAME1() {
return new Queue(RoutingRabbitConfig.ROUTING_QUEUE_NAME1);
}
/**
* 声明队列二
* @return
*/
@Bean(name = "ROUTING_QUEUE_NAME2")
public Queue ROUTING_QUEUE_NAME2() {
return new Queue(RoutingRabbitConfig.ROUTING_QUEUE_NAME2);
}
/**
* 声明交换机
* @return
*/
@Bean(name = "EXCHANGE_ROUTING")
TopicExchange EXCHANGE_ROUTING() {
return new TopicExchange(EXCHANGE_ROUTING);
}
/**
* 交换机绑定队列
* @param ROUTING_QUEUE_NAME1
* @param EXCHANGE_ROUTING
* @return
*/
@Bean
Binding bindingExchangeMessage(@Qualifier("ROUTING_QUEUE_NAME1") Queue ROUTING_QUEUE_NAME1, @Qualifier("EXCHANGE_ROUTING") TopicExchange EXCHANGE_ROUTING) {
return BindingBuilder.bind(ROUTING_QUEUE_NAME1).to(EXCHANGE_ROUTING).with(ROUTING_KEY1);
}
@Bean
Binding bindingExchangeMessages(@Qualifier("ROUTING_QUEUE_NAME2") Queue ROUTING_QUEUE_NAME2,@Qualifier("EXCHANGE_ROUTING") TopicExchange EXCHANGE_ROUTING) {
return BindingBuilder.bind(ROUTING_QUEUE_NAME2).to(EXCHANGE_ROUTING).with(ROUTING_KEY2);
}
}
通配符配置:
/**
* Topic模式----即更为高级的路由模式
*/
@Configuration
public class TopicRabbitConfig {
/**
* 通配符 . 一个字符
* #一个或者多个字符
*/
public final static String TOPIC_QUEUE_NAME1 = "topic_springboot_email_inform";//队列邮件
public final static String TOPIC_QUEUE_NAME2="topic_springboot_sms_inform";//队列手机
public final static String TOPIC_ROUT_EMAIL_KEY="topic_routing.#.email.#";//routing_key
public final static String TOPIC_ROUT_SMS_KEY="topic_routing.#.sms.#";//routing_key
public final static String TOPIC_EXCHANGE_TOPIC="topic_springboot_exchange";//交换机
/**
* 声明队列一
* @return
*/
@Bean(name = "TOPIC_QUEUE_NAME1")
public Queue TOPIC_QUEUE_NAME1() {
return new Queue(TopicRabbitConfig.TOPIC_QUEUE_NAME1);
}
/**
* 声明队列二
* @return
*/
@Bean(name = "TOPIC_QUEUE_NAME2")
public Queue TOPIC_QUEUE_NAME2() {
return new Queue(TopicRabbitConfig.TOPIC_QUEUE_NAME2);
}
/**
* 声明交换机
* @return
*/
@Bean(name = "TOPIC_EXCHANGE_TOPIC")
TopicExchange TOPIC_EXCHANGE_TOPIC() {
return new TopicExchange(TopicRabbitConfig.TOPIC_EXCHANGE_TOPIC);
}
/**
* 交换机绑定队列---根据routing_key
* @param queueMessage
* @param exchange
* @return
*/
@Bean
Binding bindingTopicExchangeMessage(@Qualifier("TOPIC_QUEUE_NAME1") Queue queueMessage, @Qualifier("TOPIC_EXCHANGE_TOPIC") TopicExchange exchange) {
return BindingBuilder.bind(queueMessage).to(exchange).with(TopicRabbitConfig.TOPIC_ROUT_EMAIL_KEY);
}
@Bean
Binding bindingTopicExchangeMessages(@Qualifier("TOPIC_QUEUE_NAME1") Queue queueMessages, @Qualifier("TOPIC_EXCHANGE_TOPIC") TopicExchange exchange) {
return BindingBuilder.bind(queueMessages).to(exchange).with(TopicRabbitConfig.TOPIC_ROUT_SMS_KEY);
}
}
生产者:在测试中写的;
@Autowired
RabbitTemplate rabbitTemplate;
/**rabbitTemplate.convertAndSend(String exchange, String routingKey, Object object)
* String exchange, 交换机
* String routingKey routing_key(特别说明,当没有routing_key模式的工作,会默认队列名称)
* Object object 发送消息体
* helloWorld 模式发送
*/
@Test
public void send(){
String context = "hello " + new Date();
System.out.println("Sender : " + context);
this.rabbitTemplate.convertAndSend("hello_springBoot", context);
}
/**
* 工作队列 模式发送
*/
@Test
public void send2(){
for (int i=0;i<20;i++){
String context = "Sender : "+i+"發送" +"hello " + new Date();
System.out.println("Sender : "+i+"發送" + context);
this.rabbitTemplate.convertAndSend("hello_springBoot", context);
}
}
/**
*------广播模式发送
*/
@Test
public void sendFanOut(){
for (int i=0;i<5;i++){
String context = "hi, fanout msg ";
System.out.println("Sender : " + context);
this.rabbitTemplate.convertAndSend(FanoutRabbitConfig.EXCHANGE_FANOUT,"", context);
}
}
/**
* 发送队列一
*/
@Test
public void routing1() {
String context = "hi, i am message 1";
System.out.println("Sender : " + context);
this.rabbitTemplate.convertAndSend(RoutingRabbitConfig.EXCHANGE_ROUTING, RoutingRabbitConfig.ROUTING_KEY1, context);
}
/**
* 发送队列二
*/
@Test
public void routing2() {
String context = "hi, i am messages 2";
System.out.println("Sender : " + context);
this.rabbitTemplate.convertAndSend(RoutingRabbitConfig.EXCHANGE_ROUTING, RoutingRabbitConfig.ROUTING_KEY2, context);
}
/**
* 通配符模式测试
*/
@Test
public void topic1() {
String context = "hi, i am message 1---";
System.out.println("Sender : " + context);
this.rabbitTemplate.convertAndSend(TopicRabbitConfig.TOPIC_EXCHANGE_TOPIC, "topic_routing.email", context);
}
@Test
public void topic2() {
String context = "hi, i am messages 2";
System.out.println("Sender : " + context);
this.rabbitTemplate.convertAndSend(TopicRabbitConfig.TOPIC_EXCHANGE_TOPIC,"topic_routing.sms", context);
}
消费者:统一模板:
@Component
@RabbitListener(queues = "hello_springBoot")
public class HelloReceiver2 {
@RabbitHandler
public void process(String msg) {
System.out.println("消费者二接收 : " + msg);
}
}
特别注意:队列名称;主要是用通配符模式和路由模式
如有不解,请加java爱好群大家交流:852665736;群里都是热心好客的小伙伴,大家一同进步。
无偿免费分享源码以及技术和面试文档,更多优秀精致的源码技术栈分享请关注微信公众号:gh_817962068649