package Ġmic ronaut . kotlin . coroutine . sample . mic ronaut Ċ Ċ import Ġio . kot est . assertions . throw ables . should Throw Exactly Ċ import Ġio . kot est . core . spec . style . String Spec Ċ import Ġio . mic ronaut . context . ApplicationContext Ċ import Ġio . mic ronaut . context . annotation . Prototype Ċ import Ġio . mic ronaut . context . event . Application EventListener Ċ import Ġio . mic ronaut . context . event . Application Event Publisher Ċ import Ġio . mic ronaut . retry . annotation . Circuit Breaker Ċ import Ġio . mic ronaut . retry . annotation . Retry able Ċ import Ġio . mic ronaut . retry . event . Circuit Closed Event Ċ import Ġio . mic ronaut . retry . event . Circuit Open Event Ċ import Ġio . mic ronaut . retry . event . Retry Event Ċ import Ġio . mic ronaut . retry . event . Retry EventListener Ċ import Ġio . mic ronaut . test . extensions . kot est . annotation . Mic ronaut Test Ċ import Ġio . reactivex . Flow able Ċ import Ġio . reactivex . schedul ers . Schedulers Ċ import Ġkotlinx . coroutines . delay Ċ import Ġkotlinx . coroutines . flow . Flow Ċ import Ġkotlinx . coroutines . flow . collect Ċ import Ġkotlinx . coroutines . flow . flow Ċ import Ġorg . slf 4 j . LoggerFactory Ċ import Ġjava . util . concurrent . Comp letableFuture Ċ import Ġjavax . inject . Inject Ċ import Ġjavax . inject . Singleton Ċ Ċ private Ġval Ġlog Ġ= ĠLoggerFactory . getLogger (" Retry Test ") Ċ Ċ @ Mic ronaut Test Ċ class ĠRetry Test ( ĊĠĠĠ Ġapplication Context : ĠApplication Context Ċ ) Ġ: ĠString Spec ({ ĊĠĠĠ Ġ" 3 Ġretry Ġ 1 Ġs Ġdelay Ġ( Default ) ĠSetting " Ġ{ ĊĠĠĠĠĠĠĠ Ġlog . info (" Start Ġ 3 Ġretry Ġ 1 Ġs Ġdelay Ġ( Default ) ĠSetting ") ĊĠĠĠĠĠĠĠ Ġ// Ġ 2 Ġ åĽŀ å¤± æķ Ĺ ãģĹãģ¦ ãĢģ 3 Ġ åĽŀ çĽ® ãģ§ æĪĲåĬŁ ãģĻãĤĭ ĊĠĠĠĠĠĠĠ Ġ// Ġ 1 Ġ ç§Ĵ éĸĵ éļĶ ãģ§ åĨį è© ¦ è¡Į ãģĻãĤĭ ĊĠĠĠĠĠĠĠ Ġval Ġretry Bean Ġ= Ġapplication Context . getBean ( Retry Bean :: class . java ) ĊĠĠĠĠĠĠĠ Ġretry Bean . default Setting ( 3 ) ĊĠĠĠĠĠĠĠ Ġlog . info (" Finish Ġ 3 Ġretry Ġ 1 Ġs Ġdelay Ġ( Default ) ĠSetting ") ĊĠĠĠ Ġ} ĊĠĠĠ Ġ" multiplier ĠSetting " Ġ{ ĊĠĠĠĠĠĠĠ Ġlog . info (" Start Ġmultiplier ĠSetting ") ĊĠĠĠĠĠĠĠ Ġ// Ġmultiplier ĠãĤĴ Ġ 2 Ġãģ« è¨Ńå®ļ ĊĠĠĠĠĠĠĠ Ġval Ġretry Bean Ġ= Ġapplication Context . getBean ( Retry Bean :: class . java ) ĊĠĠĠĠĠĠĠ Ġretry Bean . retry Multiplier ( 3 ) ĊĠĠĠĠĠĠĠ Ġlog . info (" Finish Ġmultiplier ĠSetting ") ĊĠĠĠ Ġ} ĊĠĠĠ Ġ" 5 Ġretry Ġ 2 Ġs Ġdelay ĠSetting " Ġ{ ĊĠĠĠĠĠĠĠ Ġlog . info (" Start Ġ 5 Ġretry Ġ 2 Ġs Ġdelay ĠSetting ") ĊĠĠĠĠĠĠĠ Ġ// Ġ 4 Ġ åĽŀ å¤± æķ Ĺ ãģĹãģ¦ ãĢģ 5 Ġ åĽŀ çĽ® ãģ§ æĪĲåĬŁ ãģĻãĤĭ ĊĠĠĠĠĠĠĠ Ġ// Ġ 2 Ġ ç§Ĵ éĸĵ éļĶ ãģ§ åĨį è© ¦ è¡Į ãģĻãĤĭ ĊĠĠĠĠĠĠĠ Ġval Ġretry Bean Ġ= Ġapplication Context . getBean ( Retry Bean :: class . java ) ĊĠĠĠĠĠĠĠ Ġretry Bean . retry 5 delay 2 ( 5 ) ĊĠĠĠĠĠĠĠ Ġlog . info (" Finish Ġ 5 Ġretry Ġ 2 Ġs Ġdelay ĠSetting ") ĊĠĠĠ Ġ} ĊĠĠĠ Ġ" Configuration ĠSetting " Ġ{ ĊĠĠĠĠĠĠĠ Ġlog . info (" Start ĠConfiguration ĠSetting ") ĊĠĠĠĠĠĠĠ Ġ// Ġapplication . yml Ġãģ® è¨Ńå®ļ åĢ¤ ãĤĴåıĤçħ§ ãģĻãĤĭ ĊĠĠĠĠĠĠĠ Ġval Ġretry Bean Ġ= Ġapplication Context . getBean ( Retry Bean :: class . java ) ĊĠĠĠĠĠĠĠ Ġretry Bean . retry From Config ( 4 ) ĊĠĠĠĠĠĠĠ Ġlog . info (" Finish ĠConfiguration ĠSetting ") ĊĠĠĠ Ġ} ĊĠĠĠ Ġ" Reactive ĠRetry Ġ( Rx Java )" Ġ{ ĊĠĠĠĠĠĠĠ Ġlog . info (" Start ĠReactive ĠRetry Ġ( Rx Java )") ĊĠĠĠĠĠĠĠ Ġval Ġretry Bean Ġ= Ġapplication Context . getBean ( Retry Bean :: class . java ) ĊĠĠĠĠĠĠĠ Ġval Ġflow able Ġ= Ġretry Bean . retry Flow able ( 3 ) Ċ // ĠĠĠĠĠĠĠ Ġflow able . blocking ForEach Ġ{ Ġlog . info (" number : Ġ$ it ") Ġ} ĊĠĠĠĠĠĠĠ Ġfor Ġ( number Ġin Ġflow able . blocking Iterable ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog . info (" number : Ġ$ number ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġlog . info (" Finish ĠReactive ĠRetry Ġ( Rx Java )") ĊĠĠĠ Ġ} ĊĠĠĠ Ġ" Reactive ĠRetry Ġ( Comp letableFuture )" Ġ{ ĊĠĠĠĠĠĠĠ Ġlog . info (" Start ĠReactive ĠRetry Ġ( Comp letableFuture )") ĊĠĠĠĠĠĠĠ Ġval Ġretry Bean Ġ= Ġapplication Context . getBean ( Retry Bean :: class . java ) ĊĠĠĠĠĠĠĠ Ġval Ġfuture Ġ= Ġretry Bean . retry Future ( 3 ) ĊĠĠĠĠĠĠĠ Ġlog . info (" result : Ġ${ future . join () }") ĊĠĠĠĠĠĠĠ Ġlog . info (" Finish ĠReactive ĠRetry Ġ( Comp letableFuture )") ĊĠĠĠ Ġ} ĊĠĠĠ Ġ" Reactive ĠRetry Ġ( Coroutine )" Ġ{ ĊĠĠĠĠĠĠĠ Ġlog . info (" Start ĠReactive ĠRetry Ġ( Coroutine )") ĊĠĠĠĠĠĠĠ Ġval Ġretry Bean Ġ= Ġapplication Context . getBean ( Retry Bean :: class . java ) ĊĠĠĠĠĠĠĠ Ġval Ġflow Ġ= Ġretry Bean . retry Coroutine ( 3 ) ĊĠĠĠĠĠĠĠ Ġflow . collect Ġ{ Ġlog . info (" result : Ġ$ it ") Ġ} ĊĠĠĠĠĠĠĠ Ġlog . info (" Finish ĠReactive ĠRetry Ġ( Coroutine )") ĊĠĠĠ Ġ} ĊĠĠĠ Ġ" Reactive ĠRetry Ġ( Circuit ĠBreak er )" Ġ{ ĊĠĠĠĠĠĠĠ Ġlog . info (" Start ĠReactive ĠRetry Ġ( Circuit ĠBreak er )") ĊĠĠĠĠĠĠĠ Ġval Ġretry Bean Ġ= Ġapplication Context . getBean ( Retry Bean :: class . java ) ĊĠĠĠĠĠĠĠ Ġ// Ġ ãĥª ãĥĪ ãĥ©ãĤ¤ ãĤª ãĥ¼ãĥĲãĥ¼ ãģ¨ ãģªãĤĭ åĽŀ æķ° ãĤĴæĮĩå®ļ ãģĹ ãĢģ å¤± æķ Ĺ å¾Į ãĢģ åį³ åº§ ãģ« Ġ 2 Ġ åĽŀ ãģ® ãĤ¢ãĤ¯ãĤ»ãĤ¹ ãĤĴè¡Į ãģĨ ãĤĪãģĨãģ« ãģĻãĤĭ ãĢĤ ĊĠĠĠĠĠĠĠ Ġrepeat ( 3 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexception Ġ= Ġshould Throw Exactly < IllegalArgumentException > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ åĪĿ åĽŀ ãĤ¢ãĤ¯ãĤ»ãĤ¹ æĻĤ ãģ® ãĥª ãĥĪ ãĥ©ãĤ¤ ãĤª ãĥ¼ãĥĲãĥ¼ ä»¥ å¾Į ãĢģ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġreset Ġãģ« è¨Ńå®ļ ãģĹãģŁ æĻĤéĸĵ ãĤĴ çµ Į éģİ ãģĹãģªãģĦ ãģ¨ ãĢģ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ åĨį ãĤ¢ãĤ¯ãĤ»ãĤ¹ æĻĤ ãģ« ãĢģ ãĥª ãĥĪ ãĥ©ãĤ¤ çĦ¡ ãģĹãģ § åį³ åº§ ãģ« Ġ åĪĿ åĽŀ ãģ¨ åĲĮ ãģĺ ä¾ĭ å¤ĸ ãĤĴ åĨį ãĤ¹ ãĥŃ ãĥ¼ ãģĻãĤĭ ãĢĤ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġretry Bean . circuit Breaker ( 3 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog . info (" exception : Ġ${ exception . message }") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdelay ( 2 0 0 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// Ġreset Ġãģ« è¨Ńå®ļ ãģĹãģŁ æĻĤéĸĵ ãģĮ çµ Į éģİ ãģĻãĤĭ ãģ® ãĤĴ å¾ħ æ©Ł ĊĠĠĠĠĠĠĠ Ġdelay ( 1 0 0 0 ) ĊĠĠĠĠĠĠĠ Ġ// Ġ åĨį ãģ³ ãĤ¢ãĤ¯ãĤ»ãĤ¹ ãģĻãĤĭãģ¨ ãĥª ãĥĪ ãĥ©ãĤ¤ æľī ãĤĬ ãģ§ æĪĲåĬŁ ãģĻãĤĭ ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġretry Bean . circuit Breaker ( 2 ) ĊĠĠĠĠĠĠĠ Ġlog . info (" result : Ġ$ result ") ĊĊĠĠĠĠĠĠĠ Ġlog . info (" Finish ĠReactive ĠRetry Ġ( Circuit ĠBreak er )") ĊĠĠĠ Ġ} Ċ }) Ċ Ċ // Ġ ãĥª ãĥĪ ãĥ©ãĤ¤ ãĥĨãĤ¹ãĥĪ å¯¾è±¡ ĠBean Ċ @ Prototype Ċ open Ġclass ĠRetry Bean Ġ{ ĊĠĠĠ Ġ// Ġ åĩ¦çĲĨ æ¯ İ ãģ« åĬł ç®Ĺ ãģĻãĤĭ ãĤ«ãĤ¦ ãĥ³ ãĤ¿ ĊĠĠĠ Ġprivate Ġvar Ġcount Ġ= Ġ 1 ĊĊĠĠĠ Ġ// Ġãĥĩ ãĥķãĤ© ãĥ« ãĥĪ è¨Ńå®ļ ĊĠĠĠ Ġ@ Retry able ĊĠĠĠ Ġopen Ġfun Ġdefault Setting ( success Number : ĠInt ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġget Number ( success Number ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġmultiplier Ġ 2 Ġ è¨Ńå®ļ ĊĠĠĠ Ġ@ Retry able ( multiplier Ġ= Ġ" 2 ", Ġattempts Ġ= Ġ" 4 ", Ġdelay Ġ= Ġ" 1 s ") ĊĠĠĠ Ġopen Ġfun Ġretry Multiplier ( success Number : ĠInt ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġget Number ( success Number ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġ 5 Ġ åĽŀ Ġ 2 Ġ ç§Ĵ éĸĵ éļĶ ĊĠĠĠ Ġ@ Retry able ( attempts Ġ= Ġ" 5 ", Ġdelay Ġ= Ġ" 2 s ") ĊĠĠĠ Ġopen Ġfun Ġretry 5 delay 2 ( success Number : ĠInt ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġget Number ( success Number ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġ è¨Ńå®ļ ãĥķãĤ¡ãĤ¤ãĥ« ãģ® åĢ¤ ãĤĴ åĪ©çĶ¨ ĊĠĠĠ Ġ// Ġapplication . yml ĠãĥķãĤ ¡ãĤ¤ãĥ« ãģ« åĢ¤ ãĤĴ å®ļç¾© ãģĻãĤĭ ãĢĤ ĊĠĠĠ Ġ// Ġãĥĩ ãĥķãĤ© ãĥ« ãĥĪ åĢ¤ ãģ¯ ãĢģ è¨Ńå®ļ ãĤŃ ãĥ¼ãģ® å¾Į ãģ« ãĤ³ ãĥŃ ãĥ³ ï¼Ī : ï¼ī ãĤĴ ä»ĺ ãģĳ ãģ¦ è¨Ńå®ļ ãģ§ãģįãĤĭ ãĢĤ ĊĠĠĠ Ġ// Ġãĥĩ ãĥķãĤ© ãĥ« ãĥĪ åĢ¤ ãģ« ãĤ³ ãĥŃ ãĥ³ ï¼Ī : ï¼ī ãĤĴ åĲ« ãĤĢ åł´åĲĪãģ¯ ãĢģ ãĥĲ ãĥĥãĤ¯ ãĤ¯ ãĤ © ãĥ¼ãĥĪ ãģ§ åĽ ² ãĤĢ ãĢĮ "\ ${ foo . url :` http :// foo . net : 8 0 8 0 ` }" ãĢį ĊĠĠĠ Ġ// ĠKotlin Ġãģ® åł´åĲĪãģ¯ ãĢģ æĸĩåŃĹåĪĹ ãĥĨ ãĥ³ãĥĹ ãĥ¬ ãĥ¼ãĥĪ çĦ¡ åĬ¹ åĮĸ ãģ® ãģŁãĤģ ãģ« ãĢģ " $" ĠãĤĴ Ġ"\ $" ãģ® ãĤĪãģĨãģ« ãĤ¨ ãĤ¹ ãĤ± ãĥ¼ãĥĹ ãģĻãĤĭå¿ħè¦ģ ãģĮãģĤãĤĭ ãĢĤ ĊĠĠĠ Ġ@ Retry able ( attempts Ġ= Ġ"\ ${ retry . test . attempts : 0 }", Ġdelay Ġ= Ġ"\ ${ retry . test . delay : 2 s }") ĊĠĠĠ Ġopen Ġfun Ġretry From Config ( success Number : ĠInt ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġget Number ( success Number ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġ ãĥª ãĤ¢ãĤ¯ ãĥĨãĤ£ ãĥĸ ï¼Ī Rx Java ï¼ī ãģ® åł´åĲĪ ĊĠĠĠ Ġ@ Retry able ( attempts Ġ= Ġ" 2 ", Ġdelay Ġ= Ġ" 1 0 0 ms ") ĊĠĠĠ Ġopen Ġfun Ġretry Flow able ( success Number : ĠInt ): ĠFlow able < Int > Ġ= ĠFlow able ĊĠĠĠĠĠĠĠ Ġ. generate < Int > Ġ{ Ġemitter Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ åĢ¤ ãĤĴåıĸå¾Ĺ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġemitter . onNext ( getNumber ( success Number )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ åĢ¤ ãģĮ ä¸Ģ ãģ¤ åıĸå¾Ĺ ãģ§ãģį ãģŁ ãĤī çµĤ äºĨ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġemitter . onComplete () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ. subscribe On ( Schedulers . io ()) ĊĊĠĠĠ Ġ// Ġ ãĥª ãĤ¢ãĤ¯ ãĥĨãĤ£ ãĥĸ ï¼Ī Java Ġæ¨ Ļ æºĸ ĠCompletableFuture ï¼ī ãģ® åł´åĲĪ ĊĠĠĠ Ġ@ Retry able ( attempts Ġ= Ġ" 2 ", Ġdelay Ġ= Ġ" 1 0 0 ms ") ĊĠĠĠ Ġopen Ġfun Ġretry Future ( success Number : ĠInt ): ĠCompletableFuture < Int > Ġ= ĠCompletableFuture ĊĠĠĠĠĠĠĠ Ġ. supply Async Ġ{ Ġget Number ( success Number ) Ġ} ĊĊĠĠĠ Ġ// Ġ ãĥª ãĤ¢ãĤ¯ ãĥĨãĤ£ ãĥĸ ï¼Ī Coroutine ï¼ī ãģ® åł´åĲĪ ĊĠĠĠ Ġ@ Retry able ( attempts Ġ= Ġ" 2 ", Ġdelay Ġ= Ġ" 1 0 0 ms ") ĊĠĠĠ Ġopen Ġfun Ġretry Coroutine ( success Number : ĠInt ): ĠFlow < Int > Ġ= Ġflow Ġ{ ĊĠĠĠĠĠĠĠ Ġemit ( getNumber ( success Number )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġ éģ ® æĸŃ æ©Ł ï¼Ī Circuit ĠBreak er ï¼ī ĊĠĠĠ Ġ@ Circuit Breaker ( attempts Ġ= Ġ" 1 ", Ġdelay Ġ= Ġ" 1 0 0 ms ", Ġreset Ġ= Ġ" 1 s ") ĊĠĠĠ Ġopen Ġfun Ġcircuit Breaker ( success Number : ĠInt ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġget Number ( success Number ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġ ä»»æĦı ãģ® ãĤ¢ãĤ¯ãĤ»ãĤ¹ åĽŀ æķ° ãģ§ æĪĲåĬŁ ãģķ ãģĽ ãĤĭ éĸ¢æķ° ĊĠĠĠ Ġprivate Ġfun Ġget Number ( success Number : ĠInt ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġ åĳ¼ ãģ³ åĩº ãģĹ æ¯ İ ãģ« ãĤ¤ãĥ³ ãĤ¹ãĤ¿ ãĥ³ãĤ¹ å¤īæķ° ãģ® ãĤ«ãĤ¦ ãĥ³ ãĤ¿ ãĤĴ åĬł ç®Ĺ ĊĠĠĠĠĠĠĠ Ġval Ġcurrent Ġ= Ġcount ++ ĊĠĠĠĠĠĠĠ Ġlog . info (" success Number : Ġ$ success Number , Ġcurrent : Ġ$ current ") ĊĠĠĠĠĠĠĠ Ġif Ġ( current Ġ% Ġsuccess Number Ġ!= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠãĤ « ãĤ¦ ãĥ³ ãĤ¿ ãģĮ æĪĲåĬŁ çķª åı· ãģ§ åī² ãĤĬ åĪĩ ãĤĮ ãģªãģĦ åł´åĲĪ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" Exception Ġcurrent : Ġ$ current ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġcurrent ĊĠĠĠ Ġ} Ċ } Ċ Ċ // Ġ ãĥª ãĥĪ ãĥ©ãĤ¤ ãģĮ çĻº çĶŁ ãģĹãģŁ åł´åĲĪ ãģ® ãĤ¤ ãĥĻ ãĥ³ãĥĪ ãĤĴ åĩ¦çĲĨ ãģĻãĤĭ ãĢĤ Ċ @ Singleton Ċ class ĠCustom Retry EventListener Ġ: ĠRetry EventListener Ġ{ ĊĠĠĠ Ġval Ġlog Ġ= ĠLoggerFactory . getLogger ( this . java Class ) ĊĠĠĠ Ġoverride Ġfun Ġon Application Event ( event : ĠRetry Event ) Ġ{ ĊĠĠĠĠĠĠĠ Ġlog . info (" event . source : Ġ${ event . source }" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ", Ġoverall Delay : Ġ${ event . retry State . overall Delay }" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ", Ġcurrent Attempt : Ġ${ event . retry State . current Attempt () }", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ", Ġ${ event . throwable . java Class . simple Name }") ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* Ġ@ Circuit Breaker Ġãģ§ ãĥª ãĥĪ ãĥ©ãĤ¤ ãĤª ãĥ¼ãĥĲãĥ¼ ãģ«ãģª ãģ£ãģŁ åł´åĲĪ ãģ® ãĤ¤ ãĥĻ ãĥ³ãĥĪ ãĤĴ åĩ¦çĲĨ ãģĻãĤĭ Ċ Ġ*/ Ċ @ Singleton Ċ class ĠCircuit Open EventListener Ġ: ĠApplication EventListener < Circuit Open Event > Ġ{ ĊĠĠĠ Ġprivate Ġval Ġlog Ġ= ĠLoggerFactory . getLogger ( this . java Class ) ĊĊĠĠĠ Ġ@ Inject ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġpublisher : ĠApplication Event Publisher ĊĠĠĠ Ġoverride Ġfun Ġon Application Event ( event : ĠCircuit Open Event ) Ġ{ ĊĠĠĠĠĠĠĠ Ġlog . info (" event . source : Ġ${ event . source }" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ", Ġcurrent Attempt : Ġ${ event . retry State . current Attempt () }" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ", Ġoverall Delay : Ġ${ event . retry State . overall Delay }") ĊĊĠĠĠĠĠĠĠ Ġ// Ġãģĵãģ® åĩ¦çĲĨ ãģ« æĦı åĳ³ ãģ¯ çĦ¡ ãģĦ ãĢĤ ĊĠĠĠĠĠĠĠ Ġ// ĠCircuit Closed Event ĠãĤĴ çĻº çĶŁ ãģķ ãģĽ ãĤĭ ãģŁãĤģ ãģłãģĳ ãģ® åĩ¦çĲĨ ãĢĤ ĊĠĠĠĠĠĠĠ Ġ// Ġ çµĲ å±Ģ ãĢģ ä»»æĦı ãģ® ãĤ¿ãĤ¤ ãĥŁ ãĥ³ãĤ° ãģ§ ãĥª ãĥĪ ãĥ©ãĤ¤ ãĤª ãĥ¼ãĥĲãĥ¼ çĬ¶æħĭ ãĤĴ åĽŀ å¾ © ãģĻãĤĭ æĸ¹æ³ķ ãģ¯ ãĤı ãģĭãĤī ãģª ãģĭ ãģ£ãģŁ ãĢĤ ĊĠĠĠĠĠĠĠ Ġpublisher . publish Event ( Circuit Closed Event ( event . source )) ĊĠĠĠĠĠĠĠ Ġ// Ġãģĵãģ® ãĥ¡ ãĤ½ãĥĥãĥī ãģ§ãģ¯ ãĢģ Circuit Closed Event ĠãģĮ çĻº çĶŁ ãģĹãģªãģĦ ãĤĪãģĨ ãģł ãĢĤ Ċ // ĠĠĠĠĠĠĠ Ġevent . retry State . close ( IllegalArgumentException ()) ĊĠĠĠ Ġ} Ċ } Ċ Ċ // Ġ@ Circuit Breaker Ġãģ§ ãģ® ãĥª ãĥĪ ãĥ©ãĤ¤ ãĤª ãĥ¼ãĥĲãĥ¼ çĬ¶æħĭ ãģĭãĤī åĽŀ å¾ © ãģĹãģŁ åł´åĲĪ ãģ« çĻº çĶŁ ãģĻãĤĭ ãĤ¤ ãĥĻ ãĥ³ãĥĪ ãĤĴ åĩ¦çĲĨ ãģĻãĤĭ ãĢĤ Ċ // Ġãĥ » ãĥ» ãĥ» ãģ¨ æĢĿ ãģ£ãģŁ ãģĮ ãĢģ çĻº çĶŁ ãģĹãģª ãģĭ ãģ£ãģŁ ãĢĤ çı¾ æĻĤ çĤ¹ ãģ§ãģ¯ ãĢģ ä¸į æĺİ ãĢĤ Ċ @ Singleton Ċ class ĠCircuit Closed EventListener Ġ: ĠApplication EventListener < Circuit Closed Event > Ġ{ ĊĠĠĠ Ġval Ġlog Ġ= ĠLoggerFactory . getLogger ( this . java Class ) ĊĠĠĠ Ġoverride Ġfun Ġon Application Event ( event : ĠCircuit Closed Event ) Ġ{ ĊĠĠĠĠĠĠĠ Ġlog . info (" event . source : Ġ${ event . source }") ĊĠĠĠ Ġ} Ċ } Ċ