Spring Integration Aggregator

时间:2015-04-01 11:55:54

标签: java spring spring-integration

我想使用聚合器从两条消息中创建消息,但我不确定如何执行此操作。

目前,我正在从目录中读取两个文件,并希望将这些消息合并为一个。

我的整个项目看起来像这样:

读入.zip - >传递给自定义消息处理程序,将其解压缩到目录中 - >从这个目录中读取文件 - >尝试聚合它们

如果我可以在解压缩文件后发送带有两个有效负载的消息,那将会很棒,但是在阅读之后进行聚合就足够了。

我的unzipper看起来像这样:

public class ZipHandler extends AbstractMessageHandler {

File dat;
File json;

@Override
protected void handleMessageInternal(Message<?> message) throws Exception {
    byte[] buffer = new byte[1024];
    try {
        File file = (File) message.getPayload();
        ZipFile zip = new ZipFile(file);

        for (Enumeration<? extends ZipEntry> entries = zip.entries(); entries
                .hasMoreElements();) {
            ZipEntry ze = entries.nextElement();
            String name = ze.getName();

            if (name.endsWith(".dat") || name.endsWith(".DAT")) {
                InputStream input = zip.getInputStream(ze);
                File datFile = new File("D:/lrtrans/zipOut"
                        + File.separator + name);
                FileOutputStream fos = new FileOutputStream(datFile);
                int len;
                while ((len = input.read(buffer)) > 0) {
                    fos.write(buffer, 0, len);
                }
                this.dat = datFile;
                fos.close();
            } else if (name.endsWith(".json") || name.endsWith(".JSON")) {
                InputStream input = zip.getInputStream(ze);
                File jsonFile = new File("D:/lrtrans/zipOut"
                        + File.separator + name);
                FileOutputStream fos = new FileOutputStream(jsonFile);
                int len;
                while ((len = input.read(buffer)) > 0) {
                    fos.write(buffer, 0, len);
                }
                this.json = jsonFile;
                fos.close();
            }
        }
        zip.close();
    } catch (Exception e) {
        e.printStackTrace();
    }

}
}

它接收这些文件并将它们放入两个目录中,然后使用FileReadingMessageSource再次读取它们。 我也想使用仅基于注释的符号来解决这个问题,而不是xml。

修改

我想使用defaultAggregatingMessagegroupProcssor和correlationStrategy,它基于我的标题&#34; zip&#34;以及基于该消息的releaseStrategy,因此,在这种情况下,两个文件应合并为一个。

@Aggregator(inputChannel = "toAggregatorChannel", outputChannel = "toRouterChannel", discardChannel = "nullChannel")
public DefaultAggregatingMessageGroupProcessor aggregate(){
    DefaultAggregatingMessageGroupProcessor aggregator = new DefaultAggregatingMessageGroupProcessor(); 
    return aggregator;
}
@CorrelationStrategy 
public String correlateBy(@Header("zipFile") String zip){
    return zip;
}
@ReleaseStrategy
public boolean isReadytoRelease(List<Message<?>> messages) {
    return messages.size() == 2;
}

1 个答案:

答案 0 :(得分:0)

我说你走对了路。由于zip中包含多个文件,因此解压缩并将这些文件作为一条消息收集并发送以进行进一步处理是正确的。

所以,是的,<aggregator>适合你。只需要确定如何关联和分组它们。

不知道你如何解压缩它们,但你真的可以使用zip文件名作为correlationKey并使用多个文件作为组大小来确定释放该组的信号。

随意提出更多问题。但首先我需要看到你的&#34; unzipper&#34;。

<强>更新

首先,基于注释的聚合器配置有点受限,最好使用@ServiceActivator AggregatingMessageHandler上的@Bean来更好地控制其选项。

但是,即使您选择,也可以达到您的要求。但@Aggregator配置应遵循POJO方法调用原则:

@Aggregator(inputChannel = "toAggregatorChannel", outputChannel = "toRouterChannel", discardChannel = "nullChannel")
public List<File> aggregate(List<File> files){
    return files;
}

类似的东西。