{"componentChunkName":"component---src-templates-blog-post-js","path":"/spring-feign-assincrono/","result":{"data":{"markdownRemark":{"html":"<p>Muitas vezes precisamos fazer comunicação com outros serviços externos, seja um GET, um POST ou etc. e por diversas vezes podemos fazer esse processamento de forma assíncrona, sem precisar esperar pela resposta. E se ocorre uma falha nessa requisição HTTP o que fazer? As vezes a resposta pode ser simples as vezes não, mas seria bom poder ter uma forma de poder retentar fazer essa chamada ou então guardar isso para poder fazer essa requisição mais tarde.\nVamos fazer uma requisição para buscar no site do Correios e ver aqui uma alternativa a isso usando Feign para fazer as chamadas assíncronas  e primeira retentativa e o mecanismo de Scheduling que o Spring nos provê para fazer o agendamento de requisições que falharam.\nPara esse projeto estou usando Spring Boot e com Gradle para gerenciar as dependências.</p>\n<h2 id=\"Client\" style=\"position:relative;\">Client<a href=\"#Client\" aria-label=\"Client permalink\" class=\"anchor after\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a></h2>\n<p>Vamos começar com o nosso client que irá fazer a buscar:</p>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\"><span class=\"token annotation punctuation\">@FeignClient</span><span class=\"token punctuation\">(</span>name <span class=\"token operator\">=</span> <span class=\"token string\">\"cepClient\"</span><span class=\"token punctuation\">,</span> url <span class=\"token operator\">=</span> <span class=\"token string\">\"${externalUrl}\"</span><span class=\"token punctuation\">)</span>\n<span class=\"token keyword\">public</span> <span class=\"token keyword\">interface</span> <span class=\"token class-name\">CepClient</span> <span class=\"token punctuation\">{</span>\n\n    <span class=\"token annotation punctuation\">@GetMapping</span><span class=\"token punctuation\">(</span>value <span class=\"token operator\">=</span> <span class=\"token string\">\"/v1/cep/{cep}\"</span><span class=\"token punctuation\">)</span>\n    <span class=\"token class-name\">Cep</span> <span class=\"token function\">get</span><span class=\"token punctuation\">(</span><span class=\"token annotation punctuation\">@PathVariable</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"cep\"</span><span class=\"token punctuation\">)</span> <span class=\"token class-name\">String</span> cep<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Aqui usamos o <strong>FeignClient</strong> e criamos uma interface onde temos um método chamado get que anotamos com um <em>@GetMapping</em> com o path do CEP. A nossa interface é anotada com o <em>@FeignClient</em> onde passamos um name para ele e a url que está no nossa arquivo de properties. E mapeamos o retorno com o objeto Cep que contém as informações:</p>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\"><span class=\"token annotation punctuation\">@Data</span>\n<span class=\"token keyword\">public</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">Cep</span> <span class=\"token punctuation\">{</span>\n\n    <span class=\"token keyword\">private</span> <span class=\"token class-name\">String</span> logradouro<span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">private</span> <span class=\"token class-name\">String</span> bairro<span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">private</span> <span class=\"token class-name\">String</span> cidade<span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">private</span> <span class=\"token class-name\">String</span> estado<span class=\"token punctuation\">;</span>\n\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Até aqui se usarmos esse client teremos uma requisição HTTP do tipo GET síncrona e para deixar ela de forma assíncrona devemos fazer a nossa configuração:</p>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\"><span class=\"token annotation punctuation\">@Configuration</span>\n<span class=\"token annotation punctuation\">@EnableAsync</span>\n<span class=\"token keyword\">public</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">ThreadPoolTaskAsyncConfig</span> <span class=\"token punctuation\">{</span>\n\n    <span class=\"token annotation punctuation\">@Bean</span><span class=\"token punctuation\">(</span>name <span class=\"token operator\">=</span> <span class=\"token string\">\"threadPoolTaskAsyncExecutor\"</span><span class=\"token punctuation\">)</span>\n    <span class=\"token keyword\">public</span> <span class=\"token class-name\">Executor</span> <span class=\"token function\">threadPoolTaskExecutor</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token class-name\">ThreadPoolTaskExecutor</span> threadPoolTaskExecutor <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">ThreadPoolTaskExecutor</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        threadPoolTaskExecutor<span class=\"token punctuation\">.</span><span class=\"token function\">setMaxPoolSize</span><span class=\"token punctuation\">(</span><span class=\"token number\">50</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        threadPoolTaskExecutor<span class=\"token punctuation\">.</span><span class=\"token function\">setCorePoolSize</span><span class=\"token punctuation\">(</span><span class=\"token number\">50</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        threadPoolTaskExecutor<span class=\"token punctuation\">.</span><span class=\"token function\">setQueueCapacity</span><span class=\"token punctuation\">(</span><span class=\"token number\">50</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token keyword\">return</span> threadPoolTaskExecutor<span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Aqui criamos a nossa classe de configuração com a anotação <em>@Configuration</em> e também adicionamos a <em>@EnableAsync</em> que nos permite fazer essa comunicação assíncrona. Temos o nosso <em>@Bean</em> nomeado <strong>threadPoolTaskAsyncExecutor</strong> e nele definimos um novo ThreadPoolTaskExecutor e configuramos para que tenha uma capacidade de processar até 50 threads, se por acaso tiver um número maior o processo fica em espera.\nCom isso temos o serviço podendo ser usado de forma assíncrona mas vamos ver agora como podemos tratar eventuais falhas quando formos fazer esse GET, caso a API esteja fora por exemplo, como podemos resolver isso?\nPor padrão o Feign lida com nas requisições com a interface <strong>Retryer</strong> então podemos implementar essa interface:</p>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\"><span class=\"token annotation punctuation\">@Slf4j</span>\n<span class=\"token annotation punctuation\">@Component</span>\n<span class=\"token annotation punctuation\">@NoArgsConstructor</span>\n<span class=\"token keyword\">public</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">CustomRetryer</span> <span class=\"token keyword\">implements</span> <span class=\"token class-name\">Retryer</span> <span class=\"token punctuation\">{</span>\n\n    <span class=\"token annotation punctuation\">@Value</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"${retryMaxAttempt}\"</span><span class=\"token punctuation\">)</span>\n    <span class=\"token keyword\">private</span> <span class=\"token keyword\">int</span> retryMaxAttempt<span class=\"token punctuation\">;</span>\n\n    <span class=\"token annotation punctuation\">@Value</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"${retryInterval}\"</span><span class=\"token punctuation\">)</span>\n    <span class=\"token keyword\">private</span> <span class=\"token keyword\">long</span> retryInterval<span class=\"token punctuation\">;</span>\n\n    <span class=\"token keyword\">private</span> <span class=\"token keyword\">int</span> attempt <span class=\"token operator\">=</span> <span class=\"token number\">1</span><span class=\"token punctuation\">;</span>\n\n    <span class=\"token keyword\">public</span> <span class=\"token class-name\">CustomRetryer</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">int</span> retryMaxAttempt<span class=\"token punctuation\">,</span> <span class=\"token class-name\">Long</span> retryInterval<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>retryMaxAttempt <span class=\"token operator\">=</span> retryMaxAttempt<span class=\"token punctuation\">;</span>\n        <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>retryInterval <span class=\"token operator\">=</span> retryInterval<span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n\n    <span class=\"token annotation punctuation\">@Override</span>\n    <span class=\"token keyword\">public</span> <span class=\"token keyword\">void</span> <span class=\"token function\">continueOrPropagate</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">RetryableException</span> e<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        log<span class=\"token punctuation\">.</span><span class=\"token function\">info</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"Feign retry attempt {} due to {} \"</span><span class=\"token punctuation\">,</span> attempt<span class=\"token punctuation\">,</span> e<span class=\"token punctuation\">.</span><span class=\"token function\">getMessage</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n        <span class=\"token keyword\">if</span><span class=\"token punctuation\">(</span>attempt<span class=\"token operator\">++</span> <span class=\"token operator\">==</span> retryMaxAttempt<span class=\"token punctuation\">)</span><span class=\"token punctuation\">{</span>\n            <span class=\"token keyword\">throw</span> e<span class=\"token punctuation\">;</span>\n        <span class=\"token punctuation\">}</span>\n        <span class=\"token keyword\">try</span> <span class=\"token punctuation\">{</span>\n            <span class=\"token class-name\">Thread</span><span class=\"token punctuation\">.</span><span class=\"token function\">sleep</span><span class=\"token punctuation\">(</span>retryInterval<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token punctuation\">}</span> <span class=\"token keyword\">catch</span> <span class=\"token punctuation\">(</span><span class=\"token class-name\">InterruptedException</span> ignored<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n            <span class=\"token class-name\">Thread</span><span class=\"token punctuation\">.</span><span class=\"token function\">currentThread</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">interrupt</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token punctuation\">}</span>\n\n    <span class=\"token punctuation\">}</span>\n\n    <span class=\"token annotation punctuation\">@Override</span>\n    <span class=\"token keyword\">public</span> <span class=\"token class-name\">Retryer</span> <span class=\"token function\">clone</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">return</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">CustomRetryer</span><span class=\"token punctuation\">(</span>retryMaxAttempt<span class=\"token punctuation\">,</span> retryInterval<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Explicando o código acima.\nImplementando essa interface <strong>Retryer</strong> temos os métodos <em>clone</em> e <em>continueOrPropagate</em>, no nosso <em>clone</em> instanciamos o nosso <strong>CustomRetryer</strong> onde passamos a quantidade máxima de tentativas para o retry e o intervalo para cada solicitação.\nNo <em>continueOrPropagate</em> recebemos a Exception e checamos se já estouramos o limite de retentativas e caso seja isso propagamos a Exception caso não esperamos o tempo que configuramos e Feign irá fazer o retry.\nO último detalhe que falta é que precisamos da anotação <em>@EnableFeignClients</em> que podemos colocar junto da nossa classe main:</p>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\"><span class=\"token keyword\">package</span> <span class=\"token namespace\">com<span class=\"token punctuation\">.</span>example<span class=\"token punctuation\">.</span>demo</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">import</span> <span class=\"token namespace\">org<span class=\"token punctuation\">.</span>springframework<span class=\"token punctuation\">.</span>boot<span class=\"token punctuation\">.</span></span><span class=\"token class-name\">SpringApplication</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> <span class=\"token namespace\">org<span class=\"token punctuation\">.</span>springframework<span class=\"token punctuation\">.</span>boot<span class=\"token punctuation\">.</span>autoconfigure<span class=\"token punctuation\">.</span></span><span class=\"token class-name\">SpringBootApplication</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> <span class=\"token namespace\">org<span class=\"token punctuation\">.</span>springframework<span class=\"token punctuation\">.</span>cloud<span class=\"token punctuation\">.</span>openfeign<span class=\"token punctuation\">.</span></span><span class=\"token class-name\">EnableFeignClients</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">import</span> <span class=\"token namespace\">java<span class=\"token punctuation\">.</span>util<span class=\"token punctuation\">.</span></span><span class=\"token class-name\">Optional</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token annotation punctuation\">@SpringBootApplication</span>\n<span class=\"token annotation punctuation\">@EnableFeignClients</span>\n<span class=\"token keyword\">public</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">DemoApplication</span> <span class=\"token punctuation\">{</span>\n\n\n\t<span class=\"token keyword\">public</span> <span class=\"token keyword\">static</span> <span class=\"token keyword\">void</span> <span class=\"token function\">main</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">String</span><span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span> args<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n\t\t<span class=\"token class-name\">SpringApplication</span><span class=\"token punctuation\">.</span><span class=\"token function\">run</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">DemoApplication</span><span class=\"token punctuation\">.</span><span class=\"token keyword\">class</span><span class=\"token punctuation\">,</span> args<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\t<span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<h2 id=\"Service\" style=\"position:relative;\">Service<a href=\"#Service\" aria-label=\"Service permalink\" class=\"anchor after\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a></h2>\n<p>Com o nosso <em>client</em> criado vamos fazer a nossa camada de serviço que é quem irá fazer uso o do <em>client</em> de forma assíncrona, vamos começar criando a classe <strong>ConsultService</strong>:</p>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\"><span class=\"token annotation punctuation\">@Service</span>\n<span class=\"token keyword\">public</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">ConsultService</span> <span class=\"token punctuation\">{</span>\n\n    <span class=\"token annotation punctuation\">@Autowired</span>\n    <span class=\"token keyword\">private</span> <span class=\"token class-name\">CepClient</span> client<span class=\"token punctuation\">;</span>\n\n    <span class=\"token keyword\">public</span> <span class=\"token class-name\">Optional</span><span class=\"token generics\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">Cep</span><span class=\"token punctuation\">></span></span> <span class=\"token function\">consultCep</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">String</span> cep<span class=\"token punctuation\">)</span><span class=\"token punctuation\">{</span>\n\n        <span class=\"token keyword\">try</span> <span class=\"token punctuation\">{</span>\n            <span class=\"token class-name\">Cep</span> cepResponse <span class=\"token operator\">=</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span><span class=\"token function\">getByCep</span><span class=\"token punctuation\">(</span>cep<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">get</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n            <span class=\"token keyword\">return</span> <span class=\"token class-name\">Optional</span><span class=\"token punctuation\">.</span><span class=\"token function\">of</span><span class=\"token punctuation\">(</span>cepResponse<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n        <span class=\"token punctuation\">}</span><span class=\"token keyword\">catch</span> <span class=\"token punctuation\">(</span><span class=\"token class-name\">RetryableException</span> <span class=\"token operator\">|</span> <span class=\"token class-name\">InterruptedException</span> <span class=\"token operator\">|</span> <span class=\"token class-name\">ExecutionException</span> e<span class=\"token punctuation\">)</span><span class=\"token punctuation\">{</span>\n            <span class=\"token comment\">//TODO</span>\n        <span class=\"token punctuation\">}</span>\n\n        <span class=\"token keyword\">return</span> <span class=\"token class-name\">Optional</span><span class=\"token punctuation\">.</span><span class=\"token function\">empty</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n\n    <span class=\"token annotation punctuation\">@Async</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"threadPoolTaskAsyncExecutor\"</span><span class=\"token punctuation\">)</span>\n    <span class=\"token keyword\">public</span> <span class=\"token class-name\">CompletableFuture</span><span class=\"token generics\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">Cep</span><span class=\"token punctuation\">></span></span> <span class=\"token function\">getByCep</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">String</span> cep<span class=\"token punctuation\">)</span><span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">return</span> <span class=\"token class-name\">CompletableFuture</span><span class=\"token punctuation\">.</span><span class=\"token function\">completedFuture</span><span class=\"token punctuation\">(</span>client<span class=\"token punctuation\">.</span><span class=\"token function\">get</span><span class=\"token punctuation\">(</span>cep<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>O ponto a ser observado é o método <em>getByCep</em> que faz a chamada ao <em>client</em> usamos a anotação <em>@Async(“threadPoolTaskAsyncExecutor”)</em> referenciando o nosso <strong>Bean</strong> que configuramos anteriormente e isso já nos permite fazer a chamada de forma assíncrona.\nO método <em>getByCep</em> está envolto em um bloco <em>try/catch</em> que o nosso <strong>CustomRetryer</strong> captura em caso de excessão e faz as retentativas.</p>\n<h2 id=\"Schedule\" style=\"position:relative;\">Schedule<a href=\"#Schedule\" aria-label=\"Schedule permalink\" class=\"anchor after\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a></h2>\n<p>Até agora temos as nossas chamadas de forma assíncrona e um mecanismo de retentativas mas pense na seguinte situação e se a url estiver fora do ar? Não é uma situação que conseguimos resolver mas acreditamos que esse serviço eventualmente será reestabelecido então podemos guardar em algum lugar essa informação que deu errado e depois tentamos fazer a requisição. O Java já nos provê mecanismos para isso e o framework Spring Boot facilita aida mais esse processo, então vamos comçar criando a nossa classe de configuração para o serviço agendado (<em>schedule</em>):</p>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\"><span class=\"token keyword\">package</span> <span class=\"token namespace\">com<span class=\"token punctuation\">.</span>example<span class=\"token punctuation\">.</span>demo<span class=\"token punctuation\">.</span>config</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">import</span> <span class=\"token namespace\">com<span class=\"token punctuation\">.</span>example<span class=\"token punctuation\">.</span>demo<span class=\"token punctuation\">.</span>service<span class=\"token punctuation\">.</span></span><span class=\"token class-name\">ScheduleService</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> <span class=\"token namespace\">org<span class=\"token punctuation\">.</span>springframework<span class=\"token punctuation\">.</span>context<span class=\"token punctuation\">.</span>annotation<span class=\"token punctuation\">.</span></span><span class=\"token class-name\">Bean</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> <span class=\"token namespace\">org<span class=\"token punctuation\">.</span>springframework<span class=\"token punctuation\">.</span>context<span class=\"token punctuation\">.</span>annotation<span class=\"token punctuation\">.</span></span><span class=\"token class-name\">ComponentScan</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> <span class=\"token namespace\">org<span class=\"token punctuation\">.</span>springframework<span class=\"token punctuation\">.</span>context<span class=\"token punctuation\">.</span>annotation<span class=\"token punctuation\">.</span></span><span class=\"token class-name\">Configuration</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> <span class=\"token namespace\">org<span class=\"token punctuation\">.</span>springframework<span class=\"token punctuation\">.</span>scheduling<span class=\"token punctuation\">.</span>concurrent<span class=\"token punctuation\">.</span></span><span class=\"token class-name\">ThreadPoolTaskScheduler</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token annotation punctuation\">@Configuration</span>\n<span class=\"token annotation punctuation\">@ComponentScan</span><span class=\"token punctuation\">(</span>basePackages <span class=\"token operator\">=</span> <span class=\"token string\">\"com.example.demo.service\"</span><span class=\"token punctuation\">,</span> basePackageClasses <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span><span class=\"token class-name\">ScheduleService</span><span class=\"token punctuation\">.</span><span class=\"token keyword\">class</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n<span class=\"token keyword\">public</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">ThreadPoolTaskSchedulerConfig</span> <span class=\"token punctuation\">{</span>\n\n    <span class=\"token annotation punctuation\">@Bean</span>\n    <span class=\"token keyword\">public</span> <span class=\"token class-name\">ThreadPoolTaskScheduler</span> <span class=\"token function\">threadPoolTaskScheduler</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token class-name\">ThreadPoolTaskScheduler</span> threadPoolTaskScheduler <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">ThreadPoolTaskScheduler</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        threadPoolTaskScheduler<span class=\"token punctuation\">.</span><span class=\"token function\">setPoolSize</span><span class=\"token punctuation\">(</span><span class=\"token number\">5</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        threadPoolTaskScheduler<span class=\"token punctuation\">.</span><span class=\"token function\">setThreadNamePrefix</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"ScheduleService\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token keyword\">return</span> threadPoolTaskScheduler<span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Aqui temos o código onde temos a classe de configuração anotada com <em>Configuration</em> e adicionado o caminho do pacote e a classe que irá fazer o agendamento que ainda não criamos. No nosso <strong>Bean</strong> criamos uma instância de <strong>ThreadPoolTaskScheduler</strong> com um pool de 5 threads e nomeamos com o prefixo <em>ScheduleService</em>.\nAntes de continuar com as próximas configurações de schedule vamos fazer o mecanismo onde guardamos os dados das requisições que falharam e que deverão ser reprocessadas, vamos usar para fins de exemplo um banco de dados em memória, H2, e <strong>Spring Data</strong> para fazer o gerenciamento do banco.\nVamos começar criando a nossa <em>model</em> que iserá a representação da nossa tabela de banco de dados:</p>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\"><span class=\"token annotation punctuation\">@Data</span>\n<span class=\"token annotation punctuation\">@Entity</span>\n<span class=\"token annotation punctuation\">@NoArgsConstructor</span>\n<span class=\"token keyword\">public</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">Response</span> <span class=\"token punctuation\">{</span>\n\n    <span class=\"token annotation punctuation\">@Id</span>\n    <span class=\"token keyword\">private</span> <span class=\"token class-name\">String</span> cep<span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">private</span> <span class=\"token class-name\">Date</span> create_at<span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">private</span> <span class=\"token class-name\">Date</span> update_at<span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">private</span> <span class=\"token class-name\">String</span> logradouro<span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">private</span> <span class=\"token class-name\">String</span> bairro<span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">private</span> <span class=\"token class-name\">String</span> cidade<span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">private</span> <span class=\"token class-name\">String</span> estado<span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">private</span> <span class=\"token keyword\">boolean</span> success<span class=\"token punctuation\">;</span>\n\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>O campo que usaremos para fazer o nosso controle é o <em>success</em> que é um booleano. Vamos criar agora a nossa interface de comunicação que extende da interface <strong>JpaRepository</strong>:</p>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\"><span class=\"token annotation punctuation\">@Repository</span>\n<span class=\"token keyword\">public</span> <span class=\"token keyword\">interface</span> <span class=\"token class-name\">ResponseRepository</span> <span class=\"token keyword\">extends</span> <span class=\"token class-name\">JpaRepository</span><span class=\"token generics\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">Response</span><span class=\"token punctuation\">,</span> <span class=\"token class-name\">Integer</span><span class=\"token punctuation\">></span></span> <span class=\"token punctuation\">{</span>\n\n    <span class=\"token class-name\">Optional</span><span class=\"token generics\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">List</span><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">Response</span><span class=\"token punctuation\">></span><span class=\"token punctuation\">></span></span> <span class=\"token function\">findAllBySuccessIsFalse</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n    <span class=\"token class-name\">Optional</span><span class=\"token generics\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">Response</span><span class=\"token punctuation\">></span></span> <span class=\"token function\">findByCep</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">String</span> cep<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Com essa herança de interface passamos a ter os métodos de gerenciamento que o <strong>JpaRepository</strong> nos dá mas ainda precisamos adicionar mais alguns um pouco mais específicos, graças ao <strong>Spring Data</strong> podemos fazer nossas querys usando <em>query methods</em> onde definimos a nossa busca, nesse caso, pela nomenclatura do método mais explicações estão aqui <a href=\"https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#jpa.query-methods\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Query Methods</a>.\nVamos criar nossa classe de serviço agendado:</p>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\"><span class=\"token annotation punctuation\">@Component</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"scheduleService\"</span><span class=\"token punctuation\">)</span>\n<span class=\"token keyword\">public</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">ScheduleService</span> <span class=\"token punctuation\">{</span>\n\n    <span class=\"token annotation punctuation\">@Value</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"${cronTimer.reprocess}\"</span><span class=\"token punctuation\">)</span>\n    <span class=\"token keyword\">private</span> <span class=\"token class-name\">String</span> reprocess<span class=\"token punctuation\">;</span>\n\n    <span class=\"token annotation punctuation\">@Autowired</span>\n    <span class=\"token keyword\">private</span> <span class=\"token class-name\">ThreadPoolTaskScheduler</span> taskScheduler<span class=\"token punctuation\">;</span>\n\n    <span class=\"token annotation punctuation\">@Autowired</span>\n    <span class=\"token keyword\">private</span> <span class=\"token class-name\">ResponseRepository</span> repository<span class=\"token punctuation\">;</span>\n\n    <span class=\"token annotation punctuation\">@Autowired</span>\n    <span class=\"token keyword\">private</span> <span class=\"token class-name\">ConsultService</span> consultService<span class=\"token punctuation\">;</span>\n\n    <span class=\"token annotation punctuation\">@PostConstruct</span>\n    <span class=\"token keyword\">public</span> <span class=\"token keyword\">void</span> <span class=\"token function\">init</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        taskScheduler<span class=\"token punctuation\">.</span><span class=\"token function\">schedule</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">-></span> <span class=\"token punctuation\">{</span>\n            repository<span class=\"token punctuation\">.</span><span class=\"token function\">findAllBySuccessIsFalse</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">ifPresent</span><span class=\"token punctuation\">(</span>cepList <span class=\"token operator\">-></span> cepList<span class=\"token punctuation\">.</span><span class=\"token function\">forEach</span><span class=\"token punctuation\">(</span>cep <span class=\"token operator\">-></span> consultService<span class=\"token punctuation\">.</span><span class=\"token function\">consultCep</span><span class=\"token punctuation\">(</span>cep<span class=\"token punctuation\">.</span><span class=\"token function\">getCep</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">CronTrigger</span><span class=\"token punctuation\">(</span>reprocess<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Explicando o código acima temos nossa classe que é um <em>Component</em> do <strong>Spring</strong> e nele injetamos o nosso <em>Scheduler</em>, <em>Repository</em> e <em>Service</em> ainda temos a variável <em>reprocess</em> onde definimos uma expressão <em>Cron</em>: <code class=\"language-text\">0 */1 * * * *</code>\n(Para saber mais sobre <a href=\"https://www.baeldung.com/cron-expressions\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Cron Expressions</a>)</p>\n<p>Onde ele vai rodar a cada minuto a nossa <em>taskScheduler</em> e faz uma busca na nossa <em>repository</em> todos os registros onde o campo <em>success</em> for <code class=\"language-text\">false</code> e vai chamar a nossa <em>service</em>.\nPara finalizar a nossa única alteração será na nossa <em>service</em> onde vamos começar a salvar os registros das nossas requisições e no campo <em>success</em> definimos se foi sucesso <code class=\"language-text\">true</code> ou falha <code class=\"language-text\">false</code>:</p>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\"><span class=\"token annotation punctuation\">@Service</span>\n<span class=\"token keyword\">public</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">ConsultService</span> <span class=\"token punctuation\">{</span>\n\n    <span class=\"token annotation punctuation\">@Autowired</span>\n    <span class=\"token keyword\">private</span> <span class=\"token class-name\">CepClient</span> client<span class=\"token punctuation\">;</span>\n\n    <span class=\"token annotation punctuation\">@Autowired</span>\n    <span class=\"token keyword\">private</span> <span class=\"token class-name\">ResponseRepository</span> repository<span class=\"token punctuation\">;</span>\n\n    <span class=\"token keyword\">public</span> <span class=\"token class-name\">Optional</span><span class=\"token generics\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">Cep</span><span class=\"token punctuation\">></span></span> <span class=\"token function\">consultCep</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">String</span> cep<span class=\"token punctuation\">)</span><span class=\"token punctuation\">{</span>\n\n        <span class=\"token keyword\">try</span> <span class=\"token punctuation\">{</span>\n            <span class=\"token class-name\">Cep</span> cepResponse <span class=\"token operator\">=</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span><span class=\"token function\">getByCep</span><span class=\"token punctuation\">(</span>cep<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">get</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n            <span class=\"token class-name\">Response</span> response <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Response</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n            response<span class=\"token punctuation\">.</span><span class=\"token function\">setCep</span><span class=\"token punctuation\">(</span>cep<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n            response<span class=\"token punctuation\">.</span><span class=\"token function\">setCreate_at</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">new</span> <span class=\"token class-name\">Date</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n            response<span class=\"token punctuation\">.</span><span class=\"token function\">setLogradouro</span><span class=\"token punctuation\">(</span>cepResponse<span class=\"token punctuation\">.</span><span class=\"token function\">getLogradouro</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n            response<span class=\"token punctuation\">.</span><span class=\"token function\">setBairro</span><span class=\"token punctuation\">(</span>cepResponse<span class=\"token punctuation\">.</span><span class=\"token function\">getBairro</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n            response<span class=\"token punctuation\">.</span><span class=\"token function\">setCidade</span><span class=\"token punctuation\">(</span>cepResponse<span class=\"token punctuation\">.</span><span class=\"token function\">getCidade</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n            response<span class=\"token punctuation\">.</span><span class=\"token function\">setEstado</span><span class=\"token punctuation\">(</span>cepResponse<span class=\"token punctuation\">.</span><span class=\"token function\">getEstado</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n            repository<span class=\"token punctuation\">.</span><span class=\"token function\">save</span><span class=\"token punctuation\">(</span>response<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n            <span class=\"token keyword\">return</span> <span class=\"token class-name\">Optional</span><span class=\"token punctuation\">.</span><span class=\"token function\">of</span><span class=\"token punctuation\">(</span>cepResponse<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n        <span class=\"token punctuation\">}</span><span class=\"token keyword\">catch</span> <span class=\"token punctuation\">(</span><span class=\"token class-name\">RetryableException</span> <span class=\"token operator\">|</span> <span class=\"token class-name\">InterruptedException</span> <span class=\"token operator\">|</span> <span class=\"token class-name\">ExecutionException</span> e<span class=\"token punctuation\">)</span><span class=\"token punctuation\">{</span>\n\n            <span class=\"token class-name\">Optional</span><span class=\"token generics\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">Response</span><span class=\"token punctuation\">></span></span> repositoryById <span class=\"token operator\">=</span> repository<span class=\"token punctuation\">.</span><span class=\"token function\">findByCep</span><span class=\"token punctuation\">(</span>cep<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n            <span class=\"token class-name\">Response</span> response<span class=\"token punctuation\">;</span>\n\n            <span class=\"token keyword\">if</span><span class=\"token punctuation\">(</span>repositoryById<span class=\"token punctuation\">.</span><span class=\"token function\">isPresent</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">{</span>\n                response <span class=\"token operator\">=</span> repositoryById<span class=\"token punctuation\">.</span><span class=\"token function\">get</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n                response<span class=\"token punctuation\">.</span><span class=\"token function\">setUpdate_at</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">new</span> <span class=\"token class-name\">Date</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n            <span class=\"token punctuation\">}</span><span class=\"token keyword\">else</span> <span class=\"token punctuation\">{</span>\n                response <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Response</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n                response<span class=\"token punctuation\">.</span><span class=\"token function\">setCep</span><span class=\"token punctuation\">(</span>cep<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n                response<span class=\"token punctuation\">.</span><span class=\"token function\">setCreate_at</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">new</span> <span class=\"token class-name\">Date</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n            <span class=\"token punctuation\">}</span>\n\n            repository<span class=\"token punctuation\">.</span><span class=\"token function\">save</span><span class=\"token punctuation\">(</span>response<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token punctuation\">}</span>\n\n        <span class=\"token keyword\">return</span> <span class=\"token class-name\">Optional</span><span class=\"token punctuation\">.</span><span class=\"token function\">empty</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n\n    <span class=\"token annotation punctuation\">@Async</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"threadPoolTaskAsyncExecutor\"</span><span class=\"token punctuation\">)</span>\n    <span class=\"token keyword\">public</span> <span class=\"token class-name\">CompletableFuture</span><span class=\"token generics\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">Cep</span><span class=\"token punctuation\">></span></span> <span class=\"token function\">getByCep</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">String</span> cep<span class=\"token punctuation\">)</span><span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">return</span> <span class=\"token class-name\">CompletableFuture</span><span class=\"token punctuation\">.</span><span class=\"token function\">completedFuture</span><span class=\"token punctuation\">(</span>client<span class=\"token punctuation\">.</span><span class=\"token function\">get</span><span class=\"token punctuation\">(</span>cep<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Então aqui temos a nossa chamada assíncrona onde caso dê algum erro o nosso <strong>CustomRetryer</strong> vai tentar algumas vezes e após isso vai salvar como falha para ser processado posteriormente e caso dê certo nós gravamos como um registro de sucesso.</p>\n<h2 id=\"Executando-o-servico\" style=\"position:relative;\">Executando o serviço<a href=\"#Executando-o-servico\" aria-label=\"Executando o servico permalink\" class=\"anchor after\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a></h2>\n<p>Agora vamos rodar tudo junto, pra isso vou usar a interface <strong>CommandLineRunner</strong> para ser executada no momento em que aplicação subir:</p>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\"><span class=\"token annotation punctuation\">@SpringBootApplication</span>\n<span class=\"token annotation punctuation\">@EnableFeignClients</span>\n<span class=\"token annotation punctuation\">@EnableScheduling</span>\n<span class=\"token keyword\">public</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">DemoApplication</span> <span class=\"token keyword\">implements</span> <span class=\"token class-name\">CommandLineRunner</span> <span class=\"token punctuation\">{</span>\n\n\t<span class=\"token annotation punctuation\">@Autowired</span>\n\t<span class=\"token keyword\">private</span> <span class=\"token class-name\">ConsultService</span> service<span class=\"token punctuation\">;</span>\n\n\t<span class=\"token keyword\">public</span> <span class=\"token keyword\">static</span> <span class=\"token keyword\">void</span> <span class=\"token function\">main</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">String</span><span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span> args<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n\t\t<span class=\"token class-name\">SpringApplication</span><span class=\"token punctuation\">.</span><span class=\"token function\">run</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">DemoApplication</span><span class=\"token punctuation\">.</span><span class=\"token keyword\">class</span><span class=\"token punctuation\">,</span> args<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\t<span class=\"token punctuation\">}</span>\n\n\t<span class=\"token annotation punctuation\">@Override</span>\n\t<span class=\"token keyword\">public</span> <span class=\"token keyword\">void</span> <span class=\"token function\">run</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">String</span><span class=\"token punctuation\">.</span><span class=\"token punctuation\">.</span><span class=\"token punctuation\">.</span> args<span class=\"token punctuation\">)</span> <span class=\"token keyword\">throws</span> <span class=\"token class-name\">Exception</span> <span class=\"token punctuation\">{</span>\n\t\t<span class=\"token class-name\">Optional</span><span class=\"token generics\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">Cep</span><span class=\"token punctuation\">></span></span> cep <span class=\"token operator\">=</span> service<span class=\"token punctuation\">.</span><span class=\"token function\">consultCep</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"01032000\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\t\tcep<span class=\"token punctuation\">.</span><span class=\"token function\">ifPresent</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">System</span><span class=\"token punctuation\">.</span>out<span class=\"token operator\">::</span><span class=\"token function\">println</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\t<span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Coloquei na classe <em>main</em> mesmo; então no momento da execução ele irá fazer a busca com o CEP informado.</p>\n<h2 id=\"Conclusao\" style=\"position:relative;\">Conclusão<a href=\"#Conclusao\" aria-label=\"Conclusao permalink\" class=\"anchor after\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a></h2>\n<p>Vimos aqui uma dentre outras mil formas que podemos pensar em fazer chamadas HTTP com um client de forma assíncrona, pensando em possíveis cenários de falha e com uma tentativa de reprocessamento agendado.\nSegue o link do projeto no <a href=\"https://github.com/guilhermegarcia86/feign-retry\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">GitHub</a></p>","fields":{"slug":"/spring-feign-assincrono/"},"frontmatter":{"date":"08 de setembro de 2020","description":"Como fazer chamadas REST assíncronas com Feign e com retry e agendamento","title":"Comunicação assíncrona com Feign","tags":["Desenvolvimento","Spring Boot","Feign","Assíncrono","Schedule"],"author":"Guilherme Alves","image":{"id":"b7134ed9-ef1a-5502-81b1-a3b71dd6282d","publicURL":"/static/b3d0cee8a895d39bf6956e6b74f24a93/spring.jpeg","childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAKABQDASIAAhEBAxEB/8QAFwABAQEBAAAAAAAAAAAAAAAAAAMCBf/EABUBAQEAAAAAAAAAAAAAAAAAAAIB/9oADAMBAAIQAxAAAAHrN0BksV//xAAaEAEBAAIDAAAAAAAAAAAAAAABAgADEiIx/9oACAEBAAEFAuzWykzXSzYckEPP/8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPwE//8QAFREBAQAAAAAAAAAAAAAAAAAAAAH/2gAIAQIBAT8BR//EABsQAAEEAwAAAAAAAAAAAAAAAAABEBEhMlFh/9oACAEBAAY/Aso4JBsSi2//xAAZEAEBAQEBAQAAAAAAAAAAAAABEQAhQWH/2gAIAQEAAT8hbnmMAYgpL6e7pBhlyLjSAE+4BAQ3/9oADAMBAAIAAwAAABBT3//EABcRAQADAAAAAAAAAAAAAAAAAAABMVH/2gAIAQMBAT8Q1FP/xAAYEQEBAAMAAAAAAAAAAAAAAAABABEhQf/aAAgBAgEBPxDjBwbv/8QAHBABAAICAwEAAAAAAAAAAAAAAQARITFBgbHw/9oACAEBAAE/EKOv9gUOYMAstV04PeowzALmftdRSQuFTcyArQsgoQaAon//2Q==","aspectRatio":1.9875776397515528,"src":"/static/b3d0cee8a895d39bf6956e6b74f24a93/f496a/spring.jpg","srcSet":"/static/b3d0cee8a895d39bf6956e6b74f24a93/1983d/spring.jpg 320w,\n/static/b3d0cee8a895d39bf6956e6b74f24a93/f496a/spring.jpg 574w","sizes":"(max-width: 574px) 100vw, 574px"}}}},"timeToRead":8}},"pageContext":{"slug":"/spring-feign-assincrono/","previous":{"fields":{"slug":"/minha-experiencia-com-a-laboratoria/"},"frontmatter":{"title":"Minha experiência com a Laboratória","date":"08 set, 2020"}},"next":{"fields":{"slug":"/factory-strategy/"},"frontmatter":{"title":"Usando padrões de projeto em uma aplicação","date":"14 set, 2020"}}}},"staticQueryHashes":["63159454"]}