是否可以以编程方式将Advices添加到outboundgateway的request-handler-advice-chain

时间:2015-10-27 19:56:56

标签: spring-integration

我正在尝试查看是否可以以编程方式将顾问添加到xml配置中定义的outboundgateway(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);
        }

    }
}

1 个答案:

答案 0 :(得分:1)

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

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

初始化后,您无法在ARPMH内更改建议链 - 在afterPropertiesSet()期间应用链。

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

您可以通过handler的bean定义上的ConsumerEndpointFactoryBean属性获取对bean定义的引用;一旦你引用了BD,就可以修改建议链。