Spring Boot + RabbitMQ 的快速使用

docker部署rabbitmq

 # management才有管理页面
docker pull rabbitmq:management

# 新建容器并运行
docker run \
 -e RABBITMQ_DEFAULT_USER=admin \ 
 -e RABBITMQ_DEFAULT_PASS=admin \ 
 -v mq-plugins:/plugins \
 --name mq \
 --hostname mq \
 -p 15672:15672 \
 -p 5672:5672 \
 -itd \
 rabbitmq:management

# 查看运行状态
docker ps -a

 


 

导入RabbitMQ依赖

pom.xml
<!--AMQP依赖,包含RabbitMQ-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
<!-- 消息转换器需要用到的Jackson -->
<dependency>
    <groupId>com.fasterxml.jackson.dataformat</groupId>
    <artifactId>jackson-dataformat-xml</artifactId>
    <version>2.9.10</version>
</dependency>

 

提供者和消费者的配置

application.yml
spring:
  rabbitmq:
    host: 192.168.137.139 # 主机名
    port: 5672 # 端口
    virtual-host: / # 虚拟主机
    username: admin # 用户名
    password: admin # 密码

 

消息转换器

提供者和消费者都可以添加

RabbitMQMessageConverterConfig.java
@Configuration
public class RabbitMQMessageConverterConfig {
    @Bean
    public static MessageConverter jsonMessageConverter() {
        return new Jackson2JsonMessageConverter();
    }
}

在这里插入图片描述

 

注意执行顺序:需要先使用consumer监听并创建队列(需要保证队列存在!),publisher再往里面添加队列才会有用,否则白添加队列

 


 

SimpleQueue

在这里插入图片描述

提供者: SimpleQueuePublisher.java
@RunWith(SpringRunner.class)
@SpringBootTest
public class SimpleQueuePublisher {
    @Autowired
    private RabbitTemplate rabbitTemplate;

    @Test
    public void simpleQueueTest() {
        String msg = "hello, simple queue";
        rabbitTemplate.convertAndSend("simple.queue", msg);
    }
}
消费者:SimpleQueueConsumer.java
@Component
public class SimpleQueueConsumer {
    @RabbitListener(queues = "simple.queue")
    public void simpleQueueConsumer(String msg) {
        System.out.println("simpleQueueConsumer: " + msg);
    }
}

 


 

Work Queues

在这里插入图片描述

可加配置

application.yml

spring:
  rabbitmq:
    listener:
      simple: # simple类型
        prefetch: 1 # consumer每次执行预取的数量
消费者:WorkQueueConsumer.java
@Component
public class WorkQueueConsumer {
    @RabbitListener(queuesToDeclare = {@Queue(name = "work.queue")})
    public void workQueue1Consumer(String msg) throws InterruptedException {
        System.out.println("workQueue1Consumer: " + msg);
        Thread.sleep(10);
    }

    @RabbitListener(queuesToDeclare = {@Queue(name = "work.queue")})
    public void workQueue2Consumer(String msg) throws InterruptedException {
        System.out.println("workQueue2Consumer: " + msg);
        Thread.sleep(90);
    }
}

提供者: WorkQueuePublisher.java
@RunWith(SpringRunner.class)
@SpringBootTest
public class WorkQueuePublisher {
    @Autowired
    private RabbitTemplate rabbitTemplate;

    @Test
    public void workQueueTest() {
        for (int i = 1; i <= 100; i ++ ) {
            String msg = "hello, work queue. " + i;
            rabbitTemplate.convertAndSend("work.queue", msg);
        }
    }
}

 


 

发布/订阅

Fanout

在这里插入图片描述

消费者:FanoutQueueConsumer.java
@Exchange@Queue注解中的declare属性默认为"true",如果不存在会自动创建exchange和queue。
@Component
public class FanoutQueueConsumer {
    @RabbitListener(bindings = @QueueBinding(
            exchange = @Exchange(name = "fanout", type = ExchangeTypes.FANOUT),
            value = @Queue(name = "fanout.queue1")
    ))
    public void fanoutQueue1Consumer(String msg) {
        System.out.println("fanoutQueue1Consumer: " + msg);
    }

    @RabbitListener(bindings = @QueueBinding(
            exchange = @Exchange(name = "fanout", type = ExchangeTypes.FANOUT),
            value = @Queue(name = "fanout.queue2")
    ))
    public void fanoutQueue2Consumer(String msg) {
        System.out.println("fanoutQueue2Consumer: " + msg);
    }

}
提供者: FanoutQueuePublisher.java
@RunWith(SpringRunner.class)
@SpringBootTest
public class FanoutQueuePublisher {
    @Autowired
    private RabbitTemplate rabbitTemplate;

    @Test
    public void fanoutQueueTest() {
        String exchangeName = "fanout";
        String msg = "hello, fanout queue.";
        rabbitTemplate.convertAndSend(exchangeName, "", msg);
    }
}

 


 

Routing / Direct

在这里插入图片描述

消费者:DirectQueueConsumer.java
@Component
public class DirectQueueConsumer {
    @RabbitListener(bindings = @QueueBinding(
            exchange = @Exchange(name = "direct", type = ExchangeTypes.DIRECT),
            value = @Queue(name = "direct.queue1")
    ))
    public void directQueue1Consumer(String msg) {
        System.out.println("directQueue1Consumer: " + msg);
    }

    @RabbitListener(bindings = @QueueBinding(
            exchange = @Exchange(name = "direct", type = ExchangeTypes.DIRECT),
            value = @Queue(name = "direct.queue2")
    ))
    public void directQueue2Consumer(String msg) {
        System.out.println("directQueue2Consumer: " + msg);
    }

}
提供者: DirectQueuePublisher.java
@RunWith(SpringRunner.class)
@SpringBootTest
public class DirectQueuePublisher {
    @Autowired
    private RabbitTemplate rabbitTemplate;

    @Test
    public void directQueueTest() {
        String exchangeName = "direct";
        String key = "error";
//        String key = "warning";
        String msg = "hello, direct queue, " + key;
        rabbitTemplate.convertAndSend(exchangeName, key, msg);
    }
}

 


 

Topics

*: 通配一个单词#: 通配多个单词

在这里插入图片描述

消费者:TopicQueueConsumer.java
@Configuration
public class TopicQueueConsumer {
    @RabbitListener(bindings = @QueueBinding(
            exchange = @Exchange(name = "topic", type = ExchangeTypes.TOPIC),
            value = @Queue(name = "topic.queue1"),
            key = {"*.orange.*"}
    ))
    public void topicQueue1Consumer(String msg) {
        System.out.println("topicQueue1Consumer: " + msg);
    }

    @RabbitListener(bindings = @QueueBinding(
            exchange = @Exchange(name = "topic", type = ExchangeTypes.TOPIC),
            value = @Queue(name = "topic.queue2"),
            key = {"*.*.rabbit", "lazy.#"}
    ))
    public void topicQueue2Consumer(String msg) {
        System.out.println("topicQueue2Consumer: " + msg);
    }
}
提供者: TopicQueuePublisher.java
@RunWith(SpringRunner.class)
@SpringBootTest
public class TopicQueuePublisher {
    @Autowired
    private RabbitTemplate rabbitTemplate;

    @Test
    public void topicQueueTest() {
        String exchangeName = "topic";
        String key = "lazy.orange.rabbit";
        String msg = "hello, topic queue. " + key;
        rabbitTemplate.convertAndSend(exchangeName, key, msg);
    }
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值