繁体   English   中英

Spring Integration Aggregator

[英]Spring Integration Aggregator

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

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

我的整个项目如下所示:

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

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

我的解压缩看起来像这样:

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与基于我的标头“ zip”的correlationStrategy和基于消息的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;
}

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

因此,是的, <aggregator>适合您。 只需确定如何关联和分组它们。

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

随时问更多问题。 但是首先,我需要看到您的“解压缩器”。

UPDATE

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

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

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

这样的事情。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM