我正在尝试查看是否可以以编程方式将顾问添加到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);
}
}
}
答案 0 :(得分:1)
使用生成回复AbstractReplyProducingMessageHandler
(ARPMH)的处理程序,我们必须在内部将建议应用于handleRequestMessage
方法;原因是我们不想建议下游流量,只是这个终点。
对于不会产生输出的处理程序,建议使用整个处理程序。
初始化后,您无法在ARPMH
内更改建议链 - 在afterPropertiesSet()
期间应用链。
是的,您可以在BFPP
中修改bean定义,但是找到处理程序的bean名称可能很棘手(ClassName + #n
其中n
是解析顺序) - 它已注册使用别名endpoint.handler
但您无法通过别名找到bean定义。
您可以通过handler
的bean定义上的ConsumerEndpointFactoryBean
属性获取对bean定义的引用;一旦你引用了BD,就可以修改建议链。