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