RabbitMQ
一、五个模式
简单模式
默认一个交换机,一个队列,一个消费者,一条队列里面的消息只能被一个消费者消费
应用场景:一对一,如手机短信,邮件
work(争抢)模式
默认一个交换机,消费者从队列中获取消息,逐条获取,如消费者1获取消息1、3、4,消费者2获取消息2、4、6
应用场景:抢红包,资源分配系统
Pub/Sub(发布订阅)模式
rabbitmq 交换机将消息同时发布到不同的队列中,消费者从绑定的队列中获取相应的消息进行消费
应用场景:广告,消息推送
rooting(路由模式)
交换机通过绑定的key,将不同的消息发送到不同的队列中,消费者从队列中获取进行消费
应用场景:不同等级的log日志输出(如只有error等级的log日志才需要进行数据库存储)、短信、聊天工具
Tpoic(通配符模式)
在路由器的基础上,增加key的通配符匹配功能,只有匹配上的key才会分配到对应的队列中
通配符: # :表示匹配多个字符 * :表示匹配一个字符
例: #.order.# :表示匹配前后多个字符,如 test.order order.test 均可匹配
*.order : 表示前面需要匹配一个字符,如test.order 可匹配,order.test不能匹配
应用场景:多级分配
二、SpringBoot集合RabbitMQ
1、yml引入配置
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
2、生产者
步骤
1、创建交换机
2、创建队列
3、通过指定的key绑定队列和交换机
4、发送消息
configuration中的配置代码
import org.springframework.amqp.core.Exchange;
import org.springframework.amqp.core.ExchangeBuilder;
import org.springframework.amqp.core.Queue;
import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class ProduceRabbitConfiguration {
public static final String EXCHANGE_TEST = "exchange_test";
public static final String QUEUE_TEST= "queue_test";
public static final String ROUTINTKEY_TEST = "test.#"; //配置路由通配符规则
// 创建交换机
@Bean("bootExchage") //交由spring容器管理
public Exchange bootExchage(){
return ExchangeBuilder.topicExchange(EXCHANGE_TEST).durable(true).build();
}
// 队列
@Bean("bootQueue")
public Queue bootQueue(){
return new Queue(QUEUE_TEST);
}
// 队列交换机绑定,指定key
@Bean
public Binding ROUNTINGKEY_TEST(@Qualifier("bootExchage") Exchange exchange,@Qualifier("bootQueue") Queue queue){
return BindingBuilder.bind(queue).to(exchange).with(ROUTINTKEY_TEST).noargs();
}
}
发送消息
import com.rabbit.producer.ProduceRabbitConfiguration;
import com.rabbit.rabbitProducerApplication;
import org.junit.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;
@RunWith(SpringRunner.class)
@SpringBootTest(classes = {rabbitProducerApplication.class})
public class rabbitTest {
@Autowired
RabbitTemplate rabbitTemplate;
@Test
public void rabbitTest(){
String message = "这是body的内容";
// rabbitTemplate.convertAndSend(ProduceRabbitConfiguration.EXCHANGE_TEST,"text.boot",message);
String response = String.valueOf(rabbitTemplate.convertSendAndReceive(ProduceRabbitConfiguration.EXCHANGE_TEST,"test.boot",message));
System.out.println(response);
}
}
rabbitTemplate.convertAndSend():发送消息,没有返回信息;
rabbitTemplate.convertSendAndReceive():发送消息并接收返回信息;
3、消费者
使用@RabbitListener(queues = "queue_test")标签在对应方法上,监听队列,当队列中有消息时,自动拿过来消费执行代码;
“queue=” :监听指定的队列
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;
@Component
public class ComsumerRabbit {
@RabbitListener(queues = "queue_test")
public void lister(Message message){
System.out.println("------------->"+message);
}
}
(以上图为网上引用,如有侵权还请联系我更改)
分割线:待继续学习继续补充==============