我对 RequestHandlerCircuitBreakerAdvice 有疑问。
在下面的代码中,如果在 JmsOutboundGateway(firstHandler 或 secondaryHandler)中出现故障时,在 passThru 和 passThruSecond 中添加 RequestHandlerCircuitBreakerAdvice 作为建议,则 CircuitBreaker 不起作用。
但是如果我在 JmsOutboundGateway 中直接添加 RequestHandlerCircuitBreakerAdvice (在 firstHandler 或 secondaryHandler 中)
gateway.setAdviceChain(Collections.singletonList(requestHandlerCircuitBreakerAdvice));
并删除 passThru 和 passThruSecond ServiceActivator,并提供 CircuitBreaker 的建议。
效果很好。
CircuitBreaker 仅在同一 ServiceActivator 中直接发生故障时才会工作,这是正常行为吗?或者如果我使用相同的线程(直接通道),即使在降序 ServiceActivator 中发生某些情况,它也应该可以工作?
下面的代码不起作用/使用RequestHandlerCircuitBreakerAdvice:
@MessagingGateway(name = "LocalGateway")
public interface LocalGateway {
@Gateway(requestChannel = "inputLocalChannel")
ListenableFuture<Message<String>> sendMsg(Message<String> request);
}
@Bean
public RequestHandlerCircuitBreakerAdvice requestHandlerCircuitBreakerAdvice(){
RequestHandlerCircuitBreakerAdvice requestHandlerCircuitBreakerAdvice = new RequestHandlerCircuitBreakerAdvice();
requestHandlerCircuitBreakerAdvice.setThreshold(2);
requestHandlerCircuitBreakerAdvice.setHalfOpenAfter(20000);
return requestHandlerCircuitBreakerAdvice;
}
@Bean
MessageChannel inputLocalGatewayChannel(){
DirectChannel channel = new DirectChannel();
return channel;
}
@Bean
MessageChannel inputLocalSecondGatewayChannel(){
DirectChannel channel = new DirectChannel();
return channel;
}
@ServiceActivator(inputChannel = "inputLocalChannel", outputChannel = "inputLocalGatewayChannel", adviceChain = "requestHandlerCircuitBreakerAdvice")
public Message passThru(Message message){
return message;
}
@ServiceActivator(inputChannel = "inputLocalChannel", outputChannel = "inputLocalSecondGatewayChannel", adviceChain = "requestHandlerCircuitBreakerAdvice")
public Message passThruSecond(Message message){
return message;
}
@Bean
@ServiceActivator(inputChannel = "inputLocalGatewayChannel")
public JmsOutboundGateway firstHandler(){
// some code
}
@Bean
@ServiceActivator(inputChannel = "inputLocalSecondGatewayChannel")
public JmsOutboundGateway secondHandler(){
// some code
}
它被称为
AbstractRequestHandlerAdvice
是有原因的。
里面的逻辑是这样的:
boolean isMessageMethod = (method.getName().equals("handleRequestMessage") || method.getName().equals("handleMessage"))
&& (arguments.length == 1 && arguments[0] instanceof Message);
因此,此 AOP 建议仅适用于
MessageHandler
实现中的特定方法。它不会在流中向下游传播。
您可以尝试用
HandleMessageAdviceAdapter
包裹那个。请参阅其 Javadocs。
另一个解决方案是将逻辑提取到子流程中,并将此
RequestHandlerCircuitBreakerAdvice
应用于 gateway()
端点。
在文档中查看更多内容:https://docs.spring.io/spring-integration/reference/handler-advice.html