美文网首页
Springboot整合RabbitMQ(一)——Direct直

Springboot整合RabbitMQ(一)——Direct直

作者: 砒霜拌辣椒 | 来源:发表于2020-09-13 22:56 被阅读0次

直连型交换机,根据消息携带的路由值将消息投递给对应队列。
大致流程,有一个队列绑定到一个直连交换机上,同时赋予一个路由键routing key。
然后当一个消息携带着路由值为X,这个消息通过生产者发送给交换机时,交换机就会根据这个路由值X去寻找绑定值也是X的队列。

1、Maven依赖

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.1.4.RELEASE</version>
</parent>
<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-amqp</artifactId>
    </dependency>
</dependencies>

2、配置文件

server:
  port: 30200

spring:
  rabbitmq:
    host: 148.70.153.63
    port: 5672
    username: libai
    password: password

3、生产者

3.1、配置文件

声明队列和交换机,并设置队列和交换机绑定的路由键。

@Configuration
public class DirectRabbitConfig {
    //队列 起名:directQueue
    @Bean
    public Queue directQueue() {
        return new Queue("directQueue", true, false, false);
    }

    //Direct交换机 起名:directExchange
    @Bean
    public DirectExchange directExchange() {
        return new DirectExchange("directExchange", true, false);
    }

    //绑定  将队列和交换机绑定, 并设置路由键:directRouting
    @Bean
    public Binding bindingDirect() {
        return BindingBuilder.bind(directQueue()).to(directExchange()).with("directRouting");
    }
}
  • 声明队列参数列表:
    • name:队列名称。
    • durable:是否持久化,否则RabbitMQ服务端重启,队列就不再存在。
    • exclusive:是否排他,即该队列是否只能被当前创建的连接使用,而且当连接关闭后队列即被删除。此参数优先级高于durable
    • autoDelete:是否自动删除,当没有生产者或者消费者使用此队列,该队列会自动删除。
  • 声明交换机参数列表:
    • name:交换机名称。
    • durable:是否持久化,否则RabbitMQ服务端重启,队列就不再存在。
    • autoDelete:是否自动删除,当没有生产者或者消费者使用此队列,该队列会自动删除。

3.2、发送消息

@RestController
public class SendMessageController {
    @Autowired
    private RabbitTemplate rabbitTemplate;  // 使用RabbitTemplate,这提供了接收/发送等等方法

    @PostMapping("/sendDirectMessage")
    public String sendDirectMessage() {
        Map<String, Object> map = new HashMap<>();
        map.put("messageId", String.valueOf(UUID.randomUUID()));
        map.put("messageData", "RabbitMQ");
        map.put("createTime", LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
        // 将消息携带路由键值:directRouting 发送到交换机directExchange
        rabbitTemplate.convertAndSend("directExchange", "directRouting", map);
        return "ok";
    }
}

发送到指定的交换机上,同时指定路由键。RabbitMQ会根据路由键把消息推送至和该交换机绑定的队列中。

convertAndSend函数还支持只指定消息发送的队列名称,可以不指定交换机名称;只要声明要发送的队列,也不需要和交换机绑定。不过并非不使用交换机,实际上是使用RabbitMQ自带的默认交换机和指定队列进行路由。比如:

rabbitTemplate.convertAndSend("directQueue", map);

启动服务,用postman调用发送消息接口。

3.3、查看RabbitMQ的后台管理界面

可以看到已经有一条消息推送到队列中,等待被消费。


消息预览

3.4、查看交换机

可以看到交换机已经被创建出来了。


查看交换机

可以看到和队列的绑定关系。


和队列的绑定

3.5、查看队列

队列也已经被创建出来了。


查看队列

查看绑定了哪些交换机。


队列绑定的交换机

4、消费者

通过注解@RabbitListener指定要消费的队列。

@Component
@RabbitListener(queues = "directQueue")
@Slf4j
public class DirectReceiver {
    @RabbitHandler
    public void process(Map testMessage) {
        log.info("DirectReceiver消费者收到消息:{}", JSONUtil.toJsonPrettyStr(testMessage));
    }
}

重新启动服务,可以看到控制台打印输出,说明该条消息已经被消费成功了。

2020-09-13 20:37:19,508 [INFO] [org.springframework.amqp.rabbit.RabbitListenerEndpointContainer#0-1] [net.zhaoxiaobin.rabbitmq.consumer.direct.DirectReceiver:25] [] DirectReceiver消费者收到消息:{
    "createTime": "2020-09-13 20:37:19",
    "messageId": "f5671a04-21ef-4ba5-8944-28d23ad4b0ad",
    "messageData": "RabbitMQ"
}

查看后台管理界面,已经没有待消费的消息了。


消息预览

Springboot整合RabbitMQ(二)——Fanout扇形交换机
Springboot整合RabbitMQ(三)——Topic主题交换机

参考链接

代码地址

相关文章

网友评论

      本文标题:Springboot整合RabbitMQ(一)——Direct直

      本文链接:https://www.haomeiwen.com/subject/mnzoektx.html