spring-integration-dsl: заставить Feed-Flow работать

Я пытаюсь закодировать программу чтения RSS-каналов с настроенным набором RSS-каналов. Я подумал, что хороший подход состоит в том, чтобы решить эту проблему, запрограммировав прототип-@Bean и вызывая его с каждым RSS-потоком, найденным в конфигурации.

Однако я предполагаю, что здесь я упускаю момент, когда приложение запускается, но ничего не происходит. Я имею в виду, что bean-компоненты создаются, как я и ожидал, но в этом handle()-методе не происходит ведения журнала:

@Component
public class HomeServerRunner implements ApplicationRunner {

    private static final Logger logger = LoggerFactory.getLogger(HomeServerRunner.class);

    @Autowired
    private Configuration configuration;

    @Autowired
    private FeedConfigurator feedConfigurator;

    @Override
    public void run(ApplicationArguments args) throws Exception {
        List<IntegrationFlow> feedFlows = configuration.getRssFeeds()
            .entrySet()
            .stream()
            .peek(entry -> System.out.println(entry.getKey()))
            .map(entry -> feedConfigurator.feedFlow(entry.getKey(), entry.getValue()))
            .collect(Collectors.toList());
        // this one appears in the log-file and looks good
        logger.info("Flows: " + feedFlows);
    }

}

@Configuration
public class FeedConfigurator {

    private static final Logger logger = LoggerFactory.getLogger(FeedConfigurator.class);

    @Bean
    @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
    public IntegrationFlow feedFlow(String name, FeedConfiguration configuration) {
        return IntegrationFlows
                .from(Feed
                        .inboundAdapter(configuration.getSource(), getElementName(name, "adapter"))
                        .feedFetcher(new HttpClientFeedFetcher()),
                        spec -> spec.poller(Pollers.fixedRate(configuration.getInterval())))
                .channel(MessageChannels.direct(getElementName(name, "in")))
                .enrichHeaders(spec -> spec.header("feedSource", configuration))
                .channel(getElementName(name, "handle"))
        //
        // it would be nice if the following would show something:
        //
                .handle(m -> logger.debug("Payload: " + m.getPayload()))
                .get();
    }

    private String getElementName(String name, String postfix) {
        name = "feedChannel" + StringUtils.capitalize(name);
        if (!StringUtils.isEmpty(postfix)) {
            name += "." + postfix;
        }
        return name;
    }

}

Чего здесь не хватает? Кажется, мне нужно как-то "запустить" потоки.


person sjngm    schedule 22.08.2016    source источник


Ответы (1)


Прототип bean-компонентов нужно где-то "использовать" - если у вас нигде нет ссылки на него, экземпляр не будет создан.

Кроме того, вы не можете поместить IntegrationFlow @Bean в эту область - она ​​генерирует внутри кучу bean-компонентов, которых не будет в этой области.

См. ответ на этот вопрос и его продолжение для одного метода, который можно использовать для создания нескольких адаптеров с разными свойствами.

Кроме того, предстоящие версия 1.2 DSL имеет механизм динамической регистрации потоков.

person Gary Russell    schedule 22.08.2016