首页 > 解决方案 > 使用 Callable 向 CircuitBreaker 添加回退

问题描述

我正在使用 SpringJmsTemplate发送消息。我想介绍一下resilience4j以允许我使用 Fallback,因此当第一次调用失败时,它会使用另一个JmsTemplate配置不同的消息发送消息。

我有一个这种方法:

void sendMessage(JmsTemplate jmsTemplate, String body) {
    jmsTemplate.send(...);
}

问题是,如果我更改方法以返回一些字符串,我可以使用以下选项Decorators.ofCallableDecorators.ofConsumer不给我选项。withFallbacksendMessage

Decorators.ofCallable(() -> sendMessage(primaryJmsTemplate, body))
    .withFallback(s -> sendMessage(secondaryJmsTemplate, body))
    .withCircuitBreaker(circuitBreaker).call();

我宁愿不返回随机值只是为了让它工作。可调用/消费者不允许回退是否有原因?或者有没有不同的方法来实现我想要使用的东西resilience4j

标签: resilience4j

解决方案


我用这个改变了我的方法,因为我误解了withFallback会实现什么。

我现在使用以下内容:

try {
    circuitBreaker.executeRunnable(() -> sendMessage(primaryJmsTemplate, body));
} catch (Exception e) {
    sendMessage(secondaryJmsTemplate, body);
}

当对主要的调用失败时,它会导致关闭电路。然后进入辅助服务器一段时间,直到它再次重试主服务器。


推荐阅读