@ReleaseStrategy-Spring集成-自定义实现

问题描述

请让我知道是否可以通过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} }在@SerivceActivatorinputChannel上的注释。

有关更多信息,请参阅文档: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);

它将找到注释。