使用UnZipResultSplitter

时间:2016-02-02 18:41:42

标签: spring-integration

我正在使用Spring Integration Zip扩展,看起来我正在丢失我在流中添加上游的标题。我猜他们在UnZipResultSplitter.splitUnzippedMap()中迷失了,因为我没有看到任何明确复制它们的东西。

我似乎记得,对于分裂者来说这并不罕见,但我无法确定在这种情况下应该采用什么策略。

1 个答案:

答案 0 :(得分:2)

是的!

它看起来像一个bug。

splitter合同是这样的:

if (item instanceof Message) {
    builder = this.getMessageBuilderFactory().fromMessage((Message<?>) item);
}
else {
    builder = this.getMessageBuilderFactory().withPayload(item);
    builder.copyHeaders(headers);
}

因此,如果这些已拆分的项目已经是消息,就像我们的UnZipResultSplitter一样,我们只是按原样使用消息而不从上游复制标题。

请就此事提出JIRA票(https://jira.spring.io/browse/INTEXT)。

同时让我们考虑一些解决方法:

public class MyUnZipResultSplitter {

    public List<Message<Object>> splitUnzipped(Message<Map<String, Object>> unzippedEntries) {

        final List<Message<Object>> messages = new ArrayList<Message<Object>>(unzippedEntries.size());

        for (Map.Entry<String, Object> entry : unzippedEntries.getPayload().entrySet()) {
            final String path = FilenameUtils.getPath(entry.getKey());
            final String filename = FilenameUtils.getName(entry.getKey());
            final Message<Object> splitMessage =  MessageBuilder.withPayload(entry.getValue())
                .setHeader(FileHeaders.FILENAME, filename)
                .setHeader(ZipHeaders.ZIP_ENTRY_PATH, path)
                .copyHeaders(unzippedEntries/getHeaders())
                .build();
            messages.add(splitMessage);
        }
        return messages;
    }

}