Spring Integration:如何根据另一个服务的状态打开服务的断路器



我有一个类似于使用Spring Integration 4.0.4:的应用程序中的流程

Inbound --A--> Service 1 --B--> Service 2 --C--> Service 3 --D--> End service 4

服务3可能会定期出现故障(这是意料之中的事)。我正在Service 3上使用RequestHandlerCircuitBreakerAdvice来处理此故障,并在一段时间后重试。但是,如果Service 3断路器打开,我需要停止Service2处理它从通道B接收的消息(某些上下文:Service 3导入Service2放入AmazonS3存储桶中的文件。如果服务3

到目前为止,我有一些想法:我会以类似于RequestHandlerCircuitBreakerAdvice的方式对AbstractRequestHandlerAdvice进行子类化,然后使用稍微修改过的doInvoke()版本,不仅检查当前服务的状态(服务2),还检查服务3的状态,然后如果service 3ervice2

这个target可以转换为AbstractReplyProducingMessageHandler.RequestHandler,但这对识别服务没有多大帮助。

问题

如何识别doInvoke()方法中正在检查的服务?有没有其他方法可以实现这样的";同步断路器";特色当消息被发送到Service 3时,我正在考虑在消息头中设置一个特定的标志,这样我就知道target实际上是Service 3。。。但是,如果您对更聪明的解决方案有任何意见,我们将不胜感激!

其他信息

我试着实现Gary的答案如下:

<!-- Service bean definition -->
<bean id="service3Bean" class="com.me.Service3"/>
<!-- Circuit breaker advice -->
<bean id="circuitBreaker" class="com.me.Service3StateBasedCircuitBreaker">
    <property name="threshold" value="10" />
    <property name="halfOpenAfter" value="60000" />
    <property name="service3" ref="service3.handler" />
</bean> 
<int:chain input-channel="channelC" output-channel="channelD">
    <int:header-enricher>
        (...)
    </int:header-enricher>
        
    <!-- Transformer implementing Service 3 definition -->
    <int:transformer id="service3" ref="service3Bean" method="doSomething">
        <int:request-handler-advice-chain>
            <ref bean="circuitBreaker" />
        </int:request-handler-advice-chain>
    </int:transformer>
</int:chain>

这在运行时给我一个No bean named 'service3.handler' is defined错误。也许是优先级问题,但我无法发现。感谢您的帮助:)

子类可以工作-将相同的建议实例应用于两个服务(因此它们共享状态Map)。

将service3的处理程序注入到您的建议(<property name="service3" ref="service3.handler" />)中——处理程序得到一个别名beanName.handler

然后在逻辑中,除了测试目标的状态外,还可以检查service3的状态(或者只测试service3)。

如果您以通用的方式执行此操作(例如,允许注入其他服务处理程序的Collection进行检查),我们很乐意考虑将此功能添加到框架中。

请参阅贡献指南。

最新更新