シーシュポス
サポート手続き型プログラミングとJavaプログラミングのメモは、フレームワークを再試行してください。
プロパティ
-
流暢な手続き型プログラミングをサポートしています
-
エージェントベースの再試行バイトコード
-
再試行の注釈に基づいて、カスタム注釈を可能に
-
シームレスなアクセスバネ
-
統一されたインタフェースと注釈
-
欠点スプリングリトライとグアバ、再試行を解決するために、
するように設計
春リトライとgauva-再試行利点を組み合わせました。
実用化へのそれがより助長させるためにいくつかの機能を調整します。
同様のアイデア網状インタフェースは、柔軟性、一貫したインターフェース、および交換を保証します。
Hibernateは、バリデータは、ユーザー定義の注釈を許可するように設計されて学びます。
レコードの更新
オープンソース・アドレス
クイックスタート
導入
<plugin>
<groupId>com.github.houbb</groupId>
<artifactId>sisyphus-core</artifactId>
<version>0.0.6</version>
</plugin>
复制代码
アクセスコード
詳細については、を参照してくださいRetryerTest
public void helloTest() {
Retryer.<String>newInstance()
.retry(new Callable<String>() {
@Override
public String call() throws Exception {
System.out.println("called...");
throw new RuntimeException();
}
});
}
复制代码
コード分析
- リトライ
呼び出し可能の実現を指定します。
我々は、ログ、およびシミュレーションプログラムの例外を印刷します。
ログ情報
ログ情報
called...
called...
called...
复制代码
そして、他のいくつかの例外情報。
トリガ条件を再試行し、既定のプログラムは、異常が発生したあります
ここでインターバルデフォルトでは何の時間間隔、3回の合計ではありません再試行してください。(最初の実行プログラム自体を含みます)
なぜシーシュポス
なぜシーシュポス
開発者として、私たちは通常より多くの有名なフレームワークを選択してください。
比如グアバ-再試行春再試行。
それとも、単に1を自分で書きます。
なぜグアバ、再試行/春リトライ
Javaは再試行私は上記と同様に2つのフレームワークの一般的な実装が、また、それらの欠如について引用この記事を。
グアバ、再試行の長所と短所
利点
-
柔軟
-
流暢かつエレガントな言葉遣い
-
達成するのに十分以上のものを提供
短所
-
デフォルトの注釈ベースの実装はありません
-
再試行戦略が配慮した設計ではありません
春リトライ
利点
- 使用するのは簡単
短所
-
単一の条件を再試行
-
単一の戦略を待って再試行
-
あなたは注釈をカスタマイズすることはできません
なぜあなた自身を記述しません
我情
開発者として私は通常見て、もう一度試してみ、真実を伝えます。
私は間違いなく怠惰数回にわたる再試行し、forループを書くことでしょう。
時以来許可していません。
あなたはもう少し勤勉している場合は、春リトライ/グアバ、再試行を選択することができます。あなたは自分の長所と短所に精通している場合は、。
あなたが作成したい場合
すべての実装のシーシュポスベースのインタフェースです。
あなたがその実現を達成することができ、すべての基本的な事柄を交換することができます。
もちろん、プロジェクトの基本的な枠組みを達成するための一般的な戦略の一部は、参照も少し助けを持つことができるよう、詳細なメモを持っています。
シーシュポスは、より多くのことを行います
ネッティーインスピレーション
ネッティーリファレンス・デザインは、インターフェースの一貫性を確保します。
シーシュポスだけでなく、よりを行うには、だけでなく、インターフェイスとコメントの間の整合性を確保するために。
使い勝手、後半の展開の柔軟性を確保するために、ブートクラスを使用します。
休止状態、バリ
著者は、HibernateバリデータIは、Javaアノテーションの偉大な開発者のためのいくつかのアプリケーションのいずれかを知っています。(よくわかっていないが)
カスタムアノテーションは、この枠組みから学校にあります。
春との関連付け
我々のコードと不可分の基本的な春なので、あなたは、単に春を組み合わせることができます。
お使いのと同じように、スプリングを、再試行してください。
シーシュポスモジュールの紹介
モジュール部門
シーシュポスモジュール部門アカウントユーザの利便性を考慮して、いくつかのモジュールがあります。
シーシュポス-API
モジュールのインタフェース定義は、最も基本的な部分です。
デフォルトでは、依存シーシュポスコアとなります。
あなたは、独自の再試行の試行の枠組みに従って達成する必要がある場合は、一般的に、導入を必要としません。
シーシュポスコア
シーシュポス-APIモジュールのデフォルトの実装のために。
流暢使いやすく、追加ブートクラスは、簡単に宣言型の再試行のコードを書くことができます。
シーシュポスアノテーション
シーシュポスのコメントはモジュールが実装されています。
(1)エージェントに基づいてバイトコードは、春に依存することはできません再試行してください。通常より柔軟な使用
(2)その実現には、カスタム注釈を可能にします。ユーザーが再試行するために、独自のメモを書くことができます。
シーシュポス、春
Javaでガイドとして春。自然はサポートされています。
あなたは春リトライとシーシュポススプリング使用するように簡単に使用することができます。
モジュール間の依存関係
sisyphus-api
sisyphus-core
sisyphus-annotation
sisyphus-spring
sisyphus-test
复制代码
シーシュポス-APIは、最大限の柔軟性の基本です。
シーシュポススプリングは、比較的貧しい最も使いやすい、柔軟性、です。
外部の導入なしでのみテスト、などシーシュポステスト。
シーシュポス設定の概要
より簡単に構成を満たすために、Retryerクラスを設定することができ、多くの情報を提供します。
デフォルトの設定
/**
* 默认配置测试
*/
public void defaultConfigTest() {
Retryer.<String>newInstance()
.condition(RetryConditions.hasExceptionCause())
.retryWaitContext(RetryWaiter.<String>retryWait(NoRetryWait.class).context())
.maxAttempt(3)
.listen(RetryListens.noListen())
.recover(Recovers.noRecover())
.callable(new Callable<String>() {
@Override
public String call() throws Exception {
System.out.println("called...");
throw new RuntimeException();
}
}).retryCall();
}
复制代码
そして、次のコードと同等です:
public void helloTest() {
Retryer.<String>newInstance()
.callable(new Callable<String>() {
@Override
public String call() throws Exception {
System.out.println("called...");
throw new RuntimeException();
}
}).retryCall();
}
复制代码
メソッド説明
調子
あなたは、複数の条件を指定することができ、トリガ条件を再試行してください。
デフォルトがスローされます。
retryWaitContext
待つための戦略を再試行し、あなたがより多くを指定することができます。
デフォルトでは、任意の待ち時間ではありません。
maxAttempt
最初の実行を含む最大再試行回数を指定します。
デフォルト:3回。
聴く
再試行モニタの実装を指定し、デフォルトでは聞いていません。
回復する
再試行の終了後、まだ再試行条件を満たし、あなたは復元されたポリシーを指定することができます。
デフォルトでは復元されません。
呼び出し可能
再試行の方法が実行されます。
retryCall
トリガーの再試行。
詳細インタフェース
インタフェースとその実装
すべてのインターフェイスは、直接対応するサブクラスの可視インスタンスです。
ユーザー定義
交換用の柔軟性に基づいて、ユーザーが自分のビジネスに合わせてより多くを達成するために定義されたインタフェースを実装することができます。
シーシュポスのコメント
自由度の高い設定が、開発者が使用するため、ノーコメントのように、シンプルで柔軟性があるだろう。
したがって、現在のフレームベースの注釈リトライをも達成されます。
設計仕様
両方のインターフェイスが均一と注釈を確保します。
Mavenの導入
<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>sisyphus-annotation</artifactId>
<version>${project.version}</version>
</dependency>
复制代码
コメント
二つの主コアノートがあります。
リトライ
再試行の設定のために。
/**
* 重试注解
* 1. 实际需要,只允许放在方法上。
* 2. 如果放在接口上,是否所有的子类都生效?为了简单明确,不提供这种实现。
* 3. 保持注解和接口的一致性。{@link com.github.houbb.sisyphus.api.core.Retry} 接口
* @author binbin.hou
* @since 0.0.3
*/
@Documented
@Inherited
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@RetryAble(DefaultRetryAbleHandler.class)
public @interface Retry {
/**
* 重试类实现
* @return 重试
* @since 0.0.5
*/
Class<? extends com.github.houbb.sisyphus.api.core.Retry> retry() default DefaultRetry.class;
/**
* 最大尝试次数
* 1. 包含方法第一次正常执行的次数
* @return 次数
*/
int maxAttempt() default 3;
/**
* 重试触发的场景
* @return 重试触发的场景
*/
Class<? extends RetryCondition> condition() default ExceptionCauseRetryCondition.class;
/**
* 监听器
* 1. 默认不进行监听
* @return 监听器
*/
Class<? extends RetryListen> listen() default NoRetryListen.class;
/**
* 恢复操作
* 1. 默认不进行任何恢复操作
* @return 恢复操作对应的类
*/
Class<? extends Recover> recover() default NoRecover.class;
/**
* 等待策略
* 1. 支持指定多个,如果不指定,则不进行任何等待,
* @return 等待策略
*/
RetryWait[] waits() default {};
}
复制代码
RetryWait
再試行待ち戦略を指定するために使用されます。
package com.github.houbb.sisyphus.annotation.annotation;
import com.github.houbb.sisyphus.annotation.annotation.metadata.RetryWaitAble;
import com.github.houbb.sisyphus.annotation.handler.impl.DefaultRetryWaitAbleHandler;
import com.github.houbb.sisyphus.core.constant.RetryWaitConst;
import com.github.houbb.sisyphus.core.support.wait.NoRetryWait;
import java.lang.annotation.*;
/**
* 重试等待策略
* 1. 为了对应重试策略,所有的内置注解应该实现当前的注解。
* 2. 是否允许自定义注解?
*
* 当注解+对象同时出现的时候,视为组合。
*
* @author binbin.hou
* @since 0.0.3
*/
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
@Target(ElementType.ANNOTATION_TYPE)
@RetryWaitAble(DefaultRetryWaitAbleHandler.class)
public @interface RetryWait {
/**
* 默认值
* 1. fixed 模式,则对应固定等待时间
* 2. 递增
* @return 默认值
*/
long value() default RetryWaitConst.VALUE_MILLS;
/**
* 最小值
* @return 最小值
*/
long min() default RetryWaitConst.MIN_MILLS;
/**
* 最大值
* @return 最大值
*/
long max() default RetryWaitConst.MAX_MILLS;
/**
* 影响因数
* 1. 递增重试,默认为 {@link RetryWaitConst#INCREASE_MILLS_FACTOR}
* 2. 指数模式。默认为 {@link RetryWaitConst#MULTIPLY_FACTOR}
* @return 影响因数
*/
double factor() default Double.MIN_VALUE;
/**
* 指定重试的等待时间 class 信息
* @return 重试等待时间 class
*/
Class<? extends com.github.houbb.sisyphus.api.support.wait.RetryWait> retryWait() default NoRetryWait.class;
}
复制代码
注釈を使用します
明確に定義された注釈は、注釈に関連する使用を持っているようにしてください。
主に2つの方法での注釈の使用、オン。
プロキシ+ CGLIB
エージェントベースエンハンスメント・モードとバイトコード。
プロジェクトは、スプリング、より便利に、このように直接使用で使用されていない場合。
春AOP
そして、春には直接統合することができます。
使用およびそれをバネ - 再試行してください。
シーシュポスの代理店テンプレート
目的
ない依存スプリングながら、より容易に、アノテーションを使用するユーザーを容易にするために。
コードパターンベースの方法バイトコード+エンハンスメント実装。
ユースケース
Mavenの導入
モジュールに関連するノートの導入。
<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>sisyphus-annotation</artifactId>
<version>${project.version}</version>
</dependency>
复制代码
定義された試験方法
次のテストコードを参照することができ、ばね試験モジュール。
- MenuServiceImpl.java
public class MenuServiceImpl {
public void queryMenu(long id) {
System.out.println("查询菜单...");
throw new RuntimeException();
}
@Retry
public void queryMenuRetry(long id) {
System.out.println("查询菜单...");
throw new RuntimeException();
}
}
复制代码
テスト
RetryTemplateテストを使用します
いいえ、リトライアノテーション付きメソッドません
@Test(expected = RuntimeException.class)
public void templateTest() {
MenuServiceImpl menuService = RetryTemplate.getProxyObject(new MenuServiceImpl());
menuService.queryMenu(1);
}
复制代码
- ログ情報
查询菜单...
复制代码
彼は一度だけ要求されました。
注釈付きメソッド
@Test(expected = RuntimeException.class)
public void templateRetryTest() {
MenuServiceImpl menuService = RetryTemplate.getProxyObject(new MenuServiceImpl());
menuService.queryMenuRetry(1);
}
复制代码
- ログ情報
查询菜单...
查询菜单...
查询菜单...
复制代码
他の
もちろん、より多くの設定がありますが、あなたは自分自身を試すことができます。
アノテーションを使用して、スプリングを組み合わせたい場合は、読むことを続けてください。
シーシュポスの春の統合
目的
あなたは春のフレームワークを使用する場合は、スプリングリトライフレームワークと同様に、このプロジェクトの統合は非常にシンプルになります。
ノート方法とプログラミングのプロセス、可能な限り一貫性を維持するために、両方の、あなたは別の比較的単純に道から欲しいです。
春リトライへの本のフレームから切り替えるにも非常に便利です。
使用例
Mavenの導入
<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>sisyphus-spring</artifactId>
<version>${project.version}</version>
</dependency>
复制代码
デフォルトでは、春とAOP関連のjarファイルの導入となります。
ビジネスコード
あなたはシーシュポステストモジュールを参照することができます。
いくつかのビジネスメソッドでは非常に一般的なシミュレートされました。
用いた@Retry
識別方法は、再試行が必要です。
- SpringService.java
public interface SpringService {
/**
* 查询示例代码
* @return 结果
*/
String query();
}
复制代码
- SpringServiceImpl.java
import com.github.houbb.sisyphus.annotation.annotation.Retry;
import com.github.houbb.sisyphus.test.service.SpringService;
import org.springframework.stereotype.Service;
/**
* @author binbin.hou
* @since 0.0.4
*/
@Service
public class SpringServiceImpl implements SpringService {
@Override
@Retry
public String query() {
System.out.println("spring service query...");
throw new RuntimeException();
}
}
复制代码
オープン再試行
注釈ベースの設定は、直接、次のことができます。
使用して@EnableRetry
開き、もう一度やり直してくださいするために必要な識別を。
@Configurable
@ComponentScan(basePackages = "com.github.houbb.sisyphus.test.service")
@EnableRetry
public class SpringConfig {
}
复制代码
テストコード
import com.github.houbb.sisyphus.test.config.SpringConfig;
import com.github.houbb.sisyphus.test.service.SpringService;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
/**
* @author binbin.hou
* @since 0.0.4
*/
@ContextConfiguration(classes = SpringConfig.class)
@RunWith(SpringJUnit4ClassRunner.class)
public class SpringServiceTest {
@Autowired
private SpringService springService;
@Test(expected = RuntimeException.class)
public void queryTest() {
springService.query();
}
}
复制代码
- ログ情報
spring service query...
spring service query...
spring service query...
复制代码
新機能は、スケジュール
上院へ
参照に追加コンテキスト情報をリトライ
コンフィギュレーションの最適化
より優れた構成の体験を提供
ます。https://juejin.im/post/5d0ba0e051882559f63014c8で再現