springboot 集成 RabbitMQ

一、简单使用

添加依赖


org.springframework.boot
spring-boot-starter-amqp

添加配置

RabbitMQ 配置

spring.application.name=spirng-boot-rabbitmq
spring.rabbitmq.host=127.0.0.1
spring.rabbitmq.port=5672
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest

PS:Windows搭建RabbitMQ环境

添加队列配置

@Configuration
public class RabbitConfig {

@Bean
public Queue helloQueue() {
return new Queue("hello");
}
}

发送者(生产者)

@Component
public class HelloSender {

@Autowired
private AmqpTemplate rabbitTemplate;

public void send() {
String context = "hello " + new Date();
this.rabbitTemplate.convertAndSend("hello", context);
}
}

接收者(消费者)

@Component
@RabbitListener(queues = "hello")
public class HelloReceiver {

@RabbitHandler
public void process(String hello) {
System.out.println("Receiver : " + hello);
}
}

测试

@RunWith(SpringRunner.class)
@SpringBootTest
public class RabbitMqHelloTest {

@Autowired
private HelloSender helloSender;

@Test
public void hello() throws Exception {
helloSender.send();
}
}

二、RabbitMQ介绍

用来实现应用程序的异步和解耦,同时也能起到消息缓冲,消息分发的作用。

  • 消息(message)

    消息。消息头可包括routing-key属性。

  • 交换机(Exchange)

    用来接收生产者发送的消息并将这些消息路由给服务器中的队列。

  • 绑定(Binding)

    绑定交换机和队列。

  • 队列(Queue)

    消息队列。用来存储消息,等待消费者连接,将消息取走。

  • 生产者(Publisher)

    消息发送者。

  • 消费者(Consumer)

    消息接收者。

Exchange 类型

  • direct exchange(默认实现方式)

    根据key全文匹配队列。

  • topic exchange

    可根据routing-key自由绑定不同的队列。

  • fanout exchange

    向所有绑定该交换机的队列发送消息。

三、测试使用不同Exchange

添加配置

@Configuration
public class RabbitConfig {

//创建队列
@Bean
public Queue queueRed() {
return new Queue("queue.color.red");
}

@Bean
public Queue queueYellow() {
return new Queue("queue.color.yellow");
}

@Bean
public Queue queueBlue() {
return new Queue("queue.color.blue");
}

@Bean
public Queue queueGreen() {
return new Queue("queue.color.green");
}

// 创建交换机
// fanout exchange
@Bean
FanoutExchange fanoutExchange() {
return new FanoutExchange("fanoutExchange");
}

// topic exchange
@Bean
TopicExchange topicExchange() {
return new TopicExchange("topicExchange");
}

// 创建绑定。配置交换机与队列的绑定关系。
// fanout exchange
// 在交换机接收消息后,会向与自己绑定的所有队列发送消息。
@Bean
Binding bindingFanoutExchange1(Queue queueRed, FanoutExchange fanoutExchange) {
return BindingBuilder.bind(queueRed).to(fanoutExchange);
}

@Bean
Binding bindingFanoutExchange2(Queue queueYellow, FanoutExchange fanoutExchange) {
return BindingBuilder.bind(queueYellow).to(fanoutExchange);
}

@Bean
Binding bindingFanoutExchange3(Queue queueBlue, FanoutExchange fanoutExchange) {
return BindingBuilder.bind(queueBlue).to(fanoutExchange);
}

// topic exchange
// 除将队列与交换机绑定外,并规定绑定规则(binding-key)。在交换机接收消息后,会根据消息的路由键(routing-key)依照绑定规则(binding-key)向与自己绑定的队列发送消息。
@Bean
Binding bindingTopicExchange1(Queue queueRed, TopicExchange topicExchange) {
return BindingBuilder.bind(queueRed).to(topicExchange).with("queue.color.#");
}

@Bean
Binding bindingTopicExchange2(Queue queueYellow, TopicExchange topicExchange) {
return BindingBuilder.bind(queueYellow).to(topicExchange).with("queue.color.#");
}

@Bean
Binding bindingTopicExchange3(Queue queueBlue, TopicExchange topicExchange) {
return BindingBuilder.bind(queueBlue).to(topicExchange).with("queue.color.#");
}

}

通配符:

  • # 表示0个或多个词
  • * 表示1个词

添加消息发送者(生产者)

@Component
public class RabbitSender {

@Autowired
private AmqpTemplate rabbitTemplate;

public void defaultSender() {
String context = "使用默认交换机(direct)发送消息!routing-key='queue.color.red'。";
this.rabbitTemplate.convertAndSend("queue.color.red", context);
}

public void fanoutSender() {
String context = "使用fanout交换机发送消息!";
this.rabbitTemplate.convertAndSend("fanoutExchange", "", context);
}

public void topicSender() {
String context = "使用topic交换机发送消息!routing-key='queue.color.green'";
this.rabbitTemplate.convertAndSend("topicExchange", "queue.color.green", context);
}
}

添加消息接收者(消费者)

@Component
public class RabbitReceiver {

@RabbitHandler
@RabbitListener(queues = "queue.color.red")
public void processRed(String msg) {
System.out.println("Receiver queue.color.red : " + msg);
}

@RabbitHandler
@RabbitListener(queues = "queue.color.yellow")
public void processYellow(String msg) {
System.out.println("Receiver queue.color.yellow : " + msg);
}

@RabbitHandler
@RabbitListener(queues = "queue.color.blue")
public void processBlue(String msg) {
System.out.println("Receiver queue.color.blue : " + msg);
}

@RabbitHandler
@RabbitListener(queues = "queue.color.green")
public void processGreen(String msg) {
System.out.println("Receiver queue.color.green : " + msg);
}
}

添加测试

@RunWith(SpringRunner.class)
@SpringBootTest
public class TestRabbitMQ {

@Autowired
private RabbitSender rabbitSender;

@Test
public void directMQ() throws Exception {
this.rabbitSender.defaultSender();
}

@Test
public void fanoutMQ() throws Exception {
this.rabbitSender.fanoutSender();
}

@Test
public void topicMQ() throws Exception {
this.rabbitSender.topicSender();
}

}

PS:可访问http://127.0.0.1:15672查看队列、交换机的状态。在修改rabbitMQ配置后,并不能清除之前的绑定关系,可能会引发问题。

 posted on 2018-07-11 09:43  AI.℡  阅读(228)  评论(0)    收藏  举报