私はSpringブートアプリケーションにHystrixサーキットブレーカを含めることを試みています。 私のアプリケーションは、 "aggregate"メソッドでサービスクラスを呼び出す単一のコントローラクラスを持つspring-cloud-hystrix v 1.2.0アプリケーションを備えた標準のスプリングブート1.4.1です。 このメソッドは、内部プライベートメソッドを使用して2つのサービスを内部的に呼び出します。Spring Hystrixが内部メソッドでトリガされない
私は@HystrixCommandのeverithingと「集計」メソッドが正常に動作しますが、注釈は、他の内部方式Hystrixが
をトリガすることがされていないように見える場合、これが私のサービスクラスで注釈を付ける場合:
@Service
public class AggregationService {
@Autowired
Service1 service1Client;
@Autowired
Service2 service2Client;
private static final String QUERY = "query";
private static final Logger log = LogManager.getLogger();
private final ObjectMapper objectMapper = new ObjectMapper();
//@HystrixCommand(
// fallbackMethod = "emptyResult",
// groupKey = "aggregation-service",
// commandKey = "aggregate")
public AggregationResponse aggregate(final AggregationParams params)
throws ApiException, IOException {
final String query = queryExplain(params);
final WrapperQueryBuilder wrappedQuery = QueryBuilders.wrapperQuery(query);
final SearchResponse aggregationResult = searchAggregation(params, wrappedQuery);
return toDtoResponse(aggregationResult.getAggregations().get(params.getAggregationField().name().toLowerCase()));
}
@HystrixCommand(
fallbackMethod = "emptyAggregationResult",
groupKey = "aggregation-service",
commandKey = "searchAggregation")
private SearchResponse searchAggregation(final AggregationParams params, final WrapperQueryBuilder query) {
return ... do something with service 2 ....
}
// @HystrixCommand(
// fallbackMethod = "rethrowTimeoutException",
// groupKey = "aggregation-service",
// commandKey = "query-for-aggregation",
// ignoreExceptions = TimeoutException.class)
private String queryExplain(final AggregationParams params) throws ApiException, IOException {
final String queryAsString = ... do something with service 1 ....
}
private String rethrowTimeoutException(final AggregationParams params, final Throwable e) {
log.error("On Hystrix fallback because of ", e);
return null;
}
private SearchResponse emptyAggregationResult(final AggregationParams params, final WrapperQueryBuilder query, final Throwable e) {
log.error("On Hystrix fallback because of ", e);
return null;
}
}
マイ制御方法は、次のとおり
0:@GetMapping("{field}")
@ResponseStatus(HttpStatus.OK)
public AggregationResponse aggregate(... some params ...) throws ApiException, IOException {
... omissis ....
return aggregationService.aggregate(params);
マイコンフィギュレーションクラスは、これらのアノテーションを有します
@Configuration
@EnableHystrix
私application.propertiesは含まれています
hystrix.command.searchAggregation.execution.isolation.thread.timeoutInMilliseconds=1
hystrix.command.searchAggregation.circuitBreaker.errorThresholdPercentage=10
hystrix.command.queryExplain.execution.isolation.thread.timeoutInMilliseconds=1
hystrix.command.queryExplain.circuitBreaker.errorThresholdPercentage=10
hystrix.command.default.execution.timeout.enabled=true
は、私は意図的にhystrixの実行をキャッチするために、1MSに実行アイソレーションのためのタイムアウトを守ってきました。
"aggergate"メソッドに配置された@HystrixCommandがトリガーされているように見えるのは、そうではないようですが、他の人はそうではありません。トップ "集約"の注釈をコメントすると、タイムアウトエラーは発生しません。 「欠落した代替除外」がトリガーされます
私は設定ミスを尋ねていますか? @HystrixCommandは、呼び出されたメソッドの上に置かれなければならず、内部メソッドには使用できません。
私の問題が明確であることを願っています(私に:)かなり曖昧であるため)事前に
おかげ
問題をお寄せいただきありがとうございます。私はそれを見つけることができませんでした。また、メソッドの可視性をpublicに変更しようとしましたが、メソッドが直接呼び出されない場合でも動作は同じです。hystrixはトリガーされません。この同じ環境は好きな問題に言及されていますが、解決策はありません(私が理解したように)、私はHystrixCommandアノテーションなしでメソッドを計測することが可能かどうか、私はガイドや例が見つかりませんでした。 今私はクラスを3つの部分に分割し、ヒステリシスを装備していますが、すべて正常に動作しますが、まだ私のアプリケーションのこのアプローチは少し工夫されていると思います。 – IlTera
HystrixCommand注釈はJavanicaによって導入された単純な高レベルの単純化です。柔軟性が必要な場合は、HystrixCommandクラスをサブクラス化するなどの標準的な方法でコマンドを実装できます。https://github.com/Netflix/Hystrix/wiki/Getting-Started#hello-world –
@IlTera、どういう意味ですか?直接呼び出されないことによって?いつメソッドが直接呼び出されませんか? – jrahhali