#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);
Он найдет аннотацию.