Ich versuche, einen RSS-Feed-Reader mit einem konfigurierten Satz von RSS-Feeds zu codieren. Ich dachte, dass ein guter Ansatz darin besteht, das zu lösen, indem man einen Prototyp - @Bean
- codiert und ihn mit jedem in der Konfiguration gefundenen RSS-Feed aufruft.spring-integration-dsl: Machen Feed-Flow Arbeit
Allerdings denke ich, dass ich hier einen Punkt vermisse, wie die Anwendung startet, aber nichts passiert. Ich meine die Bohnen geschaffen, wie ich erwarten würde, aber es geschieht keine Protokollierung in diesem handle()
-Methode:
@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;
}
}
Was fehlt hier? Es scheint, als ob ich irgendwie die Flüsse "starten" muss.
Ja, 1.2 funktioniert gut. Cool! Vielen Dank. – sjngm