分散システムでは、データ分散トランザクションの強力な一貫性を確保するために、RPCインターフェイスを呼び出すとき、またはMQの送信時に、ネットワークジッターのリクエストタイムアウトを防ぐために再試行操作を行います。再試行する最も一般的な方法はMQですが、プロジェクトにMQを導入しないと不便です。この記事では、主にSpring Retryを使用してRetry操作を実装する方法を紹介します。
1. Maven依存関係を追加します
<Dependency> groupId> org.springframework.retry </groupid> <artifactid> spring-retry </artifactid> <version> 1.1.2.Release </version> </dependency> <seplency> <ship> <ependency>
2.起動時に再試行構成を追加します
@springBootApplication @enableretry public class application {public static void main(string [] args){springApplication.run(application.class、args); }} 3。サービスを書き込みます
@service public class Remoteservice {private static final logger logger = loggerFactory.getLogger(testController.class); @retryable(value = {businessexception.class}、maxattempts = 3、backoff = @backoff(delay = 5000l、multiplier = 2))public void call()throws exception {logger.info( "do montse ...");新しいBusinessException( "RPCコール例外")をスローします。 } @Recover public void recover(BusinessException e) { logger.info(" ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 4。コントローラーを書き込みます
@RestController @RequestMapping( "/test")public class testcontroller {private static final logger logger = loggerfactory.getLogger(testController.class); @Autowired Private Remoteservice Remoteservice; @RequestMapping( "/test")public string login()throws Exception {remoteservice.call(); return string.valueof( "11"); } 5。http:// localhost:8080/test/testにアクセスしてください
6.テストログ
2017-07-25 19:28:07 [info] - [http-nio-53602-exec-1] - [com.test.retry.service.remoteservice.call(remoteservice.java:19)]
2017-07-25 19:28:12 [情報] - [HTTP-NIO-53602-EXEC-1] - [com.test.retry.service.remoteservice.call(remoteservice.java:19)]
2017-07-25 19:28:22 [info] - [http-nio-53602-exec-1] - [com.test.retry.service.remoteservice.call(remoteservice.java:19)]
2017-07-25 19:28:22 [info] - [http-nio-53602-exec-1] - [com.test.retry.service.remoteservice.recover(remoteservice.java:24)]]] ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
2017-07-25 19:28:22 [info] - [http-nio-53602-exec-1] - [com.test.retry.service.remoteservice.recover(remoteservice.java:25)] RPCコール例外
7。関連する構成命令
@EnableRetryもう一度やり直してもらえますか? ProxyTargetClassプロパティが真の場合、CGLIBプロキシを使用します。標準のJavaアノテーションはデフォルトで使用されます。 Spring Bootでは、このパラメーターはプログラムの入り口に記述できます。
@retryableこの注釈にラベルを付ける方法は、例外が発生したときに再試行されます
値:処理する例外クラスを指定します
含める:指定された例外クラスは、値と同じで、デフォルトは空です。除外が空である場合、すべての例外がデフォルトであるとデフォルトである
除外:例外が処理されていない、デフォルトが空である場合、インクルードも空、デフォルトのすべての例外を指定することを指定します
MaxAttempts:Retriesの最大数。デフォルト3回
バックオフ:待機ポリシーを再試行します。デフォルトで@backoff Annotationを使用します
@backoffは待機ポリシーを再試行<BR />パラメーターが設定されていない場合、DexixBackOffPolicyはデフォルトで使用され(待機時間を指定します)、1000msの待機を再試行します
遅延を設定し、sixedbackoffpolicyを使用して(待機時間を指定します)。
遅延とmaxdealyを設定するときは、再試行して、これら2つの値の間の均一な分布を待ちます
遅延、maxdealy、および乗数を設定し、ExponentialbackOffpolicy(指数再試行間隔の実装)を使用し、乗数は遅延= 5000L、乗数、2回目は5秒、2回目は10秒、3番目の時間は20秒です...
@Recoverは、 @retryableの失敗した再試行方法に使用されます。この注釈のメソッドパラメーターは、@retryableによってスローされる例外でなければなりません。そうしないと、認識されません。この方法では、ログ処理を実行できます。
上記はこの記事のすべての内容です。みんなの学習に役立つことを願っています。誰もがwulin.comをもっとサポートすることを願っています。