Java 将通道链接在一起将删除文件\u原始文件头

Java 将通道链接在一起将删除文件\u原始文件头,java,spring-integration,Java,Spring Integration,我需要使用ftp并将文件放入动态本地目录中。我还想添加一个年龄过滤器。这是不允许旧文件通过的。这可以正确地处理文件。我添加了一个自定义过滤器,并使用以下代码检查了文件对象的创建日期: int ageLimit = Integer.parseInt(props.getProperty("file.age")); BasicFileAttributes view = null; try { view = Files.getFil

我需要使用ftp并将文件放入动态本地目录中。我还想添加一个年龄过滤器。这是不允许旧文件通过的。这可以正确地处理文件。我添加了一个自定义过滤器,并使用以下代码检查了文件对象的创建日期:

int ageLimit = Integer.parseInt(props.getProperty("file.age"));
        BasicFileAttributes view = null;
        try
        {
            view = Files.getFileAttributeView(
                    Paths.get(f.getAbsolutePath()),
                    BasicFileAttributeView.class).readAttributes();
        } catch (IOException e1)
        {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }
        FileTime ft = view.creationTime();
        if (((new Date()).getTime() - (((ft.to(TimeUnit.MILLISECONDS))/* / 10000L) - 11644473600000L*/))) > ageLimit
                * (24 * 60 * 60 * 1000))// file creation
                                        // date(converted
                                        // to
                                        // java.util.date)
                                        // - current
                                        // date >
                                        // oldness in ms
        {
            logger.info("File is old:" + (f.getName()));
            return false;
        }
这对于int文件适配器很好。但是当我添加ftp支持时,我在有效负载中得到的对象是一个FTPFile对象。这不会给出creationdate,但会给出最后修改的日期。上次修改的日期对我没有用。因此,我必须配置ftp,然后将文件适配器链接到目录

public String getCurrentPath(Message<File> payload)
{


    File f = payload.getPayload();
    if (payload.getHeaders().get(FileHeaders.ORIGINAL_FILE)== null)
    {
        return f.getAbsolutePath();
    }
    else
    {
        payload.getHeaders().get(FileHeaders.ORIGINAL_FILE).toString();
    }
    return null;
}
  • intftp:inbound通道适配器从ftp站点拾取一个文件并将其放在本地目录中

  • public String getCurrentPath(Message<File> payload)
    {
    
    
        File f = payload.getPayload();
        if (payload.getHeaders().get(FileHeaders.ORIGINAL_FILE)== null)
        {
            return f.getAbsolutePath();
        }
        else
        {
            payload.getHeaders().get(FileHeaders.ORIGINAL_FILE).toString();
        }
        return null;
    }
    
  • 此文件由int file:inbound通道适配器拾取并放入最终目标

  • 这是一个两步过程,用于拾取放置在ftp位置的文件

    filter类在int文件:入站通道适配器上工作。这个链子起作用了

    问题在于删除原始文件。ftp站点文件(远程目录)将自动删除。int file:入站通道适配器拾取的本地目录文件不会被删除

    这是我的配置

         <int:channel id="ftpChannel"/> 
     <int-ftp:outbound-channel-adapter id="ftpOutbound"
        channel="ftpChannel"
        session-factory="ftpClientFactory"
        charset="UTF-8"
        remote-file-separator="/"
        auto-create-directory="true"
        remote-directory="." 
        use-temporary-file-name="true"
        />  
    <int-ftp:inbound-channel-adapter id="ftpInbound"
        channel="ftpChannel"
        session-factory="ftpClientFactory"
        charset="UTF-8"
    
        local-directory="file:${paths.root}"
        delete-remote-files="true"
        temporary-file-suffix=".writing"
        remote-directory="."
         filename-pattern="*${file.char}*${file.char}*${file.char}*${file.char}*${file.char}*"
    
        preserve-timestamp="true"
         auto-startup="true">
        <int:poller fixed-rate="1000"/>
        </int-ftp:inbound-channel-adapter>
            <bean id="ftpClientFactory"
        class="org.springframework.integration.ftp.session.DefaultFtpSessionFactory">
        <property name="host" value="${ftp.ip}"/>
        <property name="port" value="${ftp.port}"/>
        <property name="username" value="${ftp.username}"/>
        <property name="password" value="${ftp.password}"/>
        <property name="clientMode" value="0"/>
        <property name="fileType" value="2"/>
        <property name="bufferSize" value="100000"/>
    </bean>
    
            <int-file:outbound-channel-adapter channel="abc" id="filesOut"
            directory-expression="@outPathBean.getPath()"
            delete-source-files="true" filename-generator="fileNameGenerator" />
    
     <int:header-enricher input-channel="ftpChannel" output-channel="ftpChannel">
        <int:header name="file_originalFile"  ref="getPath" method="getCurrentPath" />
    </int:header-enricher>
    
            <int-file:inbound-channel-adapter id="filesIn" directory="file:${paths.root}" channel="abc" filter="compositeFilter" >
            <int:poller id="poller" fixed-delay="5000" />
    
        </int-file:inbound-channel-adapter>
        <int:channel id="abc"/>
    
    
    
    还定义了customfilefilter和filenamegenerator bean

    我已经添加了头文件enricher来添加文件\原始文件头,因为我在某处读到,如果文件像我的情况一样被使用两次/链接,则会删除该头文件。尽管调用了bean方法,并且我已经在其中编写了以下代码,但该文件不会从文件适配器源目录中删除

    public String getCurrentPath(Message<File> payload)
    {
    
    
        File f = payload.getPayload();
        if (payload.getHeaders().get(FileHeaders.ORIGINAL_FILE)== null)
        {
            return f.getAbsolutePath();
        }
        else
        {
            payload.getHeaders().get(FileHeaders.ORIGINAL_FILE).toString();
        }
        return null;
    }
    
    公共字符串getCurrentPath(消息负载)
    {
    文件f=payload.getPayload();
    if(payload.getHeaders().get(FileHeaders.ORIGINAL_FILE)==null)
    {
    返回f.getAbsolutePath();
    }
    其他的
    {
    payload.getHeaders().get(FileHeaders.ORIGINAL_FILE.toString();
    }
    返回null;
    }
    
    我做错了什么??我也尝试过使用abc频道的标题润色器,但运气不好

    希望问题现在清楚了。。感谢您在以下方面提供的帮助

    无法将[org.springframework.integration.endpoint.EventDrivenConsumer]类型的值转换为属性“outputChannel”所需的[org.springframework.messaging.MessageChannel]类型:未找到匹配的编辑器或转换策略


    因为你有
    ,所以你的问题并不完全清楚

    也就是说,SpringIntegration3.0应该允许您在那里使用自定义过滤器

    要使用头删除本地文件,可以使用请求处理程序建议,有关更多信息,请参阅示例


    您的异常是因为您正在注入出站适配器作为转换器的
    输出通道
    ;您应该改为注入
    ftpChannel

    对不起,现在还不确定发生了什么。请解释一下你的要求和你的问题。对不起,我注意到了我答案中的错误。是的,您必须使用
    中的
    ftp频道来完成此操作。我可以从负载中检测源目录吗?如果是这样,我可以为这两个路径使用一个公共转换器。如果您的
    负载
    文件
    ,当然,您可以获取其
    绝对路径
    ,以提取
    目录
    。该目录是指定的本地目录。不是远程目录。在头文件enricher的bean方法中返回它并没有删除本地目录中的文件,我现在正在发送通道,并且它没有给出任何异常。将为Clarity编辑我的q为什么要添加标题?在这种情况下不使用它。使用
    ftp通道
    作为enricher上的输入和输出通道不是一种好做法。在这种情况下它会起作用,但我不推荐它;使用离散通道。目标是否在同一磁盘上?如果是,适配器只需重命名输入文件;如果没有,它将复制和删除(并编写信息日志)。我建议你打开调试日志来找出你的问题所在。我在某处读到,如果标题不存在,将导致源文件不会被删除。这就是为什么我尝试使用enricher。是,目标与本地目录位于同一磁盘上。它也可能是映射的网络路径,对吗?那么,我的文件不会从本地目录中删除的原因是什么??有输入吗?就像我说的,适配器首先尝试重命名文件,如果重命名失败,它会复制并删除原始文件。因此,如果它在同一磁盘上,则应重命名为ok。看看日志。这是我认为相关的问题: