我在我的应用中使用了spring集成器。 我使用黄瓜测试流量,我想确保聚合器释放 策略由正确的参数执行。我有2个参数用于该策略: 超时和大小。 我想知道是否有办法在步骤中动态加载这些参数? 到目前为止,我已经失去了如何让它发挥作用。
谢谢,
谢谢Artem,
我使用了directFieldAccessor
,我试图从聚合器中获取release-strategy-expression
和group-timeout
属性,但问题是我无法访问这些属性领域:
public void setAggregatorConfiguration(String aggregatorName, int aggregationThreshold, long aggregationTimeout) {
EventDrivenConsumer aggregator = getAggregator(aggregatorName);
DirectFieldAccessor directFieldAccessor = new DirectFieldAccessor(aggregator);
directFieldAccessor.setPropertyValue("group-timeout", aggregationTimeout);
}
答案 0 :(得分:1)
我有2个参数用于该策略:超时和大小
好吧,我想你使用TimeoutCountSequenceSizeReleaseStrategy
。正如我们所看到的那些params在该类中是最终的,并且它们在运行时实际上无法使用setter进行更改。
只有一种方法可以在运行时更改这些值 - 使用DirectFieldAccessor
。
但是,如果您分享有关用例,配置和单元测试的更多信息,我们可能会找到其他方法来帮助您。
我已编辑您的帖子以添加您的代码。不,您必须使用不动产名称,因此它应为groupTimeoutExpression
,而不是group-timeout
。从另一方面来看,有一个关于此问题的公共制定者:AbstractCorrelatingMessageHandler.setGroupTimeoutExpression(Expression groupTimeoutExpression)
。
从另一方面来说,你的方式有点错误:任何MessageHandler
组件(<aggregator>
,<service-activator>
)都提供了几个组件。是的,它们的根是AbstractEndpoint
(EventDrivenConsumer
的父级)。但是,您所需的所有属性都来自AggregatingMessageHandler
,BeanFactory
可以使用其别名aggregatorName + ".handler"
从release-strategy-expression
获取。
ExpressionEvaluatingReleaseStrategy
是DirectFieldAccessor
的属性,您可以使用AggregatingMessageHandler
上的AggregatingMessageHandler handler = beanFactory.getBean(aggregatorName + ".handler", AggregatingMessageHandler.class);
DirectFieldAccessor directFieldAccessor = new DirectFieldAccessor(handler);
ReleaseStrategy releaseStrategy = (ReleaseStrategy) directFieldAccessor.getPropertyValue("releaseStrategy");
DirectFieldAccessor dfa = new DirectFieldAccessor(releaseStrategy);
dfa.setPropertyValue("expression", ...);
进行更改:
{{1}}
无论如何,目前尚不清楚,为什么你需要这样的变态......