1

我在我的应用程序中使用了 spring 集成的聚合器。我正在使用黄瓜来测试流程,并且我想确保聚合器发布策略由正确的参数执行。我有 2 个参数用于该策略:超时和大小。我想知道是否有办法在这些步骤中动态加载这些参数?到目前为止,我对如何使它工作感到迷茫。

谢谢,

谢谢阿尔特姆,

我使用了directFieldAccessorand 我试图从聚合器中获取release-strategy-expressionandgroup-timeout属性,但问题是我无法访问这些字段:

public void setAggregatorConfiguration(String aggregatorName, int aggregationThreshold, long aggregationTimeout) { 
         EventDrivenConsumer aggregator = getAggregator(aggregatorName);           
         DirectFieldAccessor directFieldAccessor = new DirectFieldAccessor(aggregator); 
         directFieldAccessor.setPropertyValue("group-timeout", aggregationTimeout); 
} 
4

1 回答 1

1

我有该策略的 2 个参数:超时和大小

好吧,我猜你使用TimeoutCountSequenceSizeReleaseStrategy. 正如我们所见,这些参数在该类中是最终的,并且它们实际上不能在运行时仅使用 setter 进行更改。

只有一种方法可以在运行时更改这些值 - 使用DirectFieldAccessor.

但是,如果您还分享有关您的用例和配置以及单元测试的更多信息,我们可能会找到其他方式来帮助您。

我已经编辑了您的帖子以添加您的代码。不,你必须使用真实的财产名称,所以它应该是groupTimeoutExpression,而不是group-timeout。从另一边有一个关于此事的公共二传手:AbstractCorrelatingMessageHandler.setGroupTimeoutExpression(Expression groupTimeoutExpression)

从另一面看,您会走错路:任何MessageHandler组件(<aggregator>, <service-activator>)都提供了多个组件。对,它们的根是a 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", ...);

无论如何,不​​清楚,为什么你需要这样的变态......

于 2014-09-10T09:53:13.860 回答