{"id":29,"date":"2017-04-12T22:55:48","date_gmt":"2017-04-12T22:55:48","guid":{"rendered":"http:\/\/www.matez.de\/?p=29"},"modified":"2017-04-12T22:55:48","modified_gmt":"2017-04-12T22:55:48","slug":"exploring-feign-retrying","status":"publish","type":"post","link":"https:\/\/www.matez.de\/index.php\/2017\/04\/12\/exploring-feign-retrying\/","title":{"rendered":"Exploring Feign &#8211; Retrying"},"content":{"rendered":"<p><a href=\"https:\/\/github.com\/OpenFeign\/feign\">Feign<\/a> is a library, which makes it easier to implement a http client. Recently more and more people start writing http clients, because they are creating microservices which communicate with http protocol. So there are all sorts of libraries supporting this task like Jersey, Resteasy and others &#8211; and there is Feign.<\/p>\n<p>Today I do not want to explain the basic functionality, this is all done on the <a href=\"https:\/\/github.com\/OpenFeign\/feign\/blob\/master\/README.md\">Readme <\/a>page itself. Today I want to get into the details of a feature, which becomes more and more important, because in modern distributed systems, you want to have resilient behaviour, which means that you want to design your service in the way, that it can handle unexpected situations without noticing on user&#8217;s site. For example an API you are calling is not reachable at the moment, the request times out or the requested resource is not yet available. To solve this issue, you need to apply a retry pattern, so that you increase the chance that the service request is successfull after the first, the second or the nth attempt.<\/p>\n<p>What most developers don&#8217;t know, Feign has a default retryer built-in.<\/p>\n<p>Now I show\u00a0a few code examples, what you can expect from this feature. What I am showing are junit tests with a client mock, so that we are able to stub certain errors and verify, how many retries have been made.<\/p>\n<h2>Case 1) Success<\/h2>\n<p>no retry needed.<\/p>\n<!DOCTYPE html PUBLIC \"-\/\/W3C\/\/DTD HTML 4.0 Transitional\/\/EN\" \"http:\/\/www.w3.org\/TR\/REC-html40\/loose.dtd\">\n<html><body><div id=\"gist46646474\" class=\"gist\">\n    <div class=\"gist-file\" translate=\"no\" data-color-mode=\"light\" data-light-theme=\"light\">\n      <div class=\"gist-data\">\n        \n<div class=\"js-gist-file-update-container js-task-list-container\">\n      <div id=\"file-feigntest-java\" class=\"file my-2\">\n    \n    <div itemprop=\"text\" class=\"Box-body p-0 blob-wrapper data type-java  \" style=\"overflow: auto\" tabindex=\"0\" role=\"region\" aria-label=\"FeignTest.java content, created by mwiede on 10:09PM on April 12, 2017.\">\n\n        \n<div class=\"js-check-hidden-unicode js-blob-code-container blob-code-content\">\n\n  <template class=\"js-file-alert-template\">\n  <div data-view-component=\"true\" class=\"flash flash-warn flash-full d-flex flex-items-center\">\n  <svg aria-hidden=\"true\" data-component=\"Octicon\" height=\"16\" viewbox=\"0 0 16 16\" version=\"1.1\" width=\"16\" data-view-component=\"true\" class=\"octicon octicon-alert\">\n    <path d=\"M6.457 1.047c.659-1.234 2.427-1.234 3.086 0l6.082 11.378A1.75 1.75 0 0 1 14.082 15H1.918a1.75 1.75 0 0 1-1.543-2.575Zm1.763.707a.25.25 0 0 0-.44 0L1.698 13.132a.25.25 0 0 0 .22.368h12.164a.25.25 0 0 0 .22-.368Zm.53 3.996v2.5a.75.75 0 0 1-1.5 0v-2.5a.75.75 0 0 1 1.5 0ZM9 11a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z\"><\/path>\n<\/svg>\n    <span>\n      This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.\n      <a class=\"Link--inTextBlock\" href=\"https:\/\/github.co\/hiddenchars\" target=\"_blank\">Learn more about bidirectional Unicode characters<\/a>\n    <\/span>\n\n\n  <div data-view-component=\"true\" class=\"flash-action\">        <a href=\"%7B%7B%20revealButtonHref%20%7D%7D\" data-view-component=\"true\" class=\"btn-sm btn\">    Show hidden characters\n<\/a>\n<\/div>\n<\/div><\/template>\n<template class=\"js-line-alert-template\">\n  <span aria-label=\"This line has hidden Unicode characters\" data-view-component=\"true\" class=\"line-alert tooltipped tooltipped-e\">\n    <svg aria-hidden=\"true\" data-component=\"Octicon\" height=\"16\" viewbox=\"0 0 16 16\" version=\"1.1\" width=\"16\" data-view-component=\"true\" class=\"octicon octicon-alert\">\n    <path d=\"M6.457 1.047c.659-1.234 2.427-1.234 3.086 0l6.082 11.378A1.75 1.75 0 0 1 14.082 15H1.918a1.75 1.75 0 0 1-1.543-2.575Zm1.763.707a.25.25 0 0 0-.44 0L1.698 13.132a.25.25 0 0 0 .22.368h12.164a.25.25 0 0 0 .22-.368Zm.53 3.996v2.5a.75.75 0 0 1-1.5 0v-2.5a.75.75 0 0 1 1.5 0ZM9 11a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z\"><\/path>\n<\/svg>\n<\/span><\/template>\n\n  <table data-hpc class=\"highlight tab-size js-file-line-container\" data-tab-size=\"4\" data-paste-markdown-skip data-tagsearch-path=\"FeignTest.java\">\n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        <tr class=\"line\">\n          <td id=\"file-feigntest-java-L36\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"36\"><\/td>\n          <td id=\"file-feigntest-java-LC36\" class=\"blob-code blob-code-inner js-file-line\">  @Test<\/td>\n        <\/tr>\n        <tr class=\"line\">\n          <td id=\"file-feigntest-java-L37\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"37\"><\/td>\n          <td id=\"file-feigntest-java-LC37\" class=\"blob-code blob-code-inner js-file-line\">  public void testSuccess() throws IOException {<\/td>\n        <\/tr>\n        <tr class=\"line\">\n          <td id=\"file-feigntest-java-L38\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"38\"><\/td>\n          <td id=\"file-feigntest-java-LC38\" class=\"blob-code blob-code-inner js-file-line\">\n<\/td>\n        <\/tr>\n        <tr class=\"line\">\n          <td id=\"file-feigntest-java-L39\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"39\"><\/td>\n          <td id=\"file-feigntest-java-LC39\" class=\"blob-code blob-code-inner js-file-line\">    when(clientMock.execute(any(Request.class), any(Options.class))).thenReturn(<\/td>\n        <\/tr>\n        <tr class=\"line\">\n          <td id=\"file-feigntest-java-L40\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"40\"><\/td>\n          <td id=\"file-feigntest-java-LC40\" class=\"blob-code blob-code-inner js-file-line\">        Response.builder().status(200).headers(Collections.&lt;String, Collection&lt;String&gt;&gt;emptyMap())<\/td>\n        <\/tr>\n        <tr class=\"line\">\n          <td id=\"file-feigntest-java-L41\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"41\"><\/td>\n          <td id=\"file-feigntest-java-LC41\" class=\"blob-code blob-code-inner js-file-line\">            .build());<\/td>\n        <\/tr>\n        <tr class=\"line\">\n          <td id=\"file-feigntest-java-L42\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"42\"><\/td>\n          <td id=\"file-feigntest-java-LC42\" class=\"blob-code blob-code-inner js-file-line\">\n<\/td>\n        <\/tr>\n        <tr class=\"line\">\n          <td id=\"file-feigntest-java-L43\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"43\"><\/td>\n          <td id=\"file-feigntest-java-LC43\" class=\"blob-code blob-code-inner js-file-line\">    final GitHub github =<\/td>\n        <\/tr>\n        <tr class=\"line\">\n          <td id=\"file-feigntest-java-L44\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"44\"><\/td>\n          <td id=\"file-feigntest-java-LC44\" class=\"blob-code blob-code-inner js-file-line\">        Feign.builder().client(clientMock).decoder(new GsonDecoder())<\/td>\n        <\/tr>\n        <tr class=\"line\">\n          <td id=\"file-feigntest-java-L45\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"45\"><\/td>\n          <td id=\"file-feigntest-java-LC45\" class=\"blob-code blob-code-inner js-file-line\">            .target(GitHub.class, \"https:\/\/api.github.com\");<\/td>\n        <\/tr>\n        <tr class=\"line\">\n          <td id=\"file-feigntest-java-L46\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"46\"><\/td>\n          <td id=\"file-feigntest-java-LC46\" class=\"blob-code blob-code-inner js-file-line\">\n<\/td>\n        <\/tr>\n        <tr class=\"line\">\n          <td id=\"file-feigntest-java-L47\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"47\"><\/td>\n          <td id=\"file-feigntest-java-LC47\" class=\"blob-code blob-code-inner js-file-line\">    github.contributors(\"OpenFeign\", \"feign\");<\/td>\n        <\/tr>\n        <tr class=\"line\">\n          <td id=\"file-feigntest-java-L48\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"48\"><\/td>\n          <td id=\"file-feigntest-java-LC48\" class=\"blob-code blob-code-inner js-file-line\">\n<\/td>\n        <\/tr>\n        <tr class=\"line\">\n          <td id=\"file-feigntest-java-L49\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"49\"><\/td>\n          <td id=\"file-feigntest-java-LC49\" class=\"blob-code blob-code-inner js-file-line\">    verify(clientMock, times(1)).execute(any(Request.class), any(Options.class));<\/td>\n        <\/tr>\n        <tr class=\"line\">\n          <td id=\"file-feigntest-java-L50\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"50\"><\/td>\n          <td id=\"file-feigntest-java-LC50\" class=\"blob-code blob-code-inner js-file-line\">  }<\/td>\n        <\/tr>\n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n  <\/table>\n<\/div>\n\n\n    <\/div>\n\n  <\/div>\n\n<\/div>\n\n      <\/div>\n      <div class=\"gist-meta\">\n        <a href=\"https:\/\/gist.github.com\/mwiede\/3eeaa0566119f0a3aabf48b5e093d635\/raw\/bd1a8b555712d4e5dffbda0b794adb9dd280c2d1\/FeignTest.java\" style=\"float:right\" class=\"Link--inTextBlock\">view raw<\/a>\n        <a href=\"https:\/\/gist.github.com\/mwiede\/3eeaa0566119f0a3aabf48b5e093d635#file-feigntest-java\" class=\"Link--inTextBlock\">\n          FeignTest.java\n        <\/a>\n        hosted with &#10084; by <a class=\"Link--inTextBlock\" href=\"https:\/\/github.com\">GitHub<\/a>\n      <\/div>\n    <\/div>\n<\/div>\n<\/body><\/html>\n\n<h2>Case 2) Destination never reachable.<\/h2>\n<p>In this case, we can see the Default Retryer working, which ends up doing 5 attempts, but finally the client invocation throws an exception.<\/p>\n<!DOCTYPE html PUBLIC \"-\/\/W3C\/\/DTD HTML 4.0 Transitional\/\/EN\" \"http:\/\/www.w3.org\/TR\/REC-html40\/loose.dtd\">\n<html><body><div id=\"gist46646474\" class=\"gist\">\n    <div class=\"gist-file\" translate=\"no\" data-color-mode=\"light\" data-light-theme=\"light\">\n      <div class=\"gist-data\">\n        \n<div class=\"js-gist-file-update-container js-task-list-container\">\n      <div id=\"file-feigntest-java\" class=\"file my-2\">\n    \n    <div itemprop=\"text\" class=\"Box-body p-0 blob-wrapper data type-java  \" style=\"overflow: auto\" tabindex=\"0\" role=\"region\" aria-label=\"FeignTest.java content, created by mwiede on 10:09PM on April 12, 2017.\">\n\n        \n<div class=\"js-check-hidden-unicode js-blob-code-container blob-code-content\">\n\n  <template class=\"js-file-alert-template\">\n  <div data-view-component=\"true\" class=\"flash flash-warn flash-full d-flex flex-items-center\">\n  <svg aria-hidden=\"true\" data-component=\"Octicon\" height=\"16\" viewbox=\"0 0 16 16\" version=\"1.1\" width=\"16\" data-view-component=\"true\" class=\"octicon octicon-alert\">\n    <path d=\"M6.457 1.047c.659-1.234 2.427-1.234 3.086 0l6.082 11.378A1.75 1.75 0 0 1 14.082 15H1.918a1.75 1.75 0 0 1-1.543-2.575Zm1.763.707a.25.25 0 0 0-.44 0L1.698 13.132a.25.25 0 0 0 .22.368h12.164a.25.25 0 0 0 .22-.368Zm.53 3.996v2.5a.75.75 0 0 1-1.5 0v-2.5a.75.75 0 0 1 1.5 0ZM9 11a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z\"><\/path>\n<\/svg>\n    <span>\n      This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.\n      <a class=\"Link--inTextBlock\" href=\"https:\/\/github.co\/hiddenchars\" target=\"_blank\">Learn more about bidirectional Unicode characters<\/a>\n    <\/span>\n\n\n  <div data-view-component=\"true\" class=\"flash-action\">        <a href=\"%7B%7B%20revealButtonHref%20%7D%7D\" data-view-component=\"true\" class=\"btn-sm btn\">    Show hidden characters\n<\/a>\n<\/div>\n<\/div><\/template>\n<template class=\"js-line-alert-template\">\n  <span aria-label=\"This line has hidden Unicode characters\" data-view-component=\"true\" class=\"line-alert tooltipped tooltipped-e\">\n    <svg aria-hidden=\"true\" data-component=\"Octicon\" height=\"16\" viewbox=\"0 0 16 16\" version=\"1.1\" width=\"16\" data-view-component=\"true\" class=\"octicon octicon-alert\">\n    <path d=\"M6.457 1.047c.659-1.234 2.427-1.234 3.086 0l6.082 11.378A1.75 1.75 0 0 1 14.082 15H1.918a1.75 1.75 0 0 1-1.543-2.575Zm1.763.707a.25.25 0 0 0-.44 0L1.698 13.132a.25.25 0 0 0 .22.368h12.164a.25.25 0 0 0 .22-.368Zm.53 3.996v2.5a.75.75 0 0 1-1.5 0v-2.5a.75.75 0 0 1 1.5 0ZM9 11a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z\"><\/path>\n<\/svg>\n<\/span><\/template>\n\n  <table data-hpc class=\"highlight tab-size js-file-line-container\" data-tab-size=\"4\" data-paste-markdown-skip data-tagsearch-path=\"FeignTest.java\">\n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        <tr class=\"line\">\n          <td id=\"file-feigntest-java-L52\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"52\"><\/td>\n          <td id=\"file-feigntest-java-LC52\" class=\"blob-code blob-code-inner js-file-line\">  @Test<\/td>\n        <\/tr>\n        <tr class=\"line\">\n          <td id=\"file-feigntest-java-L53\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"53\"><\/td>\n          <td id=\"file-feigntest-java-LC53\" class=\"blob-code blob-code-inner js-file-line\">  public void testDefaultRetryerGivingUp() throws IOException {<\/td>\n        <\/tr>\n        <tr class=\"line\">\n          <td id=\"file-feigntest-java-L54\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"54\"><\/td>\n          <td id=\"file-feigntest-java-LC54\" class=\"blob-code blob-code-inner js-file-line\">\n<\/td>\n        <\/tr>\n        <tr class=\"line\">\n          <td id=\"file-feigntest-java-L55\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"55\"><\/td>\n          <td id=\"file-feigntest-java-LC55\" class=\"blob-code blob-code-inner js-file-line\">    when(clientMock.execute(any(Request.class), any(Options.class))).thenThrow(<\/td>\n        <\/tr>\n        <tr class=\"line\">\n          <td id=\"file-feigntest-java-L56\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"56\"><\/td>\n          <td id=\"file-feigntest-java-LC56\" class=\"blob-code blob-code-inner js-file-line\">        new UnknownHostException());<\/td>\n        <\/tr>\n        <tr class=\"line\">\n          <td id=\"file-feigntest-java-L57\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"57\"><\/td>\n          <td id=\"file-feigntest-java-LC57\" class=\"blob-code blob-code-inner js-file-line\">\n<\/td>\n        <\/tr>\n        <tr class=\"line\">\n          <td id=\"file-feigntest-java-L58\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"58\"><\/td>\n          <td id=\"file-feigntest-java-LC58\" class=\"blob-code blob-code-inner js-file-line\">    final GitHub github =<\/td>\n        <\/tr>\n        <tr class=\"line\">\n          <td id=\"file-feigntest-java-L59\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"59\"><\/td>\n          <td id=\"file-feigntest-java-LC59\" class=\"blob-code blob-code-inner js-file-line\">        Feign.builder().client(clientMock).decoder(new GsonDecoder())<\/td>\n        <\/tr>\n        <tr class=\"line\">\n          <td id=\"file-feigntest-java-L60\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"60\"><\/td>\n          <td id=\"file-feigntest-java-LC60\" class=\"blob-code blob-code-inner js-file-line\">            .target(GitHub.class, \"https:\/\/api.github.com\");<\/td>\n        <\/tr>\n        <tr class=\"line\">\n          <td id=\"file-feigntest-java-L61\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"61\"><\/td>\n          <td id=\"file-feigntest-java-LC61\" class=\"blob-code blob-code-inner js-file-line\">\n<\/td>\n        <\/tr>\n        <tr class=\"line\">\n          <td id=\"file-feigntest-java-L62\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"62\"><\/td>\n          <td id=\"file-feigntest-java-LC62\" class=\"blob-code blob-code-inner js-file-line\">    try {<\/td>\n        <\/tr>\n        <tr class=\"line\">\n          <td id=\"file-feigntest-java-L63\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"63\"><\/td>\n          <td id=\"file-feigntest-java-LC63\" class=\"blob-code blob-code-inner js-file-line\">      github.contributors(\"OpenFeign\", \"feign\");<\/td>\n        <\/tr>\n        <tr class=\"line\">\n          <td id=\"file-feigntest-java-L64\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"64\"><\/td>\n          <td id=\"file-feigntest-java-LC64\" class=\"blob-code blob-code-inner js-file-line\">      fail(\"not failing\");<\/td>\n        <\/tr>\n        <tr class=\"line\">\n          <td id=\"file-feigntest-java-L65\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"65\"><\/td>\n          <td id=\"file-feigntest-java-LC65\" class=\"blob-code blob-code-inner js-file-line\">    } catch (final Exception e) {<\/td>\n        <\/tr>\n        <tr class=\"line\">\n          <td id=\"file-feigntest-java-L66\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"66\"><\/td>\n          <td id=\"file-feigntest-java-LC66\" class=\"blob-code blob-code-inner js-file-line\">    } finally {<\/td>\n        <\/tr>\n        <tr class=\"line line-highlight\">\n          <td id=\"file-feigntest-java-L67\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"67\" style=\"background-color: #ffc !important\"><\/td>\n          <td id=\"file-feigntest-java-LC67\" class=\"blob-code blob-code-inner js-file-line\" style=\"background-color: #ffc !important\">      verify(clientMock, times(5)).execute(any(Request.class), any(Options.class));<\/td>\n        <\/tr>\n        <tr class=\"line\">\n          <td id=\"file-feigntest-java-L68\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"68\"><\/td>\n          <td id=\"file-feigntest-java-LC68\" class=\"blob-code blob-code-inner js-file-line\">    }<\/td>\n        <\/tr>\n        <tr class=\"line\">\n          <td id=\"file-feigntest-java-L69\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"69\"><\/td>\n          <td id=\"file-feigntest-java-LC69\" class=\"blob-code blob-code-inner js-file-line\">  }<\/td>\n        <\/tr>\n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n  <\/table>\n<\/div>\n\n\n    <\/div>\n\n  <\/div>\n\n<\/div>\n\n      <\/div>\n      <div class=\"gist-meta\">\n        <a href=\"https:\/\/gist.github.com\/mwiede\/3eeaa0566119f0a3aabf48b5e093d635\/raw\/bd1a8b555712d4e5dffbda0b794adb9dd280c2d1\/FeignTest.java\" style=\"float:right\" class=\"Link--inTextBlock\">view raw<\/a>\n        <a href=\"https:\/\/gist.github.com\/mwiede\/3eeaa0566119f0a3aabf48b5e093d635#file-feigntest-java\" class=\"Link--inTextBlock\">\n          FeignTest.java\n        <\/a>\n        hosted with &#10084; by <a class=\"Link--inTextBlock\" href=\"https:\/\/github.com\">GitHub<\/a>\n      <\/div>\n    <\/div>\n<\/div>\n<\/body><\/html>\n\n<h2>Case 3) Configure maximal number of attempts<\/h2>\n<p>Taking the same error scenario from case 2, this example shows how to configure the retryer to stop trying after the 3rd attempt.<\/p>\n<!DOCTYPE html PUBLIC \"-\/\/W3C\/\/DTD HTML 4.0 Transitional\/\/EN\" \"http:\/\/www.w3.org\/TR\/REC-html40\/loose.dtd\">\n<html><body><div id=\"gist46646474\" class=\"gist\">\n    <div class=\"gist-file\" translate=\"no\" data-color-mode=\"light\" data-light-theme=\"light\">\n      <div class=\"gist-data\">\n        \n<div class=\"js-gist-file-update-container js-task-list-container\">\n      <div id=\"file-feigntest-java\" class=\"file my-2\">\n    \n    <div itemprop=\"text\" class=\"Box-body p-0 blob-wrapper data type-java  \" style=\"overflow: auto\" tabindex=\"0\" role=\"region\" aria-label=\"FeignTest.java content, created by mwiede on 10:09PM on April 12, 2017.\">\n\n        \n<div class=\"js-check-hidden-unicode js-blob-code-container blob-code-content\">\n\n  <template class=\"js-file-alert-template\">\n  <div data-view-component=\"true\" class=\"flash flash-warn flash-full d-flex flex-items-center\">\n  <svg aria-hidden=\"true\" data-component=\"Octicon\" height=\"16\" viewbox=\"0 0 16 16\" version=\"1.1\" width=\"16\" data-view-component=\"true\" class=\"octicon octicon-alert\">\n    <path d=\"M6.457 1.047c.659-1.234 2.427-1.234 3.086 0l6.082 11.378A1.75 1.75 0 0 1 14.082 15H1.918a1.75 1.75 0 0 1-1.543-2.575Zm1.763.707a.25.25 0 0 0-.44 0L1.698 13.132a.25.25 0 0 0 .22.368h12.164a.25.25 0 0 0 .22-.368Zm.53 3.996v2.5a.75.75 0 0 1-1.5 0v-2.5a.75.75 0 0 1 1.5 0ZM9 11a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z\"><\/path>\n<\/svg>\n    <span>\n      This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.\n      <a class=\"Link--inTextBlock\" href=\"https:\/\/github.co\/hiddenchars\" target=\"_blank\">Learn more about bidirectional Unicode characters<\/a>\n    <\/span>\n\n\n  <div data-view-component=\"true\" class=\"flash-action\">        <a href=\"%7B%7B%20revealButtonHref%20%7D%7D\" data-view-component=\"true\" class=\"btn-sm btn\">    Show hidden characters\n<\/a>\n<\/div>\n<\/div><\/template>\n<template class=\"js-line-alert-template\">\n  <span aria-label=\"This line has hidden Unicode characters\" data-view-component=\"true\" class=\"line-alert tooltipped tooltipped-e\">\n    <svg aria-hidden=\"true\" data-component=\"Octicon\" height=\"16\" viewbox=\"0 0 16 16\" version=\"1.1\" width=\"16\" data-view-component=\"true\" class=\"octicon octicon-alert\">\n    <path d=\"M6.457 1.047c.659-1.234 2.427-1.234 3.086 0l6.082 11.378A1.75 1.75 0 0 1 14.082 15H1.918a1.75 1.75 0 0 1-1.543-2.575Zm1.763.707a.25.25 0 0 0-.44 0L1.698 13.132a.25.25 0 0 0 .22.368h12.164a.25.25 0 0 0 .22-.368Zm.53 3.996v2.5a.75.75 0 0 1-1.5 0v-2.5a.75.75 0 0 1 1.5 0ZM9 11a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z\"><\/path>\n<\/svg>\n<\/span><\/template>\n\n  <table data-hpc class=\"highlight tab-size js-file-line-container\" data-tab-size=\"4\" data-paste-markdown-skip data-tagsearch-path=\"FeignTest.java\">\n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        <tr class=\"line\">\n          <td id=\"file-feigntest-java-L71\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"71\"><\/td>\n          <td id=\"file-feigntest-java-LC71\" class=\"blob-code blob-code-inner js-file-line\">  @Test<\/td>\n        <\/tr>\n        <tr class=\"line\">\n          <td id=\"file-feigntest-java-L72\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"72\"><\/td>\n          <td id=\"file-feigntest-java-LC72\" class=\"blob-code blob-code-inner js-file-line\">  public void testRetryerAttempts() throws IOException {<\/td>\n        <\/tr>\n        <tr class=\"line\">\n          <td id=\"file-feigntest-java-L73\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"73\"><\/td>\n          <td id=\"file-feigntest-java-LC73\" class=\"blob-code blob-code-inner js-file-line\">\n<\/td>\n        <\/tr>\n        <tr class=\"line\">\n          <td id=\"file-feigntest-java-L74\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"74\"><\/td>\n          <td id=\"file-feigntest-java-LC74\" class=\"blob-code blob-code-inner js-file-line\">    when(clientMock.execute(any(Request.class), any(Options.class))).thenThrow(<\/td>\n        <\/tr>\n        <tr class=\"line\">\n          <td id=\"file-feigntest-java-L75\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"75\"><\/td>\n          <td id=\"file-feigntest-java-LC75\" class=\"blob-code blob-code-inner js-file-line\">        new UnknownHostException());<\/td>\n        <\/tr>\n        <tr class=\"line\">\n          <td id=\"file-feigntest-java-L76\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"76\"><\/td>\n          <td id=\"file-feigntest-java-LC76\" class=\"blob-code blob-code-inner js-file-line\">\n<\/td>\n        <\/tr>\n        <tr class=\"line line-highlight\">\n          <td id=\"file-feigntest-java-L77\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"77\" style=\"background-color: #ffc !important\"><\/td>\n          <td id=\"file-feigntest-java-LC77\" class=\"blob-code blob-code-inner js-file-line\" style=\"background-color: #ffc !important\">    final int maxAttempts = 3;<\/td>\n        <\/tr>\n        <tr class=\"line\">\n          <td id=\"file-feigntest-java-L78\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"78\"><\/td>\n          <td id=\"file-feigntest-java-LC78\" class=\"blob-code blob-code-inner js-file-line\">\n<\/td>\n        <\/tr>\n        <tr class=\"line\">\n          <td id=\"file-feigntest-java-L79\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"79\"><\/td>\n          <td id=\"file-feigntest-java-LC79\" class=\"blob-code blob-code-inner js-file-line\">    final GitHub github =<\/td>\n        <\/tr>\n        <tr class=\"line\">\n          <td id=\"file-feigntest-java-L80\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"80\"><\/td>\n          <td id=\"file-feigntest-java-LC80\" class=\"blob-code blob-code-inner js-file-line\">        Feign.builder().client(clientMock).decoder(new GsonDecoder())<\/td>\n        <\/tr>\n        <tr class=\"line line-highlight\">\n          <td id=\"file-feigntest-java-L81\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"81\" style=\"background-color: #ffc !important\"><\/td>\n          <td id=\"file-feigntest-java-LC81\" class=\"blob-code blob-code-inner js-file-line\" style=\"background-color: #ffc !important\">            .retryer(new Retryer.Default(1, 100, maxAttempts))<\/td>\n        <\/tr>\n        <tr class=\"line\">\n          <td id=\"file-feigntest-java-L82\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"82\"><\/td>\n          <td id=\"file-feigntest-java-LC82\" class=\"blob-code blob-code-inner js-file-line\">            .target(GitHub.class, \"https:\/\/api.github.com\");<\/td>\n        <\/tr>\n        <tr class=\"line\">\n          <td id=\"file-feigntest-java-L83\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"83\"><\/td>\n          <td id=\"file-feigntest-java-LC83\" class=\"blob-code blob-code-inner js-file-line\">\n<\/td>\n        <\/tr>\n        <tr class=\"line\">\n          <td id=\"file-feigntest-java-L84\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"84\"><\/td>\n          <td id=\"file-feigntest-java-LC84\" class=\"blob-code blob-code-inner js-file-line\">    try {<\/td>\n        <\/tr>\n        <tr class=\"line\">\n          <td id=\"file-feigntest-java-L85\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"85\"><\/td>\n          <td id=\"file-feigntest-java-LC85\" class=\"blob-code blob-code-inner js-file-line\">      github.contributors(\"OpenFeign\", \"feign\");<\/td>\n        <\/tr>\n        <tr class=\"line\">\n          <td id=\"file-feigntest-java-L86\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"86\"><\/td>\n          <td id=\"file-feigntest-java-LC86\" class=\"blob-code blob-code-inner js-file-line\">      fail(\"not failing\");<\/td>\n        <\/tr>\n        <tr class=\"line\">\n          <td id=\"file-feigntest-java-L87\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"87\"><\/td>\n          <td id=\"file-feigntest-java-LC87\" class=\"blob-code blob-code-inner js-file-line\">    } catch (final Exception e) {<\/td>\n        <\/tr>\n        <tr class=\"line\">\n          <td id=\"file-feigntest-java-L88\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"88\"><\/td>\n          <td id=\"file-feigntest-java-LC88\" class=\"blob-code blob-code-inner js-file-line\">    } finally {<\/td>\n        <\/tr>\n        <tr class=\"line line-highlight\">\n          <td id=\"file-feigntest-java-L89\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"89\" style=\"background-color: #ffc !important\"><\/td>\n          <td id=\"file-feigntest-java-LC89\" class=\"blob-code blob-code-inner js-file-line\" style=\"background-color: #ffc !important\">      verify(clientMock, times(maxAttempts)).execute(any(Request.class), any(Options.class));<\/td>\n        <\/tr>\n        <tr class=\"line\">\n          <td id=\"file-feigntest-java-L90\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"90\"><\/td>\n          <td id=\"file-feigntest-java-LC90\" class=\"blob-code blob-code-inner js-file-line\">    }<\/td>\n        <\/tr>\n        <tr class=\"line\">\n          <td id=\"file-feigntest-java-L91\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"91\"><\/td>\n          <td id=\"file-feigntest-java-LC91\" class=\"blob-code blob-code-inner js-file-line\">  }<\/td>\n        <\/tr>\n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n  <\/table>\n<\/div>\n\n\n    <\/div>\n\n  <\/div>\n\n<\/div>\n\n      <\/div>\n      <div class=\"gist-meta\">\n        <a href=\"https:\/\/gist.github.com\/mwiede\/3eeaa0566119f0a3aabf48b5e093d635\/raw\/bd1a8b555712d4e5dffbda0b794adb9dd280c2d1\/FeignTest.java\" style=\"float:right\" class=\"Link--inTextBlock\">view raw<\/a>\n        <a href=\"https:\/\/gist.github.com\/mwiede\/3eeaa0566119f0a3aabf48b5e093d635#file-feigntest-java\" class=\"Link--inTextBlock\">\n          FeignTest.java\n        <\/a>\n        hosted with &#10084; by <a class=\"Link--inTextBlock\" href=\"https:\/\/github.com\">GitHub<\/a>\n      <\/div>\n    <\/div>\n<\/div>\n<\/body><\/html>\n\n<h2>Case 4) trigger retrying\u00a0by error code decoding<\/h2>\n<p>For some (restful) services, http status code 409 (conflict) is used to express a wrong state of the target resource, that might change after resubmitting the request. We simulate, that the first retry will lead to a successfull response.<\/p>\n<!DOCTYPE html PUBLIC \"-\/\/W3C\/\/DTD HTML 4.0 Transitional\/\/EN\" \"http:\/\/www.w3.org\/TR\/REC-html40\/loose.dtd\">\n<html><body><div id=\"gist46646474\" class=\"gist\">\n    <div class=\"gist-file\" translate=\"no\" data-color-mode=\"light\" data-light-theme=\"light\">\n      <div class=\"gist-data\">\n        \n<div class=\"js-gist-file-update-container js-task-list-container\">\n      <div id=\"file-feigntest-java\" class=\"file my-2\">\n    \n    <div itemprop=\"text\" class=\"Box-body p-0 blob-wrapper data type-java  \" style=\"overflow: auto\" tabindex=\"0\" role=\"region\" aria-label=\"FeignTest.java content, created by mwiede on 10:09PM on April 12, 2017.\">\n\n        \n<div class=\"js-check-hidden-unicode js-blob-code-container blob-code-content\">\n\n  <template class=\"js-file-alert-template\">\n  <div data-view-component=\"true\" class=\"flash flash-warn flash-full d-flex flex-items-center\">\n  <svg aria-hidden=\"true\" data-component=\"Octicon\" height=\"16\" viewbox=\"0 0 16 16\" version=\"1.1\" width=\"16\" data-view-component=\"true\" class=\"octicon octicon-alert\">\n    <path d=\"M6.457 1.047c.659-1.234 2.427-1.234 3.086 0l6.082 11.378A1.75 1.75 0 0 1 14.082 15H1.918a1.75 1.75 0 0 1-1.543-2.575Zm1.763.707a.25.25 0 0 0-.44 0L1.698 13.132a.25.25 0 0 0 .22.368h12.164a.25.25 0 0 0 .22-.368Zm.53 3.996v2.5a.75.75 0 0 1-1.5 0v-2.5a.75.75 0 0 1 1.5 0ZM9 11a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z\"><\/path>\n<\/svg>\n    <span>\n      This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.\n      <a class=\"Link--inTextBlock\" href=\"https:\/\/github.co\/hiddenchars\" target=\"_blank\">Learn more about bidirectional Unicode characters<\/a>\n    <\/span>\n\n\n  <div data-view-component=\"true\" class=\"flash-action\">        <a href=\"%7B%7B%20revealButtonHref%20%7D%7D\" data-view-component=\"true\" class=\"btn-sm btn\">    Show hidden characters\n<\/a>\n<\/div>\n<\/div><\/template>\n<template class=\"js-line-alert-template\">\n  <span aria-label=\"This line has hidden Unicode characters\" data-view-component=\"true\" class=\"line-alert tooltipped tooltipped-e\">\n    <svg aria-hidden=\"true\" data-component=\"Octicon\" height=\"16\" viewbox=\"0 0 16 16\" version=\"1.1\" width=\"16\" data-view-component=\"true\" class=\"octicon octicon-alert\">\n    <path d=\"M6.457 1.047c.659-1.234 2.427-1.234 3.086 0l6.082 11.378A1.75 1.75 0 0 1 14.082 15H1.918a1.75 1.75 0 0 1-1.543-2.575Zm1.763.707a.25.25 0 0 0-.44 0L1.698 13.132a.25.25 0 0 0 .22.368h12.164a.25.25 0 0 0 .22-.368Zm.53 3.996v2.5a.75.75 0 0 1-1.5 0v-2.5a.75.75 0 0 1 1.5 0ZM9 11a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z\"><\/path>\n<\/svg>\n<\/span><\/template>\n\n  <table data-hpc class=\"highlight tab-size js-file-line-container\" data-tab-size=\"4\" data-paste-markdown-skip data-tagsearch-path=\"FeignTest.java\">\n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        <tr class=\"line\">\n          <td id=\"file-feigntest-java-L93\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"93\"><\/td>\n          <td id=\"file-feigntest-java-LC93\" class=\"blob-code blob-code-inner js-file-line\">  @Test<\/td>\n        <\/tr>\n        <tr class=\"line\">\n          <td id=\"file-feigntest-java-L94\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"94\"><\/td>\n          <td id=\"file-feigntest-java-LC94\" class=\"blob-code blob-code-inner js-file-line\">  public void testCustomRetryConfigByErrorDecoder() throws IOException {<\/td>\n        <\/tr>\n        <tr class=\"line\">\n          <td id=\"file-feigntest-java-L95\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"95\"><\/td>\n          <td id=\"file-feigntest-java-LC95\" class=\"blob-code blob-code-inner js-file-line\">\n<\/td>\n        <\/tr>\n        <tr class=\"line\">\n          <td id=\"file-feigntest-java-L96\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"96\"><\/td>\n          <td id=\"file-feigntest-java-LC96\" class=\"blob-code blob-code-inner js-file-line\">    when(clientMock.execute(any(Request.class), any(Options.class))).thenReturn(<\/td>\n        <\/tr>\n        <tr class=\"line\">\n          <td id=\"file-feigntest-java-L97\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"97\"><\/td>\n          <td id=\"file-feigntest-java-LC97\" class=\"blob-code blob-code-inner js-file-line\">        Response.builder().status(409).headers(Collections.&lt;String, Collection&lt;String&gt;&gt;emptyMap())<\/td>\n        <\/tr>\n        <tr class=\"line\">\n          <td id=\"file-feigntest-java-L98\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"98\"><\/td>\n          <td id=\"file-feigntest-java-LC98\" class=\"blob-code blob-code-inner js-file-line\">            .build(),<\/td>\n        <\/tr>\n        <tr class=\"line\">\n          <td id=\"file-feigntest-java-L99\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"99\"><\/td>\n          <td id=\"file-feigntest-java-LC99\" class=\"blob-code blob-code-inner js-file-line\">        Response.builder().status(200).headers(Collections.&lt;String, Collection&lt;String&gt;&gt;emptyMap())<\/td>\n        <\/tr>\n        <tr class=\"line\">\n          <td id=\"file-feigntest-java-L100\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"100\"><\/td>\n          <td id=\"file-feigntest-java-LC100\" class=\"blob-code blob-code-inner js-file-line\">            .build());<\/td>\n        <\/tr>\n        <tr class=\"line\">\n          <td id=\"file-feigntest-java-L101\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"101\"><\/td>\n          <td id=\"file-feigntest-java-LC101\" class=\"blob-code blob-code-inner js-file-line\">\n<\/td>\n        <\/tr>\n        <tr class=\"line\">\n          <td id=\"file-feigntest-java-L102\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"102\"><\/td>\n          <td id=\"file-feigntest-java-LC102\" class=\"blob-code blob-code-inner js-file-line\">    class RetryOn409ConflictStatus extends ErrorDecoder.Default {<\/td>\n        <\/tr>\n        <tr class=\"line\">\n          <td id=\"file-feigntest-java-L103\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"103\"><\/td>\n          <td id=\"file-feigntest-java-LC103\" class=\"blob-code blob-code-inner js-file-line\">\n<\/td>\n        <\/tr>\n        <tr class=\"line\">\n          <td id=\"file-feigntest-java-L104\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"104\"><\/td>\n          <td id=\"file-feigntest-java-LC104\" class=\"blob-code blob-code-inner js-file-line\">      @Override<\/td>\n        <\/tr>\n        <tr class=\"line\">\n          <td id=\"file-feigntest-java-L105\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"105\"><\/td>\n          <td id=\"file-feigntest-java-LC105\" class=\"blob-code blob-code-inner js-file-line\">      public Exception decode(final String methodKey, final Response response) {<\/td>\n        <\/tr>\n        <tr class=\"line\">\n          <td id=\"file-feigntest-java-L106\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"106\"><\/td>\n          <td id=\"file-feigntest-java-LC106\" class=\"blob-code blob-code-inner js-file-line\">        if (409 == response.status()) {<\/td>\n        <\/tr>\n        <tr class=\"line\">\n          <td id=\"file-feigntest-java-L107\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"107\"><\/td>\n          <td id=\"file-feigntest-java-LC107\" class=\"blob-code blob-code-inner js-file-line\">          return new RetryableException(\"getting conflict and retry\", null);<\/td>\n        <\/tr>\n        <tr class=\"line\">\n          <td id=\"file-feigntest-java-L108\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"108\"><\/td>\n          <td id=\"file-feigntest-java-LC108\" class=\"blob-code blob-code-inner js-file-line\">        } else<\/td>\n        <\/tr>\n        <tr class=\"line\">\n          <td id=\"file-feigntest-java-L109\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"109\"><\/td>\n          <td id=\"file-feigntest-java-LC109\" class=\"blob-code blob-code-inner js-file-line\">          return super.decode(methodKey, response);<\/td>\n        <\/tr>\n        <tr class=\"line\">\n          <td id=\"file-feigntest-java-L110\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"110\"><\/td>\n          <td id=\"file-feigntest-java-LC110\" class=\"blob-code blob-code-inner js-file-line\">      }<\/td>\n        <\/tr>\n        <tr class=\"line\">\n          <td id=\"file-feigntest-java-L111\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"111\"><\/td>\n          <td id=\"file-feigntest-java-LC111\" class=\"blob-code blob-code-inner js-file-line\">\n<\/td>\n        <\/tr>\n        <tr class=\"line\">\n          <td id=\"file-feigntest-java-L112\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"112\"><\/td>\n          <td id=\"file-feigntest-java-LC112\" class=\"blob-code blob-code-inner js-file-line\">    }<\/td>\n        <\/tr>\n        <tr class=\"line\">\n          <td id=\"file-feigntest-java-L113\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"113\"><\/td>\n          <td id=\"file-feigntest-java-LC113\" class=\"blob-code blob-code-inner js-file-line\">\n<\/td>\n        <\/tr>\n        <tr class=\"line\">\n          <td id=\"file-feigntest-java-L114\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"114\"><\/td>\n          <td id=\"file-feigntest-java-LC114\" class=\"blob-code blob-code-inner js-file-line\">    final GitHub github =<\/td>\n        <\/tr>\n        <tr class=\"line\">\n          <td id=\"file-feigntest-java-L115\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"115\"><\/td>\n          <td id=\"file-feigntest-java-LC115\" class=\"blob-code blob-code-inner js-file-line\">        Feign.builder().client(clientMock).decoder(new GsonDecoder())<\/td>\n        <\/tr>\n        <tr class=\"line line-highlight\">\n          <td id=\"file-feigntest-java-L116\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"116\" style=\"background-color: #ffc !important\"><\/td>\n          <td id=\"file-feigntest-java-LC116\" class=\"blob-code blob-code-inner js-file-line\" style=\"background-color: #ffc !important\">            .errorDecoder(new RetryOn409ConflictStatus())<\/td>\n        <\/tr>\n        <tr class=\"line\">\n          <td id=\"file-feigntest-java-L117\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"117\"><\/td>\n          <td id=\"file-feigntest-java-LC117\" class=\"blob-code blob-code-inner js-file-line\">            .target(GitHub.class, \"https:\/\/api.github.com\");<\/td>\n        <\/tr>\n        <tr class=\"line\">\n          <td id=\"file-feigntest-java-L118\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"118\"><\/td>\n          <td id=\"file-feigntest-java-LC118\" class=\"blob-code blob-code-inner js-file-line\">\n<\/td>\n        <\/tr>\n        <tr class=\"line\">\n          <td id=\"file-feigntest-java-L119\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"119\"><\/td>\n          <td id=\"file-feigntest-java-LC119\" class=\"blob-code blob-code-inner js-file-line\">\n<\/td>\n        <\/tr>\n        <tr class=\"line\">\n          <td id=\"file-feigntest-java-L120\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"120\"><\/td>\n          <td id=\"file-feigntest-java-LC120\" class=\"blob-code blob-code-inner js-file-line\">    github.contributors(\"OpenFeign\", \"feign\");<\/td>\n        <\/tr>\n        <tr class=\"line\">\n          <td id=\"file-feigntest-java-L121\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"121\"><\/td>\n          <td id=\"file-feigntest-java-LC121\" class=\"blob-code blob-code-inner js-file-line\">\n<\/td>\n        <\/tr>\n        <tr class=\"line\">\n          <td id=\"file-feigntest-java-L122\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"122\"><\/td>\n          <td id=\"file-feigntest-java-LC122\" class=\"blob-code blob-code-inner js-file-line\">    verify(clientMock, times(2)).execute(any(Request.class), any(Options.class));<\/td>\n        <\/tr>\n        <tr class=\"line\">\n          <td id=\"file-feigntest-java-L123\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"123\"><\/td>\n          <td id=\"file-feigntest-java-LC123\" class=\"blob-code blob-code-inner js-file-line\">\n<\/td>\n        <\/tr>\n        <tr class=\"line\">\n          <td id=\"file-feigntest-java-L124\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"124\"><\/td>\n          <td id=\"file-feigntest-java-LC124\" class=\"blob-code blob-code-inner js-file-line\">  }<\/td>\n        <\/tr>\n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n  <\/table>\n<\/div>\n\n\n    <\/div>\n\n  <\/div>\n\n<\/div>\n\n      <\/div>\n      <div class=\"gist-meta\">\n        <a href=\"https:\/\/gist.github.com\/mwiede\/3eeaa0566119f0a3aabf48b5e093d635\/raw\/bd1a8b555712d4e5dffbda0b794adb9dd280c2d1\/FeignTest.java\" style=\"float:right\" class=\"Link--inTextBlock\">view raw<\/a>\n        <a href=\"https:\/\/gist.github.com\/mwiede\/3eeaa0566119f0a3aabf48b5e093d635#file-feigntest-java\" class=\"Link--inTextBlock\">\n          FeignTest.java\n        <\/a>\n        hosted with &#10084; by <a class=\"Link--inTextBlock\" href=\"https:\/\/github.com\">GitHub<\/a>\n      <\/div>\n    <\/div>\n<\/div>\n<\/body><\/html>\n\n<h2>Case 4a) Behavior without error decoder<\/h2>\n<p>If no error decoder is configured, no retry is executed by Feign.<\/p>\n<!DOCTYPE html PUBLIC \"-\/\/W3C\/\/DTD HTML 4.0 Transitional\/\/EN\" \"http:\/\/www.w3.org\/TR\/REC-html40\/loose.dtd\">\n<html><body><div id=\"gist46646474\" class=\"gist\">\n    <div class=\"gist-file\" translate=\"no\" data-color-mode=\"light\" data-light-theme=\"light\">\n      <div class=\"gist-data\">\n        \n<div class=\"js-gist-file-update-container js-task-list-container\">\n      <div id=\"file-feigntest-java\" class=\"file my-2\">\n    \n    <div itemprop=\"text\" class=\"Box-body p-0 blob-wrapper data type-java  \" style=\"overflow: auto\" tabindex=\"0\" role=\"region\" aria-label=\"FeignTest.java content, created by mwiede on 10:09PM on April 12, 2017.\">\n\n        \n<div class=\"js-check-hidden-unicode js-blob-code-container blob-code-content\">\n\n  <template class=\"js-file-alert-template\">\n  <div data-view-component=\"true\" class=\"flash flash-warn flash-full d-flex flex-items-center\">\n  <svg aria-hidden=\"true\" data-component=\"Octicon\" height=\"16\" viewbox=\"0 0 16 16\" version=\"1.1\" width=\"16\" data-view-component=\"true\" class=\"octicon octicon-alert\">\n    <path d=\"M6.457 1.047c.659-1.234 2.427-1.234 3.086 0l6.082 11.378A1.75 1.75 0 0 1 14.082 15H1.918a1.75 1.75 0 0 1-1.543-2.575Zm1.763.707a.25.25 0 0 0-.44 0L1.698 13.132a.25.25 0 0 0 .22.368h12.164a.25.25 0 0 0 .22-.368Zm.53 3.996v2.5a.75.75 0 0 1-1.5 0v-2.5a.75.75 0 0 1 1.5 0ZM9 11a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z\"><\/path>\n<\/svg>\n    <span>\n      This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.\n      <a class=\"Link--inTextBlock\" href=\"https:\/\/github.co\/hiddenchars\" target=\"_blank\">Learn more about bidirectional Unicode characters<\/a>\n    <\/span>\n\n\n  <div data-view-component=\"true\" class=\"flash-action\">        <a href=\"%7B%7B%20revealButtonHref%20%7D%7D\" data-view-component=\"true\" class=\"btn-sm btn\">    Show hidden characters\n<\/a>\n<\/div>\n<\/div><\/template>\n<template class=\"js-line-alert-template\">\n  <span aria-label=\"This line has hidden Unicode characters\" data-view-component=\"true\" class=\"line-alert tooltipped tooltipped-e\">\n    <svg aria-hidden=\"true\" data-component=\"Octicon\" height=\"16\" viewbox=\"0 0 16 16\" version=\"1.1\" width=\"16\" data-view-component=\"true\" class=\"octicon octicon-alert\">\n    <path d=\"M6.457 1.047c.659-1.234 2.427-1.234 3.086 0l6.082 11.378A1.75 1.75 0 0 1 14.082 15H1.918a1.75 1.75 0 0 1-1.543-2.575Zm1.763.707a.25.25 0 0 0-.44 0L1.698 13.132a.25.25 0 0 0 .22.368h12.164a.25.25 0 0 0 .22-.368Zm.53 3.996v2.5a.75.75 0 0 1-1.5 0v-2.5a.75.75 0 0 1 1.5 0ZM9 11a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z\"><\/path>\n<\/svg>\n<\/span><\/template>\n\n  <table data-hpc class=\"highlight tab-size js-file-line-container\" data-tab-size=\"4\" data-paste-markdown-skip data-tagsearch-path=\"FeignTest.java\">\n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        <tr class=\"line\">\n          <td id=\"file-feigntest-java-L126\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"126\"><\/td>\n          <td id=\"file-feigntest-java-LC126\" class=\"blob-code blob-code-inner js-file-line\">  @Test<\/td>\n        <\/tr>\n        <tr class=\"line\">\n          <td id=\"file-feigntest-java-L127\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"127\"><\/td>\n          <td id=\"file-feigntest-java-LC127\" class=\"blob-code blob-code-inner js-file-line\">  public void test409Error() throws IOException {<\/td>\n        <\/tr>\n        <tr class=\"line\">\n          <td id=\"file-feigntest-java-L128\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"128\"><\/td>\n          <td id=\"file-feigntest-java-LC128\" class=\"blob-code blob-code-inner js-file-line\">\n<\/td>\n        <\/tr>\n        <tr class=\"line\">\n          <td id=\"file-feigntest-java-L129\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"129\"><\/td>\n          <td id=\"file-feigntest-java-LC129\" class=\"blob-code blob-code-inner js-file-line\">    when(clientMock.execute(any(Request.class), any(Options.class))).thenReturn(<\/td>\n        <\/tr>\n        <tr class=\"line\">\n          <td id=\"file-feigntest-java-L130\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"130\"><\/td>\n          <td id=\"file-feigntest-java-LC130\" class=\"blob-code blob-code-inner js-file-line\">        Response.builder().status(409).headers(Collections.&lt;String, Collection&lt;String&gt;&gt;emptyMap())<\/td>\n        <\/tr>\n        <tr class=\"line\">\n          <td id=\"file-feigntest-java-L131\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"131\"><\/td>\n          <td id=\"file-feigntest-java-LC131\" class=\"blob-code blob-code-inner js-file-line\">            .build(),<\/td>\n        <\/tr>\n        <tr class=\"line\">\n          <td id=\"file-feigntest-java-L132\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"132\"><\/td>\n          <td id=\"file-feigntest-java-LC132\" class=\"blob-code blob-code-inner js-file-line\">        Response.builder().status(200).headers(Collections.&lt;String, Collection&lt;String&gt;&gt;emptyMap())<\/td>\n        <\/tr>\n        <tr class=\"line\">\n          <td id=\"file-feigntest-java-L133\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"133\"><\/td>\n          <td id=\"file-feigntest-java-LC133\" class=\"blob-code blob-code-inner js-file-line\">            .build());<\/td>\n        <\/tr>\n        <tr class=\"line\">\n          <td id=\"file-feigntest-java-L134\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"134\"><\/td>\n          <td id=\"file-feigntest-java-LC134\" class=\"blob-code blob-code-inner js-file-line\">\n<\/td>\n        <\/tr>\n        <tr class=\"line\">\n          <td id=\"file-feigntest-java-L135\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"135\"><\/td>\n          <td id=\"file-feigntest-java-LC135\" class=\"blob-code blob-code-inner js-file-line\">    final GitHub github =<\/td>\n        <\/tr>\n        <tr class=\"line\">\n          <td id=\"file-feigntest-java-L136\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"136\"><\/td>\n          <td id=\"file-feigntest-java-LC136\" class=\"blob-code blob-code-inner js-file-line\">        Feign.builder().client(clientMock).decoder(new GsonDecoder())<\/td>\n        <\/tr>\n        <tr class=\"line\">\n          <td id=\"file-feigntest-java-L137\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"137\"><\/td>\n          <td id=\"file-feigntest-java-LC137\" class=\"blob-code blob-code-inner js-file-line\">            .target(GitHub.class, \"https:\/\/api.github.com\");<\/td>\n        <\/tr>\n        <tr class=\"line\">\n          <td id=\"file-feigntest-java-L138\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"138\"><\/td>\n          <td id=\"file-feigntest-java-LC138\" class=\"blob-code blob-code-inner js-file-line\">\n<\/td>\n        <\/tr>\n        <tr class=\"line\">\n          <td id=\"file-feigntest-java-L139\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"139\"><\/td>\n          <td id=\"file-feigntest-java-LC139\" class=\"blob-code blob-code-inner js-file-line\">    try {<\/td>\n        <\/tr>\n        <tr class=\"line\">\n          <td id=\"file-feigntest-java-L140\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"140\"><\/td>\n          <td id=\"file-feigntest-java-LC140\" class=\"blob-code blob-code-inner js-file-line\">      github.contributors(\"OpenFeign\", \"feign\");<\/td>\n        <\/tr>\n        <tr class=\"line\">\n          <td id=\"file-feigntest-java-L141\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"141\"><\/td>\n          <td id=\"file-feigntest-java-LC141\" class=\"blob-code blob-code-inner js-file-line\">      fail(\"not failing\");<\/td>\n        <\/tr>\n        <tr class=\"line\">\n          <td id=\"file-feigntest-java-L142\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"142\"><\/td>\n          <td id=\"file-feigntest-java-LC142\" class=\"blob-code blob-code-inner js-file-line\">    } catch (final Exception e) {<\/td>\n        <\/tr>\n        <tr class=\"line\">\n          <td id=\"file-feigntest-java-L143\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"143\"><\/td>\n          <td id=\"file-feigntest-java-LC143\" class=\"blob-code blob-code-inner js-file-line\">    } finally {<\/td>\n        <\/tr>\n        <tr class=\"line\">\n          <td id=\"file-feigntest-java-L144\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"144\"><\/td>\n          <td id=\"file-feigntest-java-LC144\" class=\"blob-code blob-code-inner js-file-line\">      verify(clientMock, times(1)).execute(any(Request.class), any(Options.class));<\/td>\n        <\/tr>\n        <tr class=\"line\">\n          <td id=\"file-feigntest-java-L145\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"145\"><\/td>\n          <td id=\"file-feigntest-java-LC145\" class=\"blob-code blob-code-inner js-file-line\">    }<\/td>\n        <\/tr>\n        <tr class=\"line\">\n          <td id=\"file-feigntest-java-L146\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"146\"><\/td>\n          <td id=\"file-feigntest-java-LC146\" class=\"blob-code blob-code-inner js-file-line\">\n<\/td>\n        <\/tr>\n        <tr class=\"line\">\n          <td id=\"file-feigntest-java-L147\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"147\"><\/td>\n          <td id=\"file-feigntest-java-LC147\" class=\"blob-code blob-code-inner js-file-line\">  }<\/td>\n        <\/tr>\n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n  <\/table>\n<\/div>\n\n\n    <\/div>\n\n  <\/div>\n\n<\/div>\n\n      <\/div>\n      <div class=\"gist-meta\">\n        <a href=\"https:\/\/gist.github.com\/mwiede\/3eeaa0566119f0a3aabf48b5e093d635\/raw\/bd1a8b555712d4e5dffbda0b794adb9dd280c2d1\/FeignTest.java\" style=\"float:right\" class=\"Link--inTextBlock\">view raw<\/a>\n        <a href=\"https:\/\/gist.github.com\/mwiede\/3eeaa0566119f0a3aabf48b5e093d635#file-feigntest-java\" class=\"Link--inTextBlock\">\n          FeignTest.java\n        <\/a>\n        hosted with &#10084; by <a class=\"Link--inTextBlock\" href=\"https:\/\/github.com\">GitHub<\/a>\n      <\/div>\n    <\/div>\n<\/div>\n<\/body><\/html>\n\n<h2>Case 5) Evaluation of Retry-After header<\/h2>\n<p>In contrast to the cases 4 and 4a, any response having a\u00a0Retry-After header, which is a standard header defined in http protocol, the default Feign behavior is to honor this and trigger a retry at the date given.<\/p>\n<!DOCTYPE html PUBLIC \"-\/\/W3C\/\/DTD HTML 4.0 Transitional\/\/EN\" \"http:\/\/www.w3.org\/TR\/REC-html40\/loose.dtd\">\n<html><body><div id=\"gist46646474\" class=\"gist\">\n    <div class=\"gist-file\" translate=\"no\" data-color-mode=\"light\" data-light-theme=\"light\">\n      <div class=\"gist-data\">\n        \n<div class=\"js-gist-file-update-container js-task-list-container\">\n      <div id=\"file-feigntest-java\" class=\"file my-2\">\n    \n    <div itemprop=\"text\" class=\"Box-body p-0 blob-wrapper data type-java  \" style=\"overflow: auto\" tabindex=\"0\" role=\"region\" aria-label=\"FeignTest.java content, created by mwiede on 10:09PM on April 12, 2017.\">\n\n        \n<div class=\"js-check-hidden-unicode js-blob-code-container blob-code-content\">\n\n  <template class=\"js-file-alert-template\">\n  <div data-view-component=\"true\" class=\"flash flash-warn flash-full d-flex flex-items-center\">\n  <svg aria-hidden=\"true\" data-component=\"Octicon\" height=\"16\" viewbox=\"0 0 16 16\" version=\"1.1\" width=\"16\" data-view-component=\"true\" class=\"octicon octicon-alert\">\n    <path d=\"M6.457 1.047c.659-1.234 2.427-1.234 3.086 0l6.082 11.378A1.75 1.75 0 0 1 14.082 15H1.918a1.75 1.75 0 0 1-1.543-2.575Zm1.763.707a.25.25 0 0 0-.44 0L1.698 13.132a.25.25 0 0 0 .22.368h12.164a.25.25 0 0 0 .22-.368Zm.53 3.996v2.5a.75.75 0 0 1-1.5 0v-2.5a.75.75 0 0 1 1.5 0ZM9 11a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z\"><\/path>\n<\/svg>\n    <span>\n      This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.\n      <a class=\"Link--inTextBlock\" href=\"https:\/\/github.co\/hiddenchars\" target=\"_blank\">Learn more about bidirectional Unicode characters<\/a>\n    <\/span>\n\n\n  <div data-view-component=\"true\" class=\"flash-action\">        <a href=\"%7B%7B%20revealButtonHref%20%7D%7D\" data-view-component=\"true\" class=\"btn-sm btn\">    Show hidden characters\n<\/a>\n<\/div>\n<\/div><\/template>\n<template class=\"js-line-alert-template\">\n  <span aria-label=\"This line has hidden Unicode characters\" data-view-component=\"true\" class=\"line-alert tooltipped tooltipped-e\">\n    <svg aria-hidden=\"true\" data-component=\"Octicon\" height=\"16\" viewbox=\"0 0 16 16\" version=\"1.1\" width=\"16\" data-view-component=\"true\" class=\"octicon octicon-alert\">\n    <path d=\"M6.457 1.047c.659-1.234 2.427-1.234 3.086 0l6.082 11.378A1.75 1.75 0 0 1 14.082 15H1.918a1.75 1.75 0 0 1-1.543-2.575Zm1.763.707a.25.25 0 0 0-.44 0L1.698 13.132a.25.25 0 0 0 .22.368h12.164a.25.25 0 0 0 .22-.368Zm.53 3.996v2.5a.75.75 0 0 1-1.5 0v-2.5a.75.75 0 0 1 1.5 0ZM9 11a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z\"><\/path>\n<\/svg>\n<\/span><\/template>\n\n  <table data-hpc class=\"highlight tab-size js-file-line-container\" data-tab-size=\"4\" data-paste-markdown-skip data-tagsearch-path=\"FeignTest.java\">\n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        \n        <tr class=\"line\">\n          <td id=\"file-feigntest-java-L149\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"149\"><\/td>\n          <td id=\"file-feigntest-java-LC149\" class=\"blob-code blob-code-inner js-file-line\">  @Test<\/td>\n        <\/tr>\n        <tr class=\"line\">\n          <td id=\"file-feigntest-java-L150\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"150\"><\/td>\n          <td id=\"file-feigntest-java-LC150\" class=\"blob-code blob-code-inner js-file-line\">  public void test400ErrorWithRetryAfterHeader() throws IOException {<\/td>\n        <\/tr>\n        <tr class=\"line\">\n          <td id=\"file-feigntest-java-L151\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"151\"><\/td>\n          <td id=\"file-feigntest-java-LC151\" class=\"blob-code blob-code-inner js-file-line\">\n<\/td>\n        <\/tr>\n        <tr class=\"line\">\n          <td id=\"file-feigntest-java-L152\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"152\"><\/td>\n          <td id=\"file-feigntest-java-LC152\" class=\"blob-code blob-code-inner js-file-line\">    when(clientMock.execute(any(Request.class), any(Options.class))).thenReturn(<\/td>\n        <\/tr>\n        <tr class=\"line\">\n          <td id=\"file-feigntest-java-L153\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"153\"><\/td>\n          <td id=\"file-feigntest-java-LC153\" class=\"blob-code blob-code-inner js-file-line\">        Response<\/td>\n        <\/tr>\n        <tr class=\"line\">\n          <td id=\"file-feigntest-java-L154\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"154\"><\/td>\n          <td id=\"file-feigntest-java-LC154\" class=\"blob-code blob-code-inner js-file-line\">            .builder()<\/td>\n        <\/tr>\n        <tr class=\"line\">\n          <td id=\"file-feigntest-java-L155\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"155\"><\/td>\n          <td id=\"file-feigntest-java-LC155\" class=\"blob-code blob-code-inner js-file-line\">            .status(400)<\/td>\n        <\/tr>\n        <tr class=\"line\">\n          <td id=\"file-feigntest-java-L156\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"156\"><\/td>\n          <td id=\"file-feigntest-java-LC156\" class=\"blob-code blob-code-inner js-file-line\">            .headers(<\/td>\n        <\/tr>\n        <tr class=\"line\">\n          <td id=\"file-feigntest-java-L157\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"157\"><\/td>\n          <td id=\"file-feigntest-java-LC157\" class=\"blob-code blob-code-inner js-file-line\">                Collections.singletonMap(Util.RETRY_AFTER,<\/td>\n        <\/tr>\n        <tr class=\"line\">\n          <td id=\"file-feigntest-java-L158\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"158\"><\/td>\n          <td id=\"file-feigntest-java-LC158\" class=\"blob-code blob-code-inner js-file-line\">                    (Collection&lt;String&gt;) Collections.singletonList(\"1\"))).build(),<\/td>\n        <\/tr>\n        <tr class=\"line\">\n          <td id=\"file-feigntest-java-L159\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"159\"><\/td>\n          <td id=\"file-feigntest-java-LC159\" class=\"blob-code blob-code-inner js-file-line\">        Response.builder().status(200).headers(Collections.&lt;String, Collection&lt;String&gt;&gt;emptyMap())<\/td>\n        <\/tr>\n        <tr class=\"line\">\n          <td id=\"file-feigntest-java-L160\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"160\"><\/td>\n          <td id=\"file-feigntest-java-LC160\" class=\"blob-code blob-code-inner js-file-line\">            .build());<\/td>\n        <\/tr>\n        <tr class=\"line\">\n          <td id=\"file-feigntest-java-L161\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"161\"><\/td>\n          <td id=\"file-feigntest-java-LC161\" class=\"blob-code blob-code-inner js-file-line\">\n<\/td>\n        <\/tr>\n        <tr class=\"line\">\n          <td id=\"file-feigntest-java-L162\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"162\"><\/td>\n          <td id=\"file-feigntest-java-LC162\" class=\"blob-code blob-code-inner js-file-line\">    final GitHub github =<\/td>\n        <\/tr>\n        <tr class=\"line\">\n          <td id=\"file-feigntest-java-L163\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"163\"><\/td>\n          <td id=\"file-feigntest-java-LC163\" class=\"blob-code blob-code-inner js-file-line\">        Feign.builder().client(clientMock).decoder(new GsonDecoder())<\/td>\n        <\/tr>\n        <tr class=\"line\">\n          <td id=\"file-feigntest-java-L164\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"164\"><\/td>\n          <td id=\"file-feigntest-java-LC164\" class=\"blob-code blob-code-inner js-file-line\">            .target(GitHub.class, \"https:\/\/api.github.com\");<\/td>\n        <\/tr>\n        <tr class=\"line\">\n          <td id=\"file-feigntest-java-L165\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"165\"><\/td>\n          <td id=\"file-feigntest-java-LC165\" class=\"blob-code blob-code-inner js-file-line\">\n<\/td>\n        <\/tr>\n        <tr class=\"line\">\n          <td id=\"file-feigntest-java-L166\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"166\"><\/td>\n          <td id=\"file-feigntest-java-LC166\" class=\"blob-code blob-code-inner js-file-line\">\n<\/td>\n        <\/tr>\n        <tr class=\"line\">\n          <td id=\"file-feigntest-java-L167\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"167\"><\/td>\n          <td id=\"file-feigntest-java-LC167\" class=\"blob-code blob-code-inner js-file-line\">    github.contributors(\"OpenFeign\", \"feign\");<\/td>\n        <\/tr>\n        <tr class=\"line\">\n          <td id=\"file-feigntest-java-L168\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"168\"><\/td>\n          <td id=\"file-feigntest-java-LC168\" class=\"blob-code blob-code-inner js-file-line\">\n<\/td>\n        <\/tr>\n        <tr class=\"line\">\n          <td id=\"file-feigntest-java-L169\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"169\"><\/td>\n          <td id=\"file-feigntest-java-LC169\" class=\"blob-code blob-code-inner js-file-line\">    verify(clientMock, times(2)).execute(any(Request.class), any(Options.class));<\/td>\n        <\/tr>\n        <tr class=\"line\">\n          <td id=\"file-feigntest-java-L170\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"170\"><\/td>\n          <td id=\"file-feigntest-java-LC170\" class=\"blob-code blob-code-inner js-file-line\">\n<\/td>\n        <\/tr>\n        <tr class=\"line\">\n          <td id=\"file-feigntest-java-L171\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"171\"><\/td>\n          <td id=\"file-feigntest-java-LC171\" class=\"blob-code blob-code-inner js-file-line\">  }<\/td>\n        <\/tr>\n        \n  <\/table>\n<\/div>\n\n\n    <\/div>\n\n  <\/div>\n\n<\/div>\n\n      <\/div>\n      <div class=\"gist-meta\">\n        <a href=\"https:\/\/gist.github.com\/mwiede\/3eeaa0566119f0a3aabf48b5e093d635\/raw\/bd1a8b555712d4e5dffbda0b794adb9dd280c2d1\/FeignTest.java\" style=\"float:right\" class=\"Link--inTextBlock\">view raw<\/a>\n        <a href=\"https:\/\/gist.github.com\/mwiede\/3eeaa0566119f0a3aabf48b5e093d635#file-feigntest-java\" class=\"Link--inTextBlock\">\n          FeignTest.java\n        <\/a>\n        hosted with &#10084; by <a class=\"Link--inTextBlock\" href=\"https:\/\/github.com\">GitHub<\/a>\n      <\/div>\n    <\/div>\n<\/div>\n<\/body><\/html>\n\n<p>You can download my example on <a href=\"https:\/\/github.com\/mwiede\/explore-feign\">Github<\/a>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Feign is a library, which makes it easier to implement a http client. Recently more and more people start writing http clients, because they are creating microservices which communicate with http protocol. So there are all sorts of libraries supporting this task like Jersey, Resteasy and others &#8211; and there is Feign. Today I do &hellip; <a href=\"https:\/\/www.matez.de\/index.php\/2017\/04\/12\/exploring-feign-retrying\/\" class=\"more-link\">Continue reading<span class=\"screen-reader-text\"> &#8220;Exploring Feign &#8211; Retrying&#8221;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[1],"tags":[3,4,5,2],"_links":{"self":[{"href":"https:\/\/www.matez.de\/index.php\/wp-json\/wp\/v2\/posts\/29"}],"collection":[{"href":"https:\/\/www.matez.de\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.matez.de\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.matez.de\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.matez.de\/index.php\/wp-json\/wp\/v2\/comments?post=29"}],"version-history":[{"count":8,"href":"https:\/\/www.matez.de\/index.php\/wp-json\/wp\/v2\/posts\/29\/revisions"}],"predecessor-version":[{"id":49,"href":"https:\/\/www.matez.de\/index.php\/wp-json\/wp\/v2\/posts\/29\/revisions\/49"}],"wp:attachment":[{"href":"https:\/\/www.matez.de\/index.php\/wp-json\/wp\/v2\/media?parent=29"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.matez.de\/index.php\/wp-json\/wp\/v2\/categories?post=29"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.matez.de\/index.php\/wp-json\/wp\/v2\/tags?post=29"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}