Spring 集成 XPathMessageSplitter + HeadEnricher
Spring Integration XPathMessageSplitter + HeadEnricher
我目前正在使用 Spring-Integration 和 JavaConfig 并使用 IntegrationFlows。我正在阅读 xml-file,它看起来像:
<?xml version="1.0" encoding="utf-8"?>
<languages>
<language name='de'>
<translations>
<translation key='Aktien' value='Aktien'/>
<translation key='Andere' value='Andere'/>
</translation>
</language>
<language name='en'>
<translations>
<translation key='Aktien' value='Stock'/>
<translation key='Andere' value='Others'/>
</translation>
</language>
</languages>
我的配置目前看起来像:
@Bean
public IntegrationFlow translationFileReadingFlow() throws IOException {
return IntegrationFlows
.from(pollableFileSource(), e -> e.poller(Pollers.fixedDelay(MAX_VALUE)))
.split(translationFileSplitter())
.channel("processFileChannel")
.logAndReply();
}
@Bean
@SubscribeMapping(value = "processFileChannel")
public IntegrationFlow applicationShutDown() {
return IntegrationFlows
.from("processFileChannel")
.resequence()
.handle(new ShutdownService())
.get();
}
private AbstractMessageSplitter translationFileSplitter() {
XPathMessageSplitter splitter = new XPathMessageSplitter("/languages/*");
return splitter;
}
我想按语言拆分 xml(目前有效),但我还想将语言信息添加到消息的 header 中。信息在 xml <language name='de'>
中。我可以直接用 XPathMessageSplitter
解决它还是需要 XPathHeaderEnricher
,如果是,它会如何工作?
提前致谢
不是主题:
我不确定:
@Bean
@SubscribeMapping(value = "processFileChannel")
public IntegrationFlow applicationShutDown() {
是正确的代码。 @SubscribeMapping
用于 POJO-based 方法映射。您绝对不能映射 IntegrationFlow
。如果您仍然需要从这样的 @SubscribeMapping
调用流程,则需要考虑引入一个 @MessagingGateway
接口来启动流程并从 POJO-method.
调用
您确实不能通过拆分器添加 headers。这不是它的责任。
如果您需要从 payload
中的 XML 填充 header,您肯定需要查看 XPathHeaderEnricher
。在你的情况下它可能是这样的:
@Bean
public XPathHeaderEnricher xPathHeaderEnricher() {
Map<String, XPathExpressionEvaluatingHeaderValueMessageProcessor> expressionMap =
Collections.singletonMap("language",
new XPathExpressionEvaluatingHeaderValueMessageProcessor("/language/@name"));
return new XPathHeaderEnricher(expressionMap);
}
并在提到的 .split()
:
之后使用
.split(translationFileSplitter())
.handle(xPathHeaderEnricher())
不过,还有另一种通过 SpEL 的方法:https://docs.spring.io/spring-integration/docs/5.2.0.RELEASE/reference/html/spel.html#spel-functions
.enrichHeaders((headers) ->
headers.headerExpression("language", "#xpath(payload, '/language/@name')"))
我目前正在使用 Spring-Integration 和 JavaConfig 并使用 IntegrationFlows。我正在阅读 xml-file,它看起来像:
<?xml version="1.0" encoding="utf-8"?>
<languages>
<language name='de'>
<translations>
<translation key='Aktien' value='Aktien'/>
<translation key='Andere' value='Andere'/>
</translation>
</language>
<language name='en'>
<translations>
<translation key='Aktien' value='Stock'/>
<translation key='Andere' value='Others'/>
</translation>
</language>
</languages>
我的配置目前看起来像:
@Bean
public IntegrationFlow translationFileReadingFlow() throws IOException {
return IntegrationFlows
.from(pollableFileSource(), e -> e.poller(Pollers.fixedDelay(MAX_VALUE)))
.split(translationFileSplitter())
.channel("processFileChannel")
.logAndReply();
}
@Bean
@SubscribeMapping(value = "processFileChannel")
public IntegrationFlow applicationShutDown() {
return IntegrationFlows
.from("processFileChannel")
.resequence()
.handle(new ShutdownService())
.get();
}
private AbstractMessageSplitter translationFileSplitter() {
XPathMessageSplitter splitter = new XPathMessageSplitter("/languages/*");
return splitter;
}
我想按语言拆分 xml(目前有效),但我还想将语言信息添加到消息的 header 中。信息在 xml <language name='de'>
中。我可以直接用 XPathMessageSplitter
解决它还是需要 XPathHeaderEnricher
,如果是,它会如何工作?
提前致谢
不是主题:
我不确定:
@Bean
@SubscribeMapping(value = "processFileChannel")
public IntegrationFlow applicationShutDown() {
是正确的代码。 @SubscribeMapping
用于 POJO-based 方法映射。您绝对不能映射 IntegrationFlow
。如果您仍然需要从这样的 @SubscribeMapping
调用流程,则需要考虑引入一个 @MessagingGateway
接口来启动流程并从 POJO-method.
您确实不能通过拆分器添加 headers。这不是它的责任。
如果您需要从 payload
中的 XML 填充 header,您肯定需要查看 XPathHeaderEnricher
。在你的情况下它可能是这样的:
@Bean
public XPathHeaderEnricher xPathHeaderEnricher() {
Map<String, XPathExpressionEvaluatingHeaderValueMessageProcessor> expressionMap =
Collections.singletonMap("language",
new XPathExpressionEvaluatingHeaderValueMessageProcessor("/language/@name"));
return new XPathHeaderEnricher(expressionMap);
}
并在提到的 .split()
:
.split(translationFileSplitter())
.handle(xPathHeaderEnricher())
不过,还有另一种通过 SpEL 的方法:https://docs.spring.io/spring-integration/docs/5.2.0.RELEASE/reference/html/spel.html#spel-functions
.enrichHeaders((headers) ->
headers.headerExpression("language", "#xpath(payload, '/language/@name')"))