我一直在考虑使用Spring Integration消费多个RSS feed。我按照集成指南进行了操作:https://spring.io/guides/gs/integration/这很棒。
是否可以将多个入站通道适配器(用于多个源)写入一个通道?
是否可以在数据中使用通道适配器ID来识别Feed(例如Spring Blog)?
任何示例代码都很棒。
答案 0 :(得分:0)
是的,您可以将多个通道适配器连接到同一个消息通道。实际上任何制作人都可以发送到任何频道并且有关于其他信息的请求,我建议在每个馈送入站适配器之后有一个标题更丰富,以填充所需的特征。之后,您可以发送到该单个频道进行处理。
答案 1 :(得分:0)
是的,只需给频道适配器id
并命名频道(如果没有channel
,则id
成为适配器的频道名称)。您可以将多个适配器提供给同一个通道。添加标题集以识别源...
<feed:inbound-channel-adapter id="spring"
channel="springblog" url="http://spring.io/blog.atom" auto-startup="${auto.startup:true}">
<int:poller fixed-rate="5000"/>
</feed:inbound-channel-adapter>
<int:header-enricher input-channel="springblog" output-channel="news">
<int:header name="source" value="spring.blog"/>
</int:header-enricher>
<int:transformer
input-channel="news"
expression=
"headers['source'] + ':' + payload.title + ' @ ' + payload.link + '#{systemProperties['line.separator']}'"
output-channel="file"/>
<file:outbound-channel-adapter id="file"
mode="APPEND"
charset="UTF-8"
directory="/tmp/si"
filename-generator-expression="'${feed.file.name:SpringBlog}'"/>
使用较新的Java DSL而不是XML,这将是......
@Bean
public IntegrationFlow blog() throws Exception {
return IntegrationFlows
.from(new FeedEntryMessageSource(new URL(BLOG_URI), "blog"), e -> e.id("blog").poller(Pollers.fixedDelay(5000)))
.enrichHeaders(h -> h.header("source", "spring.blog"))
.channel("news")
.get();
}
@Bean
public IntegrationFlow newsFlow() {
return IntegrationFlows.from("news")
.transform("headers['source'] + ':' + payload.title + ' @ ' + payload.link + '" + newline + "'") // SpEL
.handle(Files.outboundAdapter(new File("/tmp/si/"))
.fileNameExpression("'SpringBlogDSL'")
.fileExistsMode(FileExistsMode.APPEND))
.get();
}
修改强>
动态流程注册......
@Autowired
private IntegrationFlowContext flowContext;
...
IntegrationFlow newFLow = IntegrationFlows
.from(new FeedEntryMessageSource(new URL(BLOG_URI), "blog"), e -> e.id("blog").poller(Pollers.fixedDelay(5000)))
.enrichHeaders(h -> h.header("source", "spring.blog"))
.channel("news")
.get();
this.flowContent.registration(newFlow).register();
有关完整示例,请参阅dynamic-tcp-client sample。