我有一个消息处理链。
<int:header-enricher input-channel="acceptFileChannel" output-channel="validateMessageChannel">
<int:error-channel ref="validateSplitTransformErrorChannel"/>
<int:header name="originalFileName" expression="payload.getName()"/>
<int:header name="originalFile" expression="payload"/>
</int:header-enricher>
<int:service-activator input-channel="validateMessageChannel" output-channel="splitMessageChannel">
<bean class="com.my.usual.ValidationService">
<property name="schemaResource" value="classpath:/META-INF/xsd/locals_final_version.xsd"/>
</bean>
</int:service-activator>
<int:splitter id="staxXmlSplitter" input-channel="splitMessageChannel"
output-channel="payloadTypeRoutingChannel">
<bean class="com.my.usual.XMLSplitter"/>
</int:splitter>
<int:payload-type-router input-channel="payloadTypeRoutingChannel">
<int:mapping type="org.w3c.dom.Node" channel="afterSplitChannel"/>
<int:mapping type="com.my.usual.SequenceSizeMessage" channel="barrier"/>
</int:payload-type-router>
<int:channel id="afterSplitChannel">
<int:dispatcher task-executor="taskExecutor"/>
</int:channel>
<si-xml:xpath-router id="afterSplitRouter" input-channel="afterSplitChannel" evaluate-as-string="true">
<si-xml:xpath-expression expression="local-name(/Act | /Partner)"/>
<si-xml:mapping value="Act" channel="transformActChannel"/>
<!--todo: for example of extending-->
<si-xml:mapping value="Partner" channel="nullChannel"/>
</si-xml:xpath-router>
在此链中,我设置了两个邮件标题:originalFileName
和originalFile
。
似乎在com.my.usual.XMLSplitter
拆分消息后保留标题的最简单方法是覆盖类似的方法。
@Override
protected boolean shouldCopyRequestHeaders() {
return true;
}
但是,如果我在分割的邮件中只需要一个标头怎么办?我注意读取originalFileName
的值并将其写入每个拆分的消息。
我想我可以通过willAddHeaders
和addHeaders
分割器方法编写标头。但我不确定分裂器bean的范围。因此,如果它是一个单身人士,并且将是用户连续的,那么如何保留原始标题?
有人可以帮我找到好的解决方案吗?
感谢您的回答。
答案 0 :(得分:0)
你的问题不清楚。
看,你<int:header-enricher>
之前有<int:splitter>
。这样你确实只将它写入原始消息一次。拆分器的性质,将所有请求标头复制到每个拆分项中:
Map<String, Object> messageHeaders = message.getHeaders();
if (willAddHeaders(message)) {
messageHeaders = new HashMap<>(messageHeaders);
addHeaders(message, messageHeaders);
}
final Map<String, Object> headers = messageHeaders;
final Object correlationId = message.getHeaders().getId();
final AtomicInteger sequenceNumber = new AtomicInteger(1);
Function<Object, AbstractIntegrationMessageBuilder<?>> messageBuilderFunction =
object -> createBuilder(object, headers, correlationId, sequenceNumber.getAndIncrement(), sequenceSize);
因此,您正在寻找的是开箱即用的功能,payloadTypeRoutingChannel
上的所有邮件都会包含originalFileName
和originalFile
标题!