繁体   English   中英

如何在调用方法上使用resilience4j?

[英]How to use resilience4j on calling method?

我尝试使用弹簧重试进行断路和重试,如下所示,它正在按预期工作但是问题是无法将“maxAttempts / openTimeout / resetTimeout”配置为env变量(错误应该是常量)。 我的问题是如何使用resilience4j来达到以下要求?

另请注意,有一种方法可以将env变量传递给“maxAttempts / openTimeout / resetTimeout”。

@CircuitBreaker(value = {
        MongoServerException.class,
        MongoSocketException.class,
        MongoTimeoutException.class
        MongoSocketOpenException.class},
        maxAttempts =  2,
        openTimeout = 20000L ,
        resetTimeout = 30000L)
public void insertDocument(ConsumerRecord<Long, GenericRecord> consumerRecord){

        retryTemplate.execute(args0 -> {
            LOGGER.info(String.format("Inserting record with key -----> %s", consumerRecord.key().toString()));
            BasicDBObject dbObject = BasicDBObject.parse(consumerRecord.value().toString());
            dbObject.put("_id", consumerRecord.key());
            mongoCollection.replaceOne(<<BasicDBObject with id>>, getReplaceOptions());
            return null;
        });

}

@Recover
public void recover(RuntimeException t) {
    LOGGER.info(" Recovering from Circuit Breaker ");
}

使用的依赖是

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-aop</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.retry</groupId>
        <artifactId>spring-retry</artifactId>
    </dependency>

您没有使用resilience4j,而是使用spring-retry。 您应该调整问题的标题。

CircuitBreakerConfig circuitBreakerConfig = CircuitBreakerConfig.custom()
    .waitDurationInOpenState(Duration.ofMillis(20000))
    .build();
CircuitBreakerRegistry circuitBreakerRegistry = CircuitBreakerRegistry.of(circuitBreakerConfig);
CircuitBreaker circuitBreaker = circuitBreakerRegistry.circuitBreaker("mongoDB");

RetryConfig retryConfig = RetryConfig.custom().maxAttempts(3)
    .retryExceptions(MongoServerException.class,
        MongoSocketException.class,
        MongoTimeoutException.class
        MongoSocketOpenException.class)
    .ignoreExceptions(CircuitBreakerOpenException.class).build();
Retry retry = Retry.of("helloBackend", retryConfig);

Runnable decoratedRunnable = Decorators.ofRunnable(() -> insertDocument(ConsumerRecord<Long, GenericRecord> consumerRecord))
.withCircuitBreaker(circuitBreaker)
.withRetry(retry)
.decorate();

String result = Try.runRunnable(decoratedRunnable )
                .recover(exception -> ...).get();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM