简单封装了一个spring-retry的工具类,使用非常方便。

首先pom.xml增加如下依赖:

        <dependency>
            <groupId>org.springframework.retry</groupId>
            <artifactId>spring-retry</artifactId>
            <version>1.2.2.RELEASE</version>
        </dependency>

工具类名称为RetryUtil,代码如下:

import org.springframework.retry.RetryPolicy;
import org.springframework.retry.backoff.FixedBackOffPolicy;
import org.springframework.retry.policy.CompositeRetryPolicy;
import org.springframework.retry.policy.SimpleRetryPolicy;
import org.springframework.retry.policy.TimeoutRetryPolicy;
import org.springframework.retry.support.RetryTemplate;

import java.util.HashMap;
import java.util.Map;

public class RetryUtil {
    public static class Policy{
        //单一策略
        final public static int simple = 0;
        //悲观策略
        final public static int comp_single = 1;
        //乐观策略
        final public static int comp_muti = 2;

    }

    /**
     * 重试策略
     * 0:单一策略
     * 1:悲观策略,满足任意条件重试结束
     * 2:乐观策略,满足全部条件重试结束
     */
    private int retryPolicy = 0;
    /**
     * 重试间隔时间ms,默认1000ms
     */
    private long fixedPeriodTime = 1000L;
    /**
     * 最大重试次数,默认为3
     */
    private int maxRetryTimes = 3;
    /**
     * 总的超时时间
     */
    private int timeoutRetryPolicy = 5000;
    /**
     * 表示哪些异常需要重试,key表示异常的字节码,value为true表示需要重试
     */
    private Map<Class<? extends Throwable>, Boolean> exceptionMap = new HashMap<>();

    public RetryUtil() {}

    public RetryUtil setRetryPolicy(int policy) {
        retryPolicy = policy;
        return this;
    }

    public RetryUtil setFixedPeriodTime(int time) {
        fixedPeriodTime = time;
        return this;
    }

    public RetryUtil setMaxRetryTimes(int times) {
        maxRetryTimes = times;
        return this;
    }

    public RetryUtil setTimeoutRetryPolicy(int time) {
        timeoutRetryPolicy = time;
        return this;
    }

    public RetryUtil addExceptionMap(Class c) {
        exceptionMap.put(c, true);
        return this;
    }

    public static RetryUtil instance() {
        RetryUtil r = new RetryUtil();
        return r;
    }

    public RetryTemplate build() {

        RetryPolicy p = null;
        switch (retryPolicy){
            case Policy.simple:
                p = new SimpleRetryPolicy(maxRetryTimes, exceptionMap);
                break;
            case Policy.comp_single:
            case Policy.comp_muti:
                // 重试次数
                SimpleRetryPolicy simple = new SimpleRetryPolicy(maxRetryTimes, exceptionMap);
                // 超时重试
                TimeoutRetryPolicy policyTimeout = new TimeoutRetryPolicy();
                policyTimeout.setTimeout(timeoutRetryPolicy);

                RetryPolicy[] polices = {simple, policyTimeout};
                boolean opt = retryPolicy == Policy.comp_single?false:true;
                //策略组合
                CompositeRetryPolicy comp = new CompositeRetryPolicy();
                comp.setPolicies(polices);
                comp.setOptimistic(opt);

                p = comp;
                break;
            default:
                p = new SimpleRetryPolicy(maxRetryTimes, exceptionMap);
                break;
        }

        // 设置重试回退操作策略,主要设置重试间隔时间
        FixedBackOffPolicy backOffPolicy = new FixedBackOffPolicy();
        backOffPolicy.setBackOffPeriod(fixedPeriodTime);

        // 构建重试模板实例
        RetryTemplate retryTemplate = new RetryTemplate();
        retryTemplate.setRetryPolicy(p);
        retryTemplate.setBackOffPolicy(backOffPolicy);

        return retryTemplate;
    }

}

使用如下:


        RetryTemplate retry = RetryUtil.instance()
                .setFixedPeriodTime(1000)
                .setMaxRetryTimes(3)
                .setTimeoutRetryPolicy(25000)
                .addExceptionMap(HBaseConfNotExistException.class)
                .setRetryPolicy(RetryUtil.Policy.comp_muti)
                .build();

        retry.execute(
                //RetryCallback
                retryContext -> {
                    needretryFunc();
                    return true;
                },
                retryContext -> {
                    //RecoveryCallback
                    log.info("重试失败");
                    return false;
                }
        );

<think>好的,我现在需要回答用户关于spring-boot-starter-amqp核心类的问题。首先,我应该回忆一下自己对Spring Boot AMQP的了解。记得AMQP是高级消息队列协议,Spring Boot的starter应该是简化了与RabbitMQ的集成。用户需要核心类列表,所以得找出那些在配置、连接管理、消息监听等方面起关键作用的类。 首先想到的是自动配置类,比如RabbitAutoConfiguration,这个类应该负责自动配置连接工厂和模板。然后,RabbitProperties可能用来读取配置文件中的属性,比如主机名、端口等。接下来,连接工厂应该是CachingConnectionFactory,用于管理到RabbitMQ的连接池,提高性能。 消息发送方面,RabbitTemplate是关键,它封装了发送消息的方法。消息监听的话,可能涉及到SimpleRabbitListenerContainerFactory,用于配置监听容器。还有@RabbitListener注解,用于标记监听方法,但注解本身不是类,不过相关的支持类比如RabbitListenerAnnotationBeanPostProcessor可能需要提到。 另外,RabbitAdmin负责声明队列、交换器等AMQP元素。还有MessageConverter相关的类,如Jackson2JsonMessageConverter,用于消息的序列化和反序列化。可能需要检查是否有其他重要的类,比如Retry相关的配置类,比如RabbitRetryTemplateFactory,用于处理消息重试。 需要确保这些类确实是spring-boot-starter-amqp中的核心,而不是来自其他模块。例如,CachingConnectionFactory属于Spring AMQP,而RabbitAutoConfiguration和RabbitProperties是Spring Boot提供的。还要注意是否有遗漏的重要类,比如监听容器相关的类,如DirectMessageListenerContainer或SimpleMessageListenerContainer,但可能在starter中通过配置工厂来管理这些。 最后,要组织这些类,按照功能分组,比如配置类、连接管理、消息发送、消息监听、管理操作等。同时,确保每个类的用途描述准确,并且引用正确的引用来源,比如引用[2]提到starter的自动配置,引用[3]提到约定优于配置,这些可以帮助支持自动配置类和属性类的作用。</think>关于$spring-boot-starter-amqp$的核心类,以下是关键组件及其作用: ### 一、核心配置类 1. **$RabbitAutoConfiguration$** 自动配置AMQP核心组件,如$CachingConnectionFactory$、$RabbitTemplate$、$RabbitAdmin$等[^2][^3]。 2. **$RabbitProperties$** 封装所有$application.properties$中以$spring.rabbitmq$开头的配置项,如主机地址、端口、虚拟主机等[^3]。 ### 二、连接管理类 3. **$CachingConnectionFactory$** 实现连接池机制,管理与RabbitMQ服务器的物理连接,支持通道缓存提升性能[^2]。 ### 三、消息操作类 4. **$RabbitTemplate$** 提供$convertAndSend()$/$receiveAndConvert()$等方法,简化消息发送与接收操作[^2]。 5. **$SimpleRabbitListenerContainerFactory$** 创建消息监听容器,支持通过$@RabbitListener$注解实现消息消费的并发配置[^3]。 ### 四、管理工具类 6. **$RabbitAdmin$** 自动声明队列、交换器、绑定关系等AMQP元素,需配合$@Bean$定义的队列/交换器使用[^3]。 7. **$DirectMessageListenerContainer$** 消息监听容器的具体实现,支持动态调整消费者数量(Spring Boot 2.0+默认容器)[^2]。 ### 五、消息转换器 8. **$Jackson2JsonMessageConverter$** 默认的JSON消息序列化/反序列化工具,可通过替换$MessageConverter$自定义格式[^3]。 ### 六、注解支持 9. **$@EnableRabbit$** 启用RabbitMQ监听功能,需配合$@Configuration$使用[^3]。 ```java // 示例:声明队列与监听器 @Bean public Queue myQueue() { return new Queue("myQueue"); } @RabbitListener(queues = "myQueue") public void processMessage(String content) { // 处理消息 } ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值