为你的代码加上一层重试机制

为代码加上重试机制


1.前言:对于经常跟网络编程打交道的你来说,并不是你的每次Request,Server都会给你想要的Response。重试机制虽然并不能解决这种情况,但是却可以大大减少这种情况的发生。

2.介绍下重试机制类:RetryUtil.cs

  使用了委托,代码很短,也不难理解。

 1     public class RetryUtil
 2     {
 3         public delegate void NoArgumentHandler();
 4         /// <summary>
 5         /// retry mechanism without argument
 6         /// </summary>
 7         /// <param name="retryTimes">try times</param>
 8         /// <param name="interval">time span</param>
 9         /// <param name="throwIfFail">throw exception</param>
10         /// <param name="function">function name</param>
11         public static void Retry(int retryTimes, TimeSpan interval, bool throwIfFail, NoArgumentHandler function)
12         {
13             if (function == null)
14                 return;
15
16             for (int i = 0; i < retryTimes; ++i)
17             {
18                 try
19                 {
20                     function();
21                     break;
22                 }
23                 catch (Exception)
24                 {
25                     if (i == retryTimes - 1)
26                     {
27                         if (throwIfFail)
28                             throw;
29                         else
30                             break;
31                     }
32                     else
33                     {
34                         if (interval != null)
35                             Thread.Sleep(interval);
36                     }
37                 }
38             }
39         }
40     }

3.举例使用:Demon

  3.1 下载文件,如果出错重复尝试五次,每次间隔2秒,全部失败抛出异常。

1                 RetryUtil.Retry(5, TimeSpan.FromSeconds(2), true, delegate
2                 {
3                     WebClientUtil.DownloadFile(string.Format("{0}{1}", baseUrl, tdNewSeries), 30000, dexsrp);
4                 });

  3.2 搜索Outlook邮件,如果出错重复尝试五次,每次间隔2秒,全部失败抛出异常。

 1         public List<EmailMessage> GetSearchQueryEmailMessage(string mailbox, string subjectKeyword, DateTime startDate, DateTime endDate, string sendAddress = "", string mailFolderPath = @"Inbox", string bodyKeyword = "")
 2         {
 3             List<EmailMessage> emails = null;
 4             this.query = new EWSMailSearchQuery(sendAddress, mailbox, mailFolderPath, subjectKeyword, bodyKeyword, startDate, endDate);
 5
 6             RetryUtil.Retry(5, TimeSpan.FromSeconds(2), true, delegate
 7             {
 8                 emails = EWSMailSearchQuery.SearchMail(service, query);
 9             });
10
11             return emails;
12         }

  3.3 访问网页,如果出错重复尝试五次,每次间隔2秒,全部失败抛出异常。

1                 RetryUtil.Retry(5, TimeSpan.FromSeconds(2), true, delegate
2                 {
3                     htc = WebClientUtil.GetHtmlDocument(sourceUrl, 3000);
4                 });
时间: 2024-08-29 21:51:38

为你的代码加上一层重试机制的相关文章

Volley超时重试机制详解

Volley超时重试机制 基础用法 Volley为开发者提供了可配置的超时重试机制,我们在使用时只需要为我们的Request设置自定义的RetryPolicy即可. 参考设置代码如下: int DEFAULT_TIMEOUT_MS = 10000; int DEFAULT_MAX_RETRIES = 3; StringRequest stringRequest = new StringRequest(Request.Method.GET, url, new Response.Listener<S

Rocket重试机制,消息模式,刷盘方式

一.Consumer 批量消费(推模式) 可以通过 consumer.setConsumeMessageBatchMaxSize(10);//每次拉取10条 这里需要分为2种情况 Consumer端先启动 Consumer端后启动.   正常情况下:应该是Consumer需要先启动 注意:如果broker采用推模式的话,consumer先启动,会一条一条消息的消费,consumer后启动会才用批量消费 Consumer端先启动 1.Consumer.java package quickstart

jedis超时重试机制注意事项

最近使用redis集群进行incr操作,总是发现计数不准确,后来经过检查发现redis在执行incr超时会执行重试机制,造成计数不准确,测试代码: /** * incrf: * 将 key 中储存的数字值增一. 如果 key 不存在,那么 key 的值会先被初始化为 0 ,然后再执行 INCR 操作. 如果值包含错误的类型,或字符串类型的值不能表示为数字,那么返回一个错误. 本操作的值限制在 64 位(bit)有符号数字表示之内. 这是一个针对字符串的操作,因为 Redis 没有专用的整数类型,

PHP-RESQUE重试机制

因为PHP-Resque 的重试需要自己写,网上又没啥轮子,而且resque也很久不更新了,所以自己研究下resque的源码,然后也借鉴了Laravel的队列重试机制,实现了PHP-Resque的重试机制. 设计思路 阅读resque源码,我们知道,resque把失败的队列的数据都放在了resque:failed列表,数据如下. 我的项目是在yii2下统一处理resque的,我直接resque源码在新增了retry方法,在每一个failJob的payload增加了attempts尝试次数,一开始

SpringCloud | FeignClient和Ribbon重试机制区别与联系

在spring cloud体系项目中,引入的重试机制保证了高可用的同时,也会带来一些其它的问题,如幂等操作或一些没必要的重试. 今天就来分别分析一下 FeignClient 和 Ribbon 重试机制的实现原理和区别,主要分为三点: 1)FeignClient重试机制分析 2)Ribbon重试机制分析 3)FeignClient和Ribbon重试机制的区别于联系 1)FeignClient 重试机制分析: FeignClient 重试机制的实现原理相对简单.首先看一下feignClient处理请

nginx的重试机制以及nginx常用的超时配置说明

nginx的重试机制 现在对外服务的网站,很少只使用一个服务节点,而是部署多台服务器,上层通过一定机制保证容错和负载均衡. nginx就是常用的一种HTTP和反向代理服务器,支持容错和负载均衡. nginx的重试机制就是容错的一种. 在nginx的配置文件中,proxy_next_upstream项定义了什么情况下进行重试,官网文档中给出的说明如下:--------------------- Syntax: proxy_next_upstream error | timeout | invali

HBase客户端Rpc的重试机制以及客户端参数优化。

hbase客户端重试机制如何保证系统的容错性和低延迟性HBase客户端Rpc的重试机制以及客户端参数优化.HBase客户端基于退避算法的重试机制1.业务用户一方面比较关注HBase本身服务的读写性能:吞吐量以及读写延迟,2.另一方面也会比较关注HBase客户端使用上的问题,主要集中在两个方面:是否提供了重试机制来保证系统操作的容错性?是否有必要的超时机制保证系统能够fastfail,保证系统的低延迟特性?3.HBase客户端提供的重试机制,并通过配置合理的参数使得客户端在保证一定容错性的同时还能

RocketMQ(5)---RocketMQ重试机制

RocketMQ重试机制 消息重试分为两种:Producer发送消息的重试 和 Consumer消息消费的重试. 一.Producer端重试 Producer端重试是指: Producer往MQ上发消息没有发送成功,比如网络原因导致生产者发送消息到MQ失败. 看一下代码: @Slf4j public class RocketMQTest { /** * 生产者组 */ private static String PRODUCE_RGROUP = "test_producer"; pub

给协程加上同步互斥机制

前面一篇文章介绍了Linux内的同步互斥的概念.内核态和用户态Linux提供的同步/互斥接口.这里本文介绍下如何给协程加上同步.互斥机制. 简单说下协程coroutine: 参考文章 操作系统的课本中对进程.线程的定义:进程是最小的资源分配单位,线程是最小的调度单位. 随着互联网的飞速发展,互联网后台Server服务通常要面临高请求.高并发的挑战,一些业务Server通常要面临很高的网络IO请求.这也就是C10K问题. 现在对C10K问题的解决方案已经很成熟了,主要是 非阻塞IO+IO复用(ep