如果降序服务激活器出现故障,RequestHandlerCircuitBreakerAdvice 将不起作用

问题描述 投票:0回答:1

我对 RequestHandlerCircuitBreakerAdvice 有疑问。

在下面的代码中,如果在 JmsOutboundGateway(firstHandler 或 secondaryHandler)中出现故障时,在 passThrupassThruSecond 中添加 RequestHandlerCircuitBreakerAdvice 作为建议,则 CircuitBreaker 不起作用。

但是如果我在 JmsOutboundGateway 中直接添加 RequestHandlerCircuitBreakerAdvice (在 firstHandler 或 secondaryHandler 中)

 gateway.setAdviceChain(Collections.singletonList(requestHandlerCircuitBreakerAdvice));

并删除 passThrupassThruSecond 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
    }
spring-boot spring-integration
1个回答
0
投票

它被称为

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

© www.soinside.com 2019 - 2024. All rights reserved.