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

@ReleaseStrategy - Spring Integration - Custom implementation

如果有办法用 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 并应用 [= inputChanneloutputChannel.

的 15=] 注释

有关详细信息,请参阅文档:https://docs.spring.io/spring-integration/docs/5.4.0-M2/reference/html/message-routing.html#aggregator-annotations

当使用那种配置风格时,@Aggregator@CorrelationStrategy@ReleasStrategy 通常在同一个 bean 中。

但是,您可以定义一个 ReleaseStrategyFactoryBean bean,它将根据您的 POJO 方法提供 ReleaseStrategy 的实现。

setTarget(myRSBean);

它将找到注释。