У меня есть требование, когда я хочу использовать ftp и помещать файл в динамический локальный каталог. Я также хочу добавить фильтр возраста. Это не позволяет пропустить старые файлы. Это работает с файлом должным образом. Я добавил специальный фильтр и проверил дату создания объектов File с помощью этого кода:Объединение каналов удаляет заголовок file_originalFile
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;
}
Это прекрасно работает для адаптера для файлов. Но когда я добавил поддержку ftp, объект, который я получил в полезной нагрузке, был объектом FTPFile. Это не дает createdate, но дает последнюю измененную дату. Последняя измененная дата не подходит для меня. Поэтому мне пришлось настроить ftp, а затем связать файловый адаптер с каталогом.
прерывание INT-FTP: въездной-канальный-адаптер подхватывает файл с сайта FTP и помещает его в локальном каталоге.
Этот файл подбирается по инет-файлу: входящему каналу-адаптеру и помещается в конечный пункт назначения.
Это двухэтапный процесс для загрузки файла, помещенного в местоположение ftp.
Класс фильтра работает с внутренним файлом: входящим каналом-адаптером. Эта цепочка работает.
Проблема заключается в удалении исходных файлов. Файл ftp-сайта (удаленный каталог) автоматически удаляется. Файл локального каталога, который подбирается в файле int-file: inbound-channel-adapter, не удаляется.
Это моя конфигурация.
<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"/>
Также определены фасоль настраиваемого фильтра и фанера -генератора.
Я добавил заголовок-обогатитель, чтобы добавить заголовок file_originalFile, когда я где-то читал, что этот заголовок опущен, если файл используется дважды/цепочка, как в моей ситуации. Хотя метод beans вызывается, и я написал в нем следующий код, файл не удаляется из исходной директории файловых адаптеров.
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;
}
Что я делаю неправильно? Я пробовал использовать header-enricher для канала abc, а также не повезло!
Надежда проблема теперь ясно .. Спасибо за вашу помощь
Извините, но это еще не все, что происходит. Объясните, пожалуйста, ваше требование и какая у вас проблема. –