是否可以通过编程方式将建议添加到出站网关的请求处理程序建议链中

Is it possible to add Advices programmatically to request-handler-advice-chain of an outboundgateway

我正在尝试查看是否可以通过编程方式将顾问添加到 xml 配置中定义的出站网关 (amqp:outbound-gateway)。

我正在探索使用 BeanFactoryPostProcessor 的可能性,但找不到方法。

当通过出站网关的 bean 名称检索时,我注意到该 bean 的类型为 EventDrivenConsumer。但是添加顾问的方法是在AbstractReplyProducingMessageHandler中定义的。有没有办法访问此方法或实现此目的的任何其他方式?

在此先感谢您的帮助。

根据以下接受的答案更新工作代码:

@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
    // retrieve the gateway bean definition by its name
    BeanDefinition gatewayBeanDefinition = beanFactory
            .getBeanDefinition("myOutboundgateway");

    if (gatewayBeanDefinition != null) {

        while (gatewayBeanDefinition.getOriginatingBeanDefinition() != null) {
            gatewayBeanDefinition = gatewayBeanDefinition.getOriginatingBeanDefinition();
        }

        PropertyValue handler = gatewayBeanDefinition.getPropertyValues().getPropertyValue("handler");

        if (handler != null) {

            String handlerBeanName = ((RuntimeBeanReference) handler.getValue()).getBeanName();

            BeanDefinition handlerBeanDefinition = beanFactory.getBeanDefinition(handlerBeanName);
            while (handlerBeanDefinition.getOriginatingBeanDefinition() != null) {
                handlerBeanDefinition = handlerBeanDefinition.getOriginatingBeanDefinition();
            }

            ManagedList adviceChain = new ManagedList();
            // myAdvice is the advice that extend AbstractRequestHandlerAdvice as recommended and registered as a bean
            adviceChain.add(new RuntimeBeanReference("myAdvice"));
            // this code simply sets the adviceChain, but other situations might require adding an adviser to an already existing list.
            handlerBeanDefinition.getPropertyValues().add("adviceChain", adviceChain);
        }

    }
}

对于产生回复 AbstractReplyProducingMessageHandler (ARPMH) 的处理程序,我们必须在内部将建议应用到 handleRequestMessage 方法;原因是我们不想建议下游流程,只是这个端点。

对于不产生输出的处理程序,建议使用整个处理程序。

ARPMH 中的建议链在初始化后无法更改 - 该链在 afterPropertiesSet() 期间应用。

是的,您可以在 BFPP 中修改 bean 定义,但是找到处理程序的 bean 名称可能很棘手(ClassName + #n,其中 n 是解析顺序)- 它已使用别名 endpoint.handler 注册,但您无法通过其别名找到 bean 定义。

您可以通过 handler 属性 在 ConsumerEndpointFactoryBean 的 bean 定义上获得对 bean 定义的引用;引用 BD 后,您可以修改建议链。