【转】java调度器(重试机制)实现

【转】http://blog.youkuaiyun.com/prime7/article/details/49837517

调度器分为正常调度,异常调度,异常调度根据不同的队列进行时间间隔的区分,采用ScheduledExecutorService进行时间间隔调度,调度时根据当前队列中addData进队列里的数据分配线程进行处理。先看正常调度,这个类在构造函数时就会被调度,可以添加set方法,配置好单独再进行scheduler:

 

[java]  view plain  copy
 
  1. package test;  
  2.   
  3. import java.util.ArrayList;  
  4. import java.util.List;  
  5. import java.util.concurrent.BlockingQueue;  
  6. import java.util.concurrent.Callable;  
  7. import java.util.concurrent.ExecutionException;  
  8. import java.util.concurrent.ExecutorService;  
  9. import java.util.concurrent.Executors;  
  10. import java.util.concurrent.Future;  
  11. import java.util.concurrent.LinkedBlockingQueue;  
  12. import java.util.concurrent.ScheduledExecutorService;  
  13. import java.util.concurrent.TimeUnit;  
  14.   
  15. /** 
  16.  * 异步任务定时执行管理 
  17.  */  
  18. public abstract class AbstractScheduleTask<T> implements ScheduleTask<T> {  
  19.   
  20.     /** 任务队列 */  
  21.     protected final BlockingQueue<T> dataQueue;  
  22.     /** 线程池 */  
  23.     protected final ExecutorService executorService;  
  24.     /** 调度任务 */  
  25.     protected final ScheduledExecutorService scheduledExecutorService;  
  26.     /** 定时任务数 */  
  27.     private int scheduleSize = 1;  
  28.     /** 定时任务开始执行时间 */  
  29.     private int scheduleInitialDelay = 0;  
  30.     /** 定时任务间隔时间,正常单条数据的插入时间<3ms,队列的长度为1000,1000m秒的时间足够,避免队列的数据堆积 */  
  31.     private int scheduleDelay = 1000;  
  32.     /** 线程池大小 */  
  33.     private int threadPoolSize = 8;  
  34.     /** 队列大小 */  
  35.     private int queueSize = 2000;  
  36.     /** 线程批处理大小; */  
  37.     private int dataSize = 100;  
  38.   
  39.     /** 默认构造方法,加载定时任务 */  
  40.     public AbstractScheduleTask() {  
  41.         dataQueue = new LinkedBlockingQueue<T>(queueSize);  
  42.         executorService = Executors.newFixedThreadPool(threadPoolSize);  
  43.         scheduledExecutorService = Executors.newScheduledThreadPool(scheduleSize);  
  44.         schedule();  
  45.     }  
  46.   
  47.     /** 
  48.      * 具体业务数据处理 
  49.      *  
  50.      * @param data 
  51.      * @return 
  52.      */  
  53.     protected abstract Integer doData(final List<T> data);  
  54.   
  55.     /** 
  56.      * 添加数据到队列 
  57.      */  
  58.     @Override  
  59.     public void addData(T parameterObject) {  
  60.         if (parameterObject != null) {  
  61.             if (dataQueue.size() >= this.getQueueSize()) {  
  62.                 // 消费队列数据过大  
  63.             }  
  64.             try {  
  65.                 dataQueue.put(parameterObject);  
  66.             } catch (InterruptedException e) {  
  67.                 // 添加队列数据异常  
  68.             }  
  69.         }  
  70.     }  
  71.   
  72.     /** 
  73.      * 设置定时任务 设定执行线程计划,初始10s延迟,每次任务完成后延迟10s再执行一次任务 
  74.      */  
  75.     private void schedule() {  
  76.         for (int i = 0; i < scheduleSize; i++) {  
  77.             scheduledExecutorService.scheduleWithFixedDelay(new ScheduleHandler(), scheduleInitialDelay, scheduleDelay,  
  78.                     TimeUnit.MILLISECONDS);  
  79.         }  
  80.   
  81.     }  
  82.   
  83.     /** 
  84.      * 创建任务 
  85.      *  
  86.      * @param data 
  87.      * @return 
  88.      */  
  89.     private Callable<Integer> getTask(final List<T> data) {  
  90.         Callable<Integer> task = new Callable<Integer>() {  
  91.   
  92.             @Override  
  93.             public Integer call() throws Exception {  
  94.                 if (data == null) {  
  95.                     return 0;  
  96.                 }  
  97.                 try {  
  98.                     int result = doData(data);  
  99.                     // 任务执行完成  
  100.                     return result;  
  101.                 } catch (Throwable e) {  
  102.                     // 执行任务出现异常  
  103.                 }  
  104.                 return 0;  
  105.             }  
  106.         };  
  107.   
  108.         return task;  
  109.     }  
  110.   
  111.     /** 
  112.      * 定时任务 
  113.      */  
  114.     private final class ScheduleHandler implements Runnable {  
  115.         /** 
  116.          * 定时任务实现 
  117.          *  
  118.          * @see java.lang.Runnable#run() 
  119.          */  
  120.         public void run() {  
  121.             List<T> dataList = new ArrayList<T>(dataSize);  
  122.             while (!dataQueue.isEmpty()) {  
  123.                 if (dataList.size() == dataSize) {  
  124.                     break;  
  125.                 }  
  126.                 try {  
  127.                     T data = dataQueue.take();  
  128.                     dataList.add(data);  
  129.                 } catch (InterruptedException e) {  
  130.                     // 出队列执行异常  
  131.                 }  
  132.             }  
  133.             Callable<Integer> task = getTask(dataList);  
  134.             if (task == null) {  
  135.                 return;  
  136.             }  
  137.             Future<Integer> future = executorService.submit(task);  
  138.             try {  
  139.                 int result = future.get();  
  140.                 // 任务执行结果: result  
  141.             } catch (InterruptedException e) {  
  142.                 // 任务执行异常  
  143.             } catch (ExecutionException e) {  
  144.                 // 任务执行异常  
  145.             }  
  146.         }  
  147.   
  148.     }  
  149.   
  150.     /** 
  151.      * Getter method for property <tt>scheduleSize</tt>. 
  152.      *  
  153.      * @return property value of scheduleSize 
  154.      */  
  155.     public int getScheduleSize() {  
  156.         return scheduleSize;  
  157.     }  
  158.   
  159.     /** 
  160.      * Getter method for property <tt>scheduleInitialDelay</tt>. 
  161.      *  
  162.      * @return property value of scheduleInitialDelay 
  163.      */  
  164.     public int getScheduleInitialDelay() {  
  165.         return scheduleInitialDelay;  
  166.     }  
  167.   
  168.     /** 
  169.      * Getter method for property <tt>scheduleDelay</tt>. 
  170.      *  
  171.      * @return property value of scheduleDelay 
  172.      */  
  173.     public int getScheduleDelay() {  
  174.         return scheduleDelay;  
  175.     }  
  176.   
  177.     /** 
  178.      * Getter method for property <tt>threadPoolSize</tt>. 
  179.      *  
  180.      * @return property value of threadPoolSize 
  181.      */  
  182.     public int getThreadPoolSize() {  
  183.         return threadPoolSize;  
  184.     }  
  185.   
  186.     /** 
  187.      * Getter method for property <tt>queueSize</tt>. 
  188.      *  
  189.      * @return property value of queueSize 
  190.      */  
  191.     public int getQueueSize() {  
  192.         return queueSize;  
  193.     }  
  194.   
  195.     /** 
  196.      * Getter method for property <tt>dataSize</tt>. 
  197.      *  
  198.      * @return property value of dataSize 
  199.      */  
  200.     public int getDataSize() {  
  201.         return dataSize;  
  202.     }  
  203. }  


实现的添加数据接口的定义:

 

 

[java]  view plain  copy
 
  1. package test;  
  2.   
  3. /** 
  4.  * 任务定时执行管理器 
  5.  */  
  6. public interface ScheduleTask<T> {  
  7.   
  8.     /** 
  9.      * 添加数据 
  10.      *  
  11.      * @param parameterObject 
  12.      */  
  13.     public void addData(final T parameterObject);  
  14.   
  15. }  


再来看一下 实现带有重试机制的调度器,不同的重试机制使用不同的调度队列

 

 

[java]  view plain  copy
 
  1. package test;  
  2.   
  3. import java.util.ArrayList;  
  4. import java.util.List;  
  5. import java.util.concurrent.BlockingQueue;  
  6. import java.util.concurrent.Callable;  
  7. import java.util.concurrent.ExecutionException;  
  8. import java.util.concurrent.Executors;  
  9. import java.util.concurrent.Future;  
  10. import java.util.concurrent.LinkedBlockingQueue;  
  11. import java.util.concurrent.ScheduledExecutorService;  
  12. import java.util.concurrent.TimeUnit;  
  13.   
  14. /** 
  15.  * 重试调度器 
  16.  *  
  17.  * @author prime7 
  18.  */  
  19. public abstract class AbstractRetryScheduleTask<T> extends AbstractScheduleTask<T> implements RetryScheduleTask<T> {  
  20.   
  21.     /** 重试调度模式,供外部添加调用 */  
  22.     public static final int RETRY_MODE_30S = 1;  
  23.     public static final int RETRY_MODE_5MIN = 2;  
  24.     public static final int RETRY_MODE_30MIN = 3;  
  25.   
  26.     /** 重试任务队列 */  
  27.     protected final BlockingQueue<T> retryDataQueue30S;  
  28.     protected final BlockingQueue<T> retryDataQueue5Min;  
  29.     protected final BlockingQueue<T> retryDataQueue30Min;  
  30.   
  31.     /** 重试调度任务 */  
  32.     protected final ScheduledExecutorService retryScheduledExecutorService;  
  33.     /** 重试定时任务数 */  
  34.     private int retryScheduleSize = 3;  
  35.     /** 重试定时任务开始执行时间 */  
  36.     private int retryScheduleInitialDelay = 0;  
  37.     /** 重试任务间隔时间 */  
  38.     private int retryScheduleDelay30S = 1000; // 30 * 1000;  
  39.     private int retryScheduleDelay5Min = 5000; // 5 * 60 * 1000;  
  40.     private int retryScheduleDelay30Min = 10000; // 30 * 60 * 1000;  
  41.     /** 队列大小 */  
  42.     private int retryQueueSize = 2000;  
  43.     /** 线程批处理大小; */  
  44.     private int retryDataSize = 100;  
  45.   
  46.     public AbstractRetryScheduleTask() {  
  47.         super();  
  48.         // LinkedBlockingQueue is Thread safety.  
  49.         retryDataQueue30S = new LinkedBlockingQueue<T>(retryQueueSize);  
  50.         retryDataQueue5Min = new LinkedBlockingQueue<T>(retryQueueSize);  
  51.         retryDataQueue30Min = new LinkedBlockingQueue<T>(retryQueueSize);  
  52.         retryScheduledExecutorService = Executors.newScheduledThreadPool(retryScheduleSize);  
  53.         schedule();  
  54.     }  
  55.   
  56.     private void schedule() {  
  57.         // init 30s retry scheduler.  
  58.         retryScheduledExecutorService.scheduleWithFixedDelay(new RetryScheduleHandler(retryDataQueue30S),  
  59.                 retryScheduleInitialDelay, retryScheduleDelay30S, TimeUnit.MILLISECONDS);  
  60.         // init 5min retry scheduler.  
  61.         retryScheduledExecutorService.scheduleWithFixedDelay(new RetryScheduleHandler(retryDataQueue5Min),  
  62.                 retryScheduleInitialDelay, retryScheduleDelay5Min, TimeUnit.MILLISECONDS);  
  63.         // init 30min retry scheduler.  
  64.         retryScheduledExecutorService.scheduleWithFixedDelay(new RetryScheduleHandler(retryDataQueue30Min),  
  65.                 retryScheduleInitialDelay, retryScheduleDelay30Min, TimeUnit.MILLISECONDS);  
  66.     }  
  67.   
  68.     /** 
  69.      * 具体业务重试数据处理 
  70.      *  
  71.      * @param data 
  72.      * @return 
  73.      */  
  74.     protected abstract Integer doRetryData(final List<T> data);  
  75.   
  76.     private final class RetryScheduleHandler implements Runnable {  
  77.         /** 
  78.          * 定时任务实现 
  79.          *  
  80.          * @see java.lang.Runnable#run() 
  81.          */  
  82.         private BlockingQueue<T> dataQueue;  
  83.   
  84.         public RetryScheduleHandler(BlockingQueue<T> retryQueue) {  
  85.             dataQueue = retryQueue;  
  86.         }  
  87.   
  88.         public void run() {  
  89.             List<T> dataList = new ArrayList<T>(retryDataSize);  
  90.             while (!dataQueue.isEmpty()) {  
  91.                 if (dataList.size() >= retryDataSize)  
  92.                     break;  
  93.                 try {  
  94.                     T data = dataQueue.take();  
  95.                     dataList.add(data);  
  96.                 } catch (InterruptedException e) {  
  97.                     // LogUtil.error(logger, e, "出队列执行异常!");  
  98.                 }  
  99.             }  
  100.   
  101.             Callable<Integer> task = getRetryTask(dataList);  
  102.             if (task == null)  
  103.                 return;  
  104.             Future<Integer> future = executorService.submit(task);  
  105.             try {  
  106.                 int result = future.get();  
  107.                 // LogUtil.info(logger, "任务执行结果:" + result);  
  108.             } catch (InterruptedException e) {  
  109.                 // LogUtil.error(logger, e, "任务执行异常!");  
  110.             } catch (ExecutionException e) {  
  111.                 // LogUtil.error(logger, e, "任务执行异常!");  
  112.             }  
  113.         }  
  114.     }  
  115.   
  116.     /** 
  117.      * 创建任务 
  118.      *  
  119.      * @param data 
  120.      * @return 
  121.      */  
  122.     private Callable<Integer> getRetryTask(final List<T> data) {  
  123.         Callable<Integer> task = new Callable<Integer>() {  
  124.             @Override  
  125.             public Integer call() throws Exception {  
  126.                 if (data == null) {  
  127.                     return 0;  
  128.                 }  
  129.                 try {  
  130.                     int result = doRetryData(data);  
  131.                     return result;  
  132.                 } catch (Throwable e) {  
  133.                     // LogUtil.error(logger, e, "执行任务异常");  
  134.                 }  
  135.                 return 0;  
  136.             }  
  137.         };  
  138.         return task;  
  139.     }  
  140.   
  141.     /** 
  142.      * 添加数据到队列 
  143.      *  
  144.      * @see com.alipay.csCheck.biz.bench.schedule.ScheduleTask#addData(java.lang.Object) 
  145.      */  
  146.     @Override  
  147.     public void addRetryData(T parameterObject, int retryMode) {  
  148.         switch (retryMode) {  
  149.         case RETRY_MODE_30S:  
  150.             addRetryDateForQueue(parameterObject, retryDataQueue30S);  
  151.             break;  
  152.         case RETRY_MODE_5MIN:  
  153.             addRetryDateForQueue(parameterObject, retryDataQueue5Min);  
  154.             break;  
  155.         case RETRY_MODE_30MIN:  
  156.             addRetryDateForQueue(parameterObject, retryDataQueue30Min);  
  157.             break;  
  158.         default: // never reach here.  
  159.             break;  
  160.         }  
  161.     }  
  162.   
  163.     /** 
  164.      * 按照对应模式添加重试数据到对应队列 
  165.      *  
  166.      * @param parameterObject 
  167.      * @param retryDataQueue 
  168.      */  
  169.     private void addRetryDateForQueue(T parameterObject, final BlockingQueue<T> retryDataQueue) {  
  170.         if (parameterObject != null) {  
  171.             if (retryDataQueue.size() >= this.getQueueSize()) {  
  172.                 // LogUtil.warn(logger, "消费队列数据过大!!!!");  
  173.   
  174.             }  
  175.             try {  
  176.                 retryDataQueue.put(parameterObject);  
  177.             } catch (InterruptedException e) {  
  178.                 // LogUtil.warn(logger, "添加队列数据异常!!!!", e.getMessage());  
  179.             }  
  180.         }  
  181.     }  
  182. }  

 

[java]  view plain  copy
 
  1. package test;  
  2.   
  3. /** 
  4.  * 任务定时执行管理器 包含重试任务 
  5.  *  
  6.  * @author prime7 
  7.  */  
  8. public interface RetryScheduleTask<T> extends ScheduleTask<T> {  
  9.   
  10.     /** 
  11.      * 添加重试数据 
  12.      *  
  13.      * @param parameterObject 
  14.      */  
  15.     public void addRetryData(T parameterObject, int retryMode);  
  16.   
  17. }  


最后 写个测试类进行一下测试:

 

 

[java]  view plain  copy
 
  1. package test;  
  2.   
  3. import java.util.Date;  
  4. import java.util.List;  
  5.   
  6. public class TestScheduler extends AbstractRetryScheduleTask<Integer> {  
  7.   
  8.     public static void main(String[] args) {  
  9.         TestScheduler test = new TestScheduler();  
  10.         test.addData(0);  
  11.         test.addRetryData(1, TestScheduler.RETRY_MODE_30S);  
  12.         test.addRetryData(2, TestScheduler.RETRY_MODE_5MIN);  
  13.         test.addRetryData(3, TestScheduler.RETRY_MODE_30MIN);  
  14.         test.addData(0);  
  15.         test.addRetryData(1, TestScheduler.RETRY_MODE_30S);  
  16.         test.addRetryData(2, TestScheduler.RETRY_MODE_5MIN);  
  17.         test.addRetryData(3, TestScheduler.RETRY_MODE_30MIN);  
  18.         try {  
  19.             System.out.println("now sleep");  
  20.             Thread.sleep(10 * 1000);  
  21.             System.out.println("now weakup");  
  22.             test.addData(0);  
  23.             test.addRetryData(1, TestScheduler.RETRY_MODE_30S);  
  24.             test.addRetryData(2, TestScheduler.RETRY_MODE_5MIN);  
  25.             test.addRetryData(3, TestScheduler.RETRY_MODE_30MIN);  
  26.         } catch (InterruptedException e) {  
  27.             e.printStackTrace();  
  28.         }  
  29.     }  
  30.   
  31.     @Override  
  32.     protected Integer doRetryData(List<Integer> data) {  
  33.         return doData(data);  
  34.     }  
  35.   
  36.     @Override  
  37.     protected Integer doData(List<Integer> data) {  
  38.         System.out.println(data + " " + new Date().getTime());  
  39.         return 1;  
  40.     }  
  41. }  
【AHC】HttpAsyncClient 的重试需手动实现,AHC 的重试是否更易用? 文章摘要: async-http-client与HttpAsyncClient的重试机制存在本质差异。async-http-client虽然API看似简单,但其重试是立即执行的硬编码实现,缺乏延迟调度能力,容易引发系统雪崩。HttpAsyncClient虽需手动实现重试,但通过I/O Reactor模型提供了更精细的控制权。真正的易用性应体现在资源管理、线程模型和故障隔离能力上,而非表面的API简洁度。生产环境中,建议对async-http-client进行二次封装,或直接使用HttpAsyncClient 阅读详情

相关推荐

精通DC-DC变换器:Boost升压电路全解析

Boost升压变换器是一种将低直流电压转换为高直流电压的常用电路。其核心工作原理是通过电感储能:开关导通时电感充电,关断时电感与电源串联向负载供电。关键公式表明输出电压Vo=Vi/(1-D),占空比D越大,升压比越高。变换器工作时会产生电感电流纹波和输出电压纹波,需合理选择电感和电容参数。开关管和二极管需承受完整的输出电压,对元器件选型要求较高。理解这些原理是设计高效升压电源的基础。

2511_92918351的博客 3707

Java轻量延迟重试队列实现

很多开放平台都使用Webhook的方式进行外部系统数据同步或者通知,对于Webhook请求的对外发送不进行重试显然有点说不过去。使用简单的while一个条件去重试N次好像达不到什么效果,只能是说有重试而已,而使用消息队列中间件好像依赖又太重,于是索性自己动手写一个抽象范型延迟重试队列组件。

bossfriday - 个人博客 1352

VS2022下C# WPF项目一键打包成独立exe的完整指南

本文提供了一份在Visual Studio 2022中将C# WPF项目一键打包成独立可执行exe文件的完整指南。通过配置项目属性、启用单文件发布和自包含模式,开发者无需依赖第三方工具,即可生成可在未安装.NET运行时的电脑上直接运行的独立程序,极大简化了桌面应用的分发流程。

weixin_28831399的博客 670

Java重试的几种写法

在开发Java应用程序时,经常需要处理一些可能失败的操作,例如数据库连接、网络请求等。为了增加程序的健壮性和容错性,我们可以使用重试机制来尝试多次执行失败的操作。

果酱 の 博客 2606

动态库加载失败终极指南:从libbz2.so.1错误看Linux依赖管理本质

本文以经典的libbz2.so.1加载错误为例,深入剖析Linux动态链接库管理的核心机制。文章不仅提供从ldd检查、符号链接创建到LD_LIBRARY_PATH设置等实战解决方案,更系统性地讲解了动态链接器的寻库路径、版本管理及依赖问题预防策略,帮助开发者从根本上理解和掌握Linux依赖管理本质。

weixin_29212429的博客 447

Java 大视界 -- Java+Spark MLlib 构建智能推荐系统:协同过滤算法实战与优化(441)

Java+Spark MLlib构建智能推荐系统实战 本文详细介绍了基于Java和Spark MLlib构建协同过滤推荐系统的全流程实践方案。主要内容包括: 架构设计:采用离线批处理为主、近实时更新为辅的架构,包含数据采集层、处理层、模型层、推荐生成层、存储层和应用层六大模块,可支撑千万级用户推荐需求。 技术实现: 使用Spark MLlib的ALS算法进行协同过滤模型训练 提供数据清洗、模型训练、推荐生成等核心代码实现 采用MySQL存储推荐结果,支持批量插入和事务保障 生产级优化: 版本化模型存储规避覆

【青云交】华为云云享专家 | 阿里云开发者社区专家博主 技术圈个人影响力前 9 | 博客之星 TOP12 优快云 首位四榜(原力榜 / 作者周榜 / 领军人物 / 综合热榜)榜首,破平台纪录! 苏州地区全榜霸榜,感恩全网十多万粉丝同行! 2533

java重试机制实现方案

上面介绍了几种常见重试机制的实现方法以及两种成熟的重试组件,除了定时任务重试,其余的方案他们都存在一个共同的问题,就是当服务器宕机或者其他情况导致方法没有进行重试。在一些一定要进行重试补偿的场景中,上述方案无法保证方法一定进行重试,可以将重试数据持久化,通过定时任务+重试组合解决这个问题。

t194978的博客 2963

DMA engine initialization failed rk3568的原因及解决方案

刚开始调试 switch 芯片的时候由于rgmii 时钟是output , rk3568的 GMAC 需要 switch 芯片提供 125M的时钟,如果没有这个时钟就会初始化失败,进入文件系统后 ethx 不会出现(当然,如果屏蔽掉这里ethx 会出现,但是引发更多的问题,笔者在这块耍小聪明,导致耗费了近一个月时间,把网络这块整个查了一遍 -----)dma 软复位是在进入文件系统后,网络系统启动的时候,我想如果在这个之前只要提供合适的时钟那么就是可以的,那么------以上是官方的文档说明。

Nyiragongo的博客 4573

Java 实现间隔重试(一)

实现类似于支付宝或微信在回调第三方接口时,出错间隔重试的功能。例如:25小时以内完成8次通知(通知的间隔频率一般是:4m,10m,10m,1h,2h,6h,15h);思前想后提出了一下几个方案:1.推送信息记录到表中,定时器触发重推推送失败的数据 优点:实现简单 缺点:实现不了单条数据间隔重推,批量推送服务器IO在短时间内压力大2.使用多线程,将推送失败的数据放入queue中,线程轮询...

木子李的博客 5053

UG\NX二次开发 获取对象的层、颜色、隐藏状态、线宽、线型、高亮显示状态

获取对象的层、颜色、隐藏状态、线宽、线型、高亮显示状态。

王牌飞行员_里海的博客 1981

硬件工程师笔记——电子器件汇总大全

本文系统总结了14种常用电子器件的工作原理及功能应用,包括电阻、压敏电阻、电容、电感、二极管、三极管、MOS管、晶振、光耦、IGBT、继电器、磁珠、可控硅和线性稳压器。每种器件从结构原理、工作特性到典型应用进行全面解析,如电阻的限流分压、电容的储能滤波、三极管的放大开关等。重点阐述了各器件在电路设计中的关键作用,如IGBT的功率控制、继电器的隔离保护、LDO的电压稳定等,并提供了实际电路应用案例。文章还整理了硬件工程师笔试面试相关的知识点和真题资源,为电子工程师提供全面的技术参考。

XU157303764的博客 2万+

使用Java和Spring Retry实现重试机制

通过使用Spring Retry,我们可以在Java应用中轻松实现重试机制,处理临时性故障,提升系统的稳定性和容错能力。Spring Retry是Spring框架的一部分,它提供了一种通用的重试机制,用于处理暂时性错误。Spring Retry允许在发生失败时自动重试操作,支持自定义重试策略、回退策略以及重试次数等配置。Spring Retry允许灵活配置重试策略,包括最大重试次数、重试间隔等。在此示例中,重试监听器提供了在重试操作开始、结束和出错时的回调方法。,它允许在代码中显式地配置和控制重试逻辑。

微赚淘客开发者博客 1924

11、牛转录组分析的实用生物信息学流程

本文详细介绍了一套实用的牛转录组分析生物信息学流程,涵盖从数据提取、基因组索引生成、读取比对到单样本表达分析及差异表达分析的完整步骤。使用Angus和Brahman牛的RNA-seq数据作为示例,介绍了HTSEQ、featureCounts和StringTie等工具在基因表达计数中的应用,并结合edgeR和limma进行差异表达分析。文中提供了详细的命令行与R代码示例,包含常见问题解答与关键注意事项,帮助研究人员高效、准确地完成转录组数据分析。

ios99的博客 111

java调度器(重试机制)实现

调度器分为正常调度,异常调度,异常调度根据不同的队列进行时间间隔的区分,采用ScheduledExecutorService进行时间间隔调度,调度时根据当前队列中addData进队列里的数据分配线程进行处理。先看正常调度,这个类在构造函数时就会被调度,可以添加set方法,配置好单独再进行scheduler: package test; import java.util.ArrayList; i

韩小侠的专栏 已迁移至lssea.com 1万+

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Java批处理调度_java调度器(重试机制)实现

调度器分为正常调度,异常调度,异常调度根据不同的队列进行时间间隔的区分,采用ScheduledExecutorService进行时间间隔调度,调度时根据当前队列中addData进队列里的数据分配线程进行处理。先看正常调度,这个类在构造函数时就会被调度,可以添加set方法,配置好单独再进行scheduler:package test;import java.util.ArrayList;import...

weixin_34711401的博客 719

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

重试机制与 CompletableFuture 拓展

Spring Retry 实现了有状态的重试,很多方法需要显式传参数 RetryContext,有多种 RetryContext 支持,RetrySynchronizationManager 提供了全局 RetryContext 上下文支持,底层使用 ThreadLocal,提供获取上下文、注册上下文等方法。以下是一个常见的使用异步重试的例子,当我们需要重试功能时,只需调用 retry 方法,传入相应的重试策略即可。从结果可以看出,实现了延迟重试,重试等待时间为 500ms,三次尝试后获取到了正确结果。

weixin_38779145的博客 789

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

java实现调度器(附带源码)

java实现调度器(附带源码)

欢迎来到我的博客!这里是一个专注于计算机技术的分享平台,涵盖编程开发、算法研究、系统架构、软件工程等多个领域。无论你是初学者还是资深开发者,都能在这里找到有价值的内容。 1312

Java: xxl-job调度器线程池机制

xxl-job调度器采用双线程池设计优化高频任务处理: 1️⃣ 快慢线程池分离 快线程池处理短任务(≤500ms),默认核心线程10,队列1000 慢线程池处理长任务,自动降级超时任务,队列2000 2️⃣ 动态降级机制 1分钟内超时10次的任务自动降级到慢线程池,避免阻塞正常任务 3️⃣ 配置建议 高频场景可扩容快线程池(默认最大200线程) I/O密集型任务建议增大队列容量 该设计通过资源隔离和异步处理,单机理论支持5000+任务并发,显著提升调度稳定性。实际部署需结合业务监控调整参数。

xyzroundo的专栏 1740

【一文系列】一篇文章说明指数退避算法以及使用Java语言的实现

网络通信中数据传输的成功和效率是至关重要的。然而,由于各种原因,如网络拥塞、服务器负载等,数据传输可能会面临一些挑战,其中之一就是传输失败。当数据传输失败时,为了确保数据的可靠性和完整性,最容易想到的解决方案就是使用重试机制但是,简单地使用固定时间间隔进行重试可能会导致进一步的冲突和拥塞,降低整体的通信效率。在这种情况下,`指数退避算法`(Exponential Backoff Algorithm)应运而生,本文将深入探讨指数退避算法的原理、步骤、应用场景,并提供使用Java语言实现指数退避算法的示例代。

sinat_15027475的博客 1135

Kafka消费重试机制深度解析:从原理到实战避坑指南

在分布式消息系统中,消息的可靠传递与消费是核心挑战之一。其原理在于通过消费者位移管理、重试机制与死信队列等技术组合,确保消息不丢失、不重复。这一技术价值在于平衡系统可用性与数据一致性,是构建高可靠异步解耦架构的基石。典型应用场景包括订单处理、日志收集和实时数据管道等,其中消息处理失败后的重试策略尤为关键。本文聚焦于Kafka消费链路中的重试机制,特别是针对常见的“重试10次”现象,深入剖析其背后可能涉及的Spring-Kafka框架配置、业务代码循环以及外部客户端重试等多层叠加逻辑,并提供配置优化与异步重试

weixin_33896726的博客 514

AI 判题服务的容错设计:模型推理超时后的自动重试与结果合并策略

判题服务的容错设计,核心不是保证每次调用都成功——这在大模型服务中是不现实的。真正的目标是用合理的成本,让不可靠的底层服务对外表现出可接受的可靠程度。重试机制是基础,但需要配合退避、超时和异常分类才能发挥作用。多模型竞速是兜底,但要权衡一致性和成本。这些设计思路不只适用于判题场景,任何依赖外部不稳定服务的系统,都可以借鉴其中的容错模式。

cannonjinx的博客 4751

告别超时噩梦:Resilience4j异步重试让CompletableFuture稳如泰山

你是否遇到过这样的情况:支付接口偶发超时却无人处理,消息推送因网络波动丢失关键通知,文件上传因瞬时错误导致用户重复操作?在分布式系统中,这些"偶发"故障往往会演变成线上事故。本文将带你用Resilience4j构建企业级异步重试机制,通过CompletableFuture实现零阻塞的故障恢复策略,让你的服务在不稳定的网络环境中依然可靠。 读完本文你将掌握: - 如何用3行代码为异步任务添加智能重...

gitblog_00033的博客 1022

深入理解Dubbo-8.Dubbo的失败重试设计

时间轮这个技术其实出来很久了,在kafka、zookeeper等技术中都有时间轮使用的方式。什么是时间轮呢?简单来说:时间轮是一种高效利用线程资源进行批量化调度的一种调度模型。把大批量的调度任务全部绑定到同一个调度器上,使用这一个调度器来进行所有任务的管理、触发、以及运行。所以时间轮的模型能够高效管理各种延时任务、周期任务、通知任务。在工作中遇到类似的功能,可以采用时间轮机制。

爱吃知识的土豆倪的博客 1581

从零手写一个 Java Agent Skill 调度器:解析 Function Calling 协议与动态代理实战

在 Java 生态中,LangChain4j 和 Spring AI 已经非常成熟。只需几个注解,就能让大模型调用本地方法。黑盒焦虑:当@Tool不起作用时,是因为参数类型不匹配?还是描述写得不好?由于框架封装太深,调试起来如同盲人摸象。性能瓶颈:框架为了通用性,引入了大量的反射缓存、序列化开销。在高并发场景下,这些开销是否成为了瓶颈?定制受限:我想实现一个特殊的技能路由逻辑(例如:根据用户等级动态屏蔽某些技能),框架的标准接口却难以扩展。依赖沉重。

caijigskg的博客 1005

Azkaban调度器

工作流 1、工作流产生背景 工作流(Workflow),指“业务过程的部分或整体在计算机应用环境下的自动化”。是对工作流程及其各操作步骤之间业务规则的抽象、概括描述。工作流解决的主要问题是:为了实现某个业务目标,利用计算机软件在多个参与者之间按某种预定规则自动传递文档、信息或者任务。 一个完整的数据分析系统通常都是由多个前后依赖的模块组合构成的:数据采集、数据预处理、数据分析、数据展示等。各...

依旧的博客 3973
上一篇: css图片等比例缩放
下一篇: 【转】避免误用 Redis
ln_software
博客等级 码龄17年 3粉丝 60原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值