SpringBoot(15) - 消息(3) - AMQP(1)RabbitMQ

参考:https://docs.spring.io/spring-boot/docs/1.5.17.RELEASE/reference/htmlsingle/#boot-features-amqp

 

高级消息队列协议(AMQP)是一个平台中立、线级协议的面向消息的中间件。 Spring AMQP项目将核心Spring概念应用于基于AMQP的消息传递解决方案的开发。Spring Boot提供了几种通过RabbitMQ使用AMQP的便利,包括spring-boot-starter-amqp的'Starter'。

 

RabbitMQ的支持

1. 简介

RabbitMQ是一个基于AMQP协议的轻量级、可靠、可扩展且可移植的消息代理。 Spring通过RabbitMQ使用AMQP协议进行通信。

RabbitMQ可以通过spring.rabbitmq.*属性配置。例如,可以在application.properties中声明以下配置:

spring.rabbitmq.host=localhost
spring.rabbitmq.port=5672
spring.rabbitmq.username=admin
spring.rabbitmq.password=secret

查看org.springframework.boot.autoconfigure.amqp.RabbitProperties获取更多支持的属性。

 

2. 发送消息

Spring自动配置了AmqpTemplate和AmqpAdmin,可以直接通过@Autowired直接注入。

import org.springframework.amqp.core.AmqpAdmin;
import org.springframework.amqp.core.AmqpTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Component
public class MyBean {
    private final AmqpAdmin amqpAdmin;
    private final AmqpTemplate amqpTemplate;

    @Autowired
    public MyBean(AmqpAdmin amqpAdmin, AmqpTemplate amqpTemplate) {
        this.amqpAdmin = amqpAdmin;
        this.amqpTemplate = amqpTemplate;
    }
    // ...
}

注:可以以同样的方式注入RabbitMessagingTemplate。假如注册了MessageConverter的bean,将会自动关联到自动配置的AmqpTemplate上。

如果需要,任何定义org.springframework.amqp.core.Queue的bean将自动用于在RabbitMQ实例上声明相应的队列。

可以在AmqpTemplate上启用重试以重试操作,例如在broker连接丢失的情况下。 默认情况下禁用重试。

 

3. 接收消息

当RabbitMQ基础结构存在时,通过@RabbitListener注解的bean创建监听器端点。如果未定义RabbitListenerContainerFactory,将会自动配置默认值。假如定义了MessageConverter或MessageRecoverer的bean,它们将会自动关联到默认的factory上。

下面的示例中创建了一个监听someQueue队列的端点:

@Component
public class MyBean {
    @RabbitListener(queues = "someQueue")
    public void processMessage(String content) {
        // ...
    }
}

注:查看@EnableRabbit注解的Java文档查询更多信息。

假如想要创建更多的RabbitListenerContainerFactory实例或覆盖默认的工厂实例,SpringBoot提供了一个SimpleRabbitListenerContainerFactoryConfigurer用来初始化SimpleRabbitListenerContainerFactory,初始化后的实例和SpringBoot自动配置的实例具有相同的配置。

下面的例子中,新定义了一个使用特定MessageConverter的工厂:

@Configuration
static class RabbitConfiguration {
    @Bean
    public SimpleRabbitListenerContainerFactory myFactory(SimpleRabbitListenerContainerFactoryConfigurer configurer) {
        SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory();
        configurer.configure(factory, connectionFactory);
        factory.setMessageConverter(myMessageConverter());
        return factory;
    }
}

然后通过@RabbitListener注解的containerFactory属性指定该工厂:

@Component
public class MyBean {
    @RabbitListener(queues = "someQueue", containerFactory="myFactory")
    public void processMessage(String content) {
        // ...
    }
}

可以启用重试来处理监听器抛出异常的情况。 默认使用RejectAndDontRequeueRecoverer,但可以自定义MessageRecoverer。 当超过重试最大次数时,如果配置了broker,则该消息将被拒绝并被丢弃或路由到死信exchange。 默认情况下禁用重试。

提示:如果未启用重试且监听器抛出异常,则默认情况下将无限期地重试传递。 可以通过两种方式修改此行为;:

  • 将defaultRequeueRejected属性设置为false,并尝试零重新传递;
  • 抛出一个AmqpRejectAndDontRequeueException来表示应该拒绝该消息。 这是启用重试并达到最大传递尝试时使用的机制。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值