2016-08-22 2 views
0

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.

Antwort

0

Prototyp-Beans müssen irgendwo "verwendet" werden - wenn Sie nirgends einen Verweis darauf haben, wird keine Instanz erstellt.

Desweiteren können Sie keine IntegrationFlow@Bean in diesem Bereich setzen - es erzeugt intern eine Menge von Beans, die nicht in diesem Bereich liegen.

Siehe die Antwort to this question und its follow-up für eine Technik, die Sie verwenden können, um mehrere Adapter mit unterschiedlichen Eigenschaften zu erstellen.

Alternativ dazu hat der kommende 1.2 version of the DSL einen Mechanismus, um Flüsse dynamisch zu registrieren.

+0

Ja, 1.2 funktioniert gut. Cool! Vielen Dank. – sjngm

Verwandte Themen