问题描述
请让我知道是否可以通过MessageGroup定义@ReleaseStrategy并将其与@Aggregator关联。
我的POJO定义如下,但不确定如何将@Aggregator与其关联
public class FooReleaseStrategy {
@ReleaseStrategy
public boolean canRelease(MessageGroup group) {
return group.isComplete();
}
}
我在配置中定义了@Aggregator和@CorrelationStratgy。
@Aggregator(inputChannel="sftpChannel" outputChannel="aggregateChannel")
public List<Message<?>> aggregateFiles(List<Message<?>> messages) {
return messages;
}
@CorrelationStrategy基于文件名。
如果可能的话,可以通过实例阐明@ReleaseStrategy关联,将非常有帮助。
根据评论,我计划创建一个聚合工厂bean,以查看是否适用于我的用例
@Bean
@ServiceActivator(inputChannel = "sftpChannel")
public factorybean<MessageHandler> aggregatorfactorybean( ) {
Aggregatorfactorybean aggregatorBean = new Aggregatorfactorybean();
aggregatorBean.setProcessorBean(new CustomAggregator());
aggregatorBean.setMethodName("aggregate");
aggregatorBean.setMessageStore(new SimpleMessageStore());
aggregatorBean.setReleaseStrategy(messageGroup -> {
return messageGroup.isComplete();
});
aggregatorBean.setoutputChannel(aggregatorFileChannel());
aggregatorBean.setExpireGroupsUponTimeout(true);
aggregatorBean.setGroupTimeoutExpression(new ValueExpression<>(1000L));
aggregatorBean.setSendPartialResultOnExpiry(false);
aggregatorBean.setExpireGroupsUponCompletion(true);
return aggregatorBean;
}
解决方法
如果要使用@Aggregator
,@ReleaseStrategy
和@CorrelationStrategy
,请考虑将AggregatorFactoryBean
配置为@Bean
并应用{{1} }在@SerivceActivator
和inputChannel
上的注释。
有关更多信息,请参阅文档:https://docs.spring.io/spring-integration/docs/5.4.0-M2/reference/html/message-routing.html#aggregator-annotations
,使用这种样式的配置时,@Aggregator
,@CorrelationStrategy
和@ReleasStrategy
通常位于同一bean中。
但是,您可以基于您的POJO方法定义一个ReleaseStrategyFactoryBean
bean,以提供ReleaseStrategy
的实现。
setTarget(myRSBean);
它将找到注释。