@ReleaseStrategy — Интеграция Spring — пользовательская реализация

#java #spring-integration

#java #spring-интеграция

Вопрос:

Пожалуйста, дайте мне знать, есть ли способ определить @ReleaseStrategy с помощью MessageGroup и связать его с @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 с примером, если это возможно.

Основываясь на комментариях, я планирую создать компонент aggregator factory, чтобы посмотреть, подходит ли он для моего варианта использования

     @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;
    }
  

Ответ №1:

Если вы хотите использовать @Aggregator , @ReleaseStrategy и @CorrelationStrategy , подумайте о том, чтобы сконфигурировать AggregatorFactoryBean как @Bean и применить к нему @SerivceActivator аннотацию для этих inputChannel и outputChannel .

Смотрите документы для получения дополнительной информации: https://docs.spring.io/spring-integration/docs/5.4.0-M2/reference/html/message-routing.html#aggregator-annotations

Ответ №2:

При использовании этого стиля конфигурации @Aggregator , @CorrelationStrategy и @ReleasStrategy обычно находятся в одном и том же компоненте.

Однако вы можете определить ReleaseStrategyFactoryBean компонент, который обеспечит реализацию ReleaseStrategy на основе вашего метода POJO.

 setTarget(myRSBean);
  

Он найдет аннотацию.