Как я могу определить список файлов в каталоге из моего кода C или C ++?
Мне не разрешено выполнять ls
и проанализируйте результаты в моей программе.
ОБНОВЛЕНИЕ 2017 :
В C ++ 17 теперь существует официальный способ перечисления файлов вашей файловой системы: std :: filesystem
. Ниже приведен отличный ответ от Shreevardhan с этим исходным кодом:
#include #include #include пространство имен fs = std :: filesystem; int main () {std :: string path = "/путь/к/каталогу"; for (const auto & entry: fs :: directory_iterator (path)) std :: cout
Старый ответ:
В небольших и простых задачах я не использую boost, я использую dirent.h , который также доступен для Windows:
DIR * dir; struct dirent * ent; if ((dir = opendir ("c: \ src \")! = NULL) {/* распечатать все файлы и каталоги в каталоге */while ((ent = readdir (dir))! = NULL) {printf ("% s n", ent-> d_name); } closedir (dir);} else {/* не удалось открыть каталог */perror (""); return EXIT_FAILURE;}
Это всего лишь небольшой файл заголовка, который выполняет большую часть простых вещей, которые вам нужны, без использования большого подхода на основе шаблонов, такого как boost (без обид, мне нравится boost !).
Автор слоя совместимости с Windows — Тони Ронкко. В Unix это стандартный заголовок.
В C ++ 17 теперь есть std :: filesystem :: directory_iterator
, который можно использовать как
#include #include #include namespace fs = std :: файловая система; int main () {std :: string path = "/путь/к/каталогу"; for (const auto & entry: fs :: directory_iterator (path)) std :: cout
Кроме того, std :: filesystem :: recursive_directory_iterator
также может перебирать подкаталоги.
11
К сожалению, стандарт C ++ не определяет стандартный способ работы с файлами и папками таким образом.
Поскольку кросс-платформенный способ отсутствует, лучший кросс-платформенный способ — использовать библиотеку, такую как модуль файловой системы boost.
Кросс-платформенный метод ускорения:
Следующая функция, учитывая путь к каталогу и имя файла, рекурсивно ищет в каталоге и его подкаталогах имя файла, возвращая bool, и в случае успеха путь к найденному файлу.
bool find_file (const path & dir_path,//в этом каталоге, const std :: string & file_name,//ищем это имя, path & path_found)//размещение путь здесь, если найден {if (! существует (dir_path)) return false; directory_iterator end_itr; //конструкция по умолчанию возвращает конец для (directory_iterator itr (dir_path); itr! = end_itr; ++ itr) {if (is_directory (itr-> status ())) {if (find_file (itr-> path ( ), имя_файла, найденный путь)) return true; } else if (itr-> leaf () == file_name)//см. ниже {path_found = itr-> path (); вернуть истину; }} return false;}
Источник со страницы повышения, упомянутой выше.
Для Unix/Linux. системы:
Вы можете использовать opendir/readdir/closedir.
Пример кода, который ищет в каталоге запись « name »:
len = strlen (name); dirp = opendir ("."); while ((dp = readdir (dirp))! = NULL) if (dp-> d_namlen == len &&! strcmp (dp-> d_name, name)) {(void) closedir ( дирп); return FOUND; } (void) closedir (dirp); return NOT_FOUND;
Исходный код из приведенных выше страниц руководства.
Для систем на базе Windows:
Вы можете использовать функции Win32 API FindFirstFile/FindNextFile/FindClose.
Следующий C ++ пример показывает минимальное использование FindFirstFile.
#include #include #include void _tmain (int argc, TCHAR * argv []) {WIN32_FIND_DATA FindFileData; HANDLE hFind; if (argc! = 2) {_tprintf (TEXT ("Использование:% s [целевой_файл] n"), argv [0]); возвращаться; } _tprintf (ТЕКСТ ("Целевой файл% s n"), argv [1]); hFind = FindFirstFile (argv [1], & FindFileData); if (hFind == INVALID_HANDLE_VALUE) {printf ("Ошибка поиска первого файла (% d) n", GetLastError ()); возвращаться; } else {_tprintf (ТЕКСТ ("Первый найденный файл -% s n"), FindFileData.cFileName); FindClose (hFind); }}
Исходный код с указанных выше страниц msdn.
3
Одной функции достаточно, вам не нужно использовать сторонние библиотека (для Windows).
#include vector get_all_files_names_within_folder (string folder) {vector names ; строка search_path = folder + "/*.*"; WIN32_FIND_DATA fd; ОБРАБОТКА hFind = :: FindFirstFile (search_path.c_str (), & fd); if (hFind! = INVALID_HANDLE_VALUE) {do {//читать все (реальные) файлы в текущей папке//, удалить '!' прочтите 2 другие папки по умолчанию. и .. if (! (fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) {names.push_back (fd. cFileName); }} while (:: FindNextFile (hFind, & fd)); :: FindClose (hFind); } return names;}
PS: как упомянул @Sebastian, вы можете изменить *. *
на *. ext
, чтобы получить в этом каталоге только EXT-файлы (т.е. определенного типа).
16
Для решения только на C проверьте это. Для этого нужен только дополнительный заголовок:
https://github.com/cxong/tinydir
tinydir_dir dir; tinydir_open (& dir, "/ путь/к/каталогу "); while (dir.has_next) {файл tinydir_file; tinydir_readfile (& каталог, & файл); printf ("% s", имя_файла); если (file.is_dir) {printf ("/"); } printf (" п"); tinydir_next (& dir);} tinydir_close (& dir);
Некоторые преимущества перед другими вариантами:
- Это переносимо — обертывает директиву POSIX и Windows FindFirstFile.
- Он использует
readdir_r
там, где это возможно, что означает, что он (обычно) потокобезопасен. - Поддерживает Windows UTF-16 через те же макросы
UNICODE
- Это C90, поэтому его могут использовать даже очень древние компиляторы
2
Я рекомендую использовать glob
с этой многоразовой оболочкой . Он генерирует vector
, соответствующий путям файлов, которые соответствуют шаблону глобуса:
#include #include с использованием std :: vector; vector globVector (const string & pattern) {glob_t glob_result; glob (pattern.c_str (), GLOB_TILDE, NULL, & glob_result); векторные файлы ; for (беззнаковое int я = 0; я
Который затем может быть вызван с обычным системным шаблоном подстановки, например:
векторные файлы = globVector ("./*");
5
Вот очень простой код на C ++ 11
, использующий библиотеку boost :: filesystem
для получения имен файлов. в каталоге (исключая имена папок):
#include #include #include using namespace std; using namespace boost: : файловая система; int main () {путь p ("D:/AnyFolder"); for (auto i = directory_iterator (p); i! = directory_iterator (); i ++) {if (! is_directory (i-> path ()))//мы удаляем каталоги {cout path (). filename () .string ()
Вывод выглядит примерно так:
file1.txtfile2. dat
2
Я думаю, нижеприведенный фрагмент может быть используется для вывода списка всех файлов.
#include #include #include int main (int argc, char ** argv) {list_dir ("myFolderName"); return EXIT_SUCCESS;} static void list_dir (const char * path) {struct dirent * entry; DIR * dir = opendir (путь); если (dir == NULL) {возврат; } while ((entry = readdir (dir))! = NULL) {printf ("% s n", запись-> d_name); } closedir (dir);}
Это используемая структура (присутствует в dirent.h
):
struct dirent {ino_t d_ino; /* номер inode */off_t d_off; /* смещение до следующего направления */unsigned short d_reclen; /* длина этой записи */unsigned char d_type; /* тип файла */char d_name [256]; /* имя файла */};
2
Почему бы не использовать glob ()
?
#include glob_t glob_result; glob ( "/your_directory/*", GLOB_TILDE, NULL, & glob_result); for (unsigned int i = 0; i
3
Попробуйте форсировать для метода x-платформы
http://www.boost.org/doc/libs/1_38_0/libs/filesystem/doc/index.htm
или просто используйте файлы, специфичные для вашей ОС.
2
Обратите внимание на этот класс, который использует win32 api. Просто создайте экземпляр, указав имя папки
, из которого вы хотите получить листинг, затем вызовите метод getNextFile
, чтобы получить следующее имя файла
из каталога. Я думаю, ему нужны windows.h
и stdio.h
.
class FileGetter {WIN32_FIND_DATAA found; HANDLE hfind; char folderstar [255]; int chk; общедоступные: FileGetter (char * folder) {sprintf (folderstar, "% s \ *. *", папка); hfind = FindFirstFileA (папка, & найдено); //пропускать . FindNextFileA (hfind, & найдено); } int getNextFile (char * fname) {//пропускает .. при первом вызове chk = FindNextFileA (hfind, & found); если (chk) strcpy (fname, found.cFileName); return chk; }};
1
Руководство GNU FTW
http://www.gnu.org/software/libc/manual/html_node/Simple-Directory-Lister.html#Simple-Directory-Lister
Кроме того, иногда полезно сразу перейти к источнику (каламбур). Вы можете многому научиться, взглянув на внутренности некоторых из наиболее распространенных команд в Linux. Я установил простое зеркало GNU coreutils на github (для чтения).
https://github.com/homer6/gnu_coreutils/blob/master/src/ls.c
Возможно, это не относится к Windows, но в ряде случаев можно использовать варианты Unix, используя эти методы.
Надеюсь, что это поможет …
Ответ Шривардхана отлично работает. Но если вы хотите использовать его в C ++ 14, просто измените пространство имен fs = experimental :: filesystem;
, т.е.
#include #include #include using namespace std; namespace fs = experimental :: filesystem; int main () {string path = "C: \ splits "; for (auto & p: fs :: directory_iterator (path)) cout > n;}
char ** getKeys (char * data_dir, char * tablename, int * num_keys) {char ** arr = malloc (MAX_RECORDS_PER_TABLE * sizeof (char *)); int i = 0; for (; i d_name);} * (num_keys) = i; return arr;}
Надеюсь, этот код вам поможет.
#include #include # включить #include using namespace std; string wchar_t2string (const wchar_t * wchar) {string str = ""; int index = 0; в то время как (wchar [индекс]! = 0) {str + = (char) wchar [индекс]; ++ index; } return str;} wchar_t * string2wchar_t (const string & str) {wchar_t wchar [260]; int index = 0; в то время как (индекс listFilesInDirectory (строка directoryName) {WIN32_FIND_DATA FindFileData; wchar_t * FileName = string2wchar_t (directoryName); ОБРАБОТКА hFind = FindFirstFile (Имя файла, & FindFileData); vector listFileNames; listFileNames.push_back (wchar_t2string (FindFileData.cFileName)); while (FindNextFile (hFind, & FindFileData)) listFileNames.push_back (wchar_t2string (FindFileData.cFileName)); return listFileNames;} void main () {vector listFiles; listFiles = listFilesInDirectory ("C: \ *. txt "); для каждого (строка str в listFiles) cout
1
Эта реализация реализует вашу цель, динамически заполняя массив строк содержимым указанного каталога.
int exploreDirectory ( const char * dirpath, char *** list, int * numItems) {struct dirent ** direntList; int i; errno = 0; if ((* numItems = scandir (dirpath, & direntList, NULL, alphasort)) == -1 ) return errno; if (! ((* list) = malloc (sizeof (char *) * (* numItems)))) {fprintf (stderr, "Ошибка при выделении списка для списка файлов: dirpath =% s. n" , dirpath); exit (EXIT_FAILURE);} for (i = 0; i d_name);} for (i = 0; i
1
Системный вызов!
system ("dir/b/s/ad *> file_names.txt");
Затем просто прочтите файл.
EDIT: Это ответ следует рассматривать как взлом, но он действительно работает (хотя и для конкретной платформы), если у вас нет доступа к более элегантным решениям.
2
У меня это работает. Извините, если я не могу вспомнить источник. Вероятно, это страница руководства.
#include int AnalizeDirectoryElement (const char * fpath, const struct stat * sb, int tflag, struct FTW * ftwbuf ) {если (tflag == FTW_F) {std :: string strFileName (fpath); DoSomethingWith (strFileName); } return 0; } void WalkDirectoryTree (const char * pchFileName) {int nFlags = 0; если (nftw (pchFileName, AnalizeDirectoryElement, 20, nFlags) == -1) {ошибка ("nftw"); }} int main () {WalkDirectoryTree ("some_dir/");}
вы можете напрямую получить все файлы в корневом каталоге, используя std :: experimental :: filesystem :: directory_iterator (). Затем прочтите имена этих файлов пути.
#include #include #include #include using namespace std; namespace fs = std :: experimental :: filesystem; void ShowListFile (string path) {for (auto & p: fs :: directory_iterator (path))/* получить каталог */cout
Этот ответ должен работать для пользователей Windows, у которых возникли проблемы с тем, чтобы заставить это работать с Visual Studio с любым другим ответы.
-
Загрузите файл dirent.h со страницы github. Но лучше просто использовать файл Raw dirent.h и следовать моим инструкциям ниже (именно так я заставил его работать).
Страница Github для dirent.h для Windows: Страница Github для dirent .h
Файл Raw Dirent: Файл Raw dirent.h
-
Перейдите в свой проект и добавьте новый элемент ( Ctrl + Shift + A ). Добавьте файл заголовка (.h) и назовите его dirent.h.
-
Вставьте код файла Raw dirent.h в свой заголовок.
-
Включите «dirent.h» в свой код.
-
Поместите ниже
void filefinder ()
в коде и вызовите его из своей функцииmain
или отредактируйте функцию, как вы хотите ее использовать.#include #include #include "dirent.h" string path = "C:/folder"; //Укажите здесь допустимый путь для foldervoid filefinder () {DIR * directory = opendir (path.c_str ()); struct dirent * direntStruct; if (каталог! = NULL) {while (direntStruct = readdir (каталог)) {printf ("Имя файла:% s n", direntStruct-> d_name); //Если вы используете //std :: cout d_name }} closedir (directory);}
#include #include #include пространство имен fs = std: : файловая система; int main () {std :: string path = "/путь/к/каталогу"; for (const auto & entry: fs :: directory_iterator (path)) std :: cout
Поскольку файлы и подкаталоги каталога обычно хранятся в древовидной структуре, интуитивно понятным способом является использование алгоритма DFS для рекурсивно пройти по каждому из них. Вот пример в операционной системе Windows с использованием основных файловых функций в io.h. Вы можете заменить эти функции на другой платформе. Я хочу сказать, что основная идея DFS полностью решает эту проблему.
#include #include #include using namespace std; void TraverseFilesUsingDFS (const string & folder_path) {_finddata_t file_info; строка any_file_pattern = folder_path + "\ *"; intptr_t handle = _findfirst (any_file_pattern. c_str (), & file_info); //Если folder_path существует, использование any_file_pattern найдет как минимум два файла "." и "..",//из которых "." означает текущий каталог, а ".." означает родительский каталог if (handle == -1) {cerr
Я попытался следовать примеру, приведенному в обоих ответах, и, возможно, стоит отметить, что похоже, что std :: filesystem :: directory_entry
был изменен на not есть перегрузка оператора . Вместо
std :: cout мне пришлось использовать следующее, чтобы скомпилировать и заставить его работать:
#include #include #include пространство имен fs = std :: filesystem; int main () {std :: string path = "/путь/к/каталогу"; for (const auto & p: fs :: directory_iterator (path)) std :: cout
пытается передать p
на std :: cout привело к отсутствующей ошибке перегрузки.
Основываясь на том, что опубликовал herohuyongtao, и несколько других сообщений:
http://www.cplusplus.com/forum/general/39766/
Каков ожидаемый тип ввода FindFirstFile?
Как преобразовать wstring в строку ?
Это решение для Windows.
Поскольку я хотел передать std :: string и вернуть вектор строк, мне пришлось сделать пару преобразований.
#include #include #include #include #include std :: vector listFilesInDir (std :: string path) {std :: vector имена; //Преобразование строки в wstring std :: wstring search_path = std :: wstring_convert > (). From_bytes (path); WIN32_FIND_DATA fd; HANDLE hFind = FindFirstFile (search_path. c_str (), & fd); if (hFind! = INVALID_HANDLE_VALUE) {do {//читать все (реальные) файлы в текущей папке//, удалить '!' прочтите 2 другие папки по умолчанию. и .. if (! (fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) {//преобразование из широкого массива символов в узкий массив символов char ch [260]; char DefChar = ''; WideCharToMultiByte (CP_ACP, 0, fd.cFileName, -1, ch, 260, & DefChar, NULL); names.push_back (ch); }} while (:: FindNextFile (hFind, & fd)); :: FindClose (hFind); } возвращать имена;}
2
Просто то, что Хочу поделиться и поблагодарить за материал для чтения. Поиграйте с функцией, чтобы понять ее. Вам это может понравиться. e означает расширение, p — путь, а s — разделитель пути.
Если путь передается без конечного разделителя, разделитель будет добавлен к пути. Для расширения, если введена пустая строка, функция вернет любой файл, в имени которого нет расширения. Если была введена одна звездочка, будут возвращены все файлы в каталоге. Если длина e больше 0, но не является одиночным знаком *, то перед e будет добавлена точка, если e не содержал точки в нулевой позиции.
Для возвращаемого значения. Если возвращается карта нулевой длины, значит, ничего не найдено, но каталог был открыт нормально. Если индекс 999 доступен из возвращаемого значения, но размер карты равен только 1, это означает, что возникла проблема с открытием пути к каталогу.
Обратите внимание, что для повышения эффективности эту функцию можно разделить на 3 меньшие функции. Вдобавок к этому вы можете создать функцию вызывающего абонента, которая будет определять, какую функцию он будет вызывать, на основе ввода. Почему это эффективнее? Сказано, что если вы собираетесь захватить все, что является файлом, выполняя этот метод, подфункция, созданная для захвата всех файлов, просто захватит все, что является файлами, и не должна оценивать какие-либо другие ненужные условия каждый раз, когда она находит файл.
Это также относится к случаям, когда вы захватываете файлы без расширения. Специальная встроенная функция для этой цели будет оценивать погоду только в том случае, если найденный объект является файлом, а затем, если в имени файла есть точка.
Сохранение может не быть много, если вы читаете только каталоги с небольшим количеством файлов. Но если вы читаете большое количество каталогов или если в каталоге есть несколько сотен тысяч файлов, это может быть огромной экономией.
#include # include #include #include #include
#include #include используя пространство имен std; char ROOT [] = {'.'}; void listfiles (char * path) {DIR * dirp = opendir (path); Dirent * dp; while ((dp = readdir (dirp))! = NULL) {cout d_name d_reclen 1) путь = argv [1]; иначе путь = ROOT; cout
Попробуйте scandir ()
из dirent.h
man scandir ()
На основе ответов выше
# include #include #include #ifdef _WIN32 # include std :: vector files_in_directory (std :: string path) {std :: vector файлы; //проверка наличия каталога char fullpath [MAX_PATH]; GetFullPathName (путь.c_str (), MAX_PATH, полный путь, 0); std :: string fp (полный путь); if (GetFileAttributes (fp.c_str ())! = FILE_ATTRIBUTE_DIRECTORY) возвращают файлы; //получаем имена файлов WIN32_FIND_DATA findfiledata; HANDLE hFind = FindFirstFile ((LPCSTR) (fp + "\ *"). C_str (), & findfiledata); if (hFind! = INVALID_HANDLE_VALUE) {do {files.push_back (findfiledata.cFileName); } while (FindNextFile (hFind, & findfiledata)); FindClose (hFind); }//удаляем текущий и родительский каталоги files.erase (std :: find (files.begin (), files.end (), ".")); files.erase (std :: find (файлы. begin (), files.end (), "..")); //сортируем в алфавитном порядке std :: sort (files.begin (), files.end ()); return files;} # else # include std :: vector files_in_directory (каталог std :: string) {std :: vector files; //открыть каталог DIR * dir; dir = opendir (directory.c_str ()); if (dir == NULL) вернуть файлы; //получить имена файлов struct dirent * ent; while ((ent = readdir (dir))! = NULL) files.push_back (ent-> d_name); закрытый (реж); //удаляем текущий и родительский каталоги files.erase (std :: find (files.begin (), files.end (), ".")); files.erase (std :: find (files.begin (), files.end (), "..")); //сортируем в алфавитном порядке std :: sort (files.begin (), files.end ()); return files;} # endif//_WIN32
Это сработало для меня. Он записывает файл только с именами (без пути) всех файлов. Затем он читает этот текстовый файл и печатает его для вас.
void DisplayFolderContent () {system ("dir/n/b *> file_names.txt"); char ch; std :: fstream myStream ("file_names.txt", std :: fstream :: in); в то время как (myStream.get (ch)) {std :: cout
- File :: Apache Camel
- Формат URI
- Параметры URI
- Параметры пути (1 параметр):
- Параметры запроса (93 параметра):
- Операции перемещения и удаления
- Детальный контроль над опциями перемещения и предварительного перемещения
- О moveFailed
- Заголовки сообщений
- Только производитель файлов
- Только потребитель файла
- Batch Consumer
- Свойства Exchange, только потребитель файла
- Использование кодировки
- Общие проблемы с папками и именами файлов
- Выражение имени файла
- Использование файлов из папок, куда другие перетаскивают файлы напрямую
- Использование готовых файлов
- Запись готовых файлов
- Образцы
- Прочитать из каталога и записать в другой каталог с помощью отменяющее динамическое имя
- Рекурсивное чтение из каталога и запись в другой
- Использование flatten
- Чтение из каталога и операция перемещения по умолчанию
- Чтение из каталога и обработка сообщения в java
- Запись в файлы
- Запись в подкаталог с использованием Exchange.FILE_NAME
- Запись файла через временный каталог относительно конечного пункта назначения
- Использование выражения для имен файлов
- Избегание чтения одного и того же файла более одного раза (идемпотентный потребитель)
- Использование файлового репозитория идемпотентов
- Использование идемпотентного репозитория на основе JPA
- Фильтр с использованием org.apache.camel.component.file.GenericFileFilter
- Фильтрация с использованием средства сопоставления пути ANT
- Сортировка с использованием компаратора
- Сортировка с использованием sortBy
- Использование GenericFileProcessStrategy
- Использование фильтра
- Использование bridgeErrorHandler
- Ведение журнала отладки
- Автоконфигурация загрузки Spring
File :: Apache Camel
Начиная с Camel 1.0
И производитель, и потребитель поддерживаются.
Компонент File предоставляет доступ к файловым системам, позволяя обрабатывать файлы любыми другими компонентами Camel или сообщения от других компонентов для быть сохраненным на диск.
Формат URI
file:directoryName[?options ]
или
file://directoryName[?options ]
Где directoryName представляет собой базовый файловый каталог.
Вы можете добавить параметры запроса к URI в следующем формате: ? option = value & option = value &…
v>
Только каталоги
Camel поддерживает только конечные точки, настроенные с начальным каталогом . Таким образом, directoryName должен быть каталогом. Если вы хотите использовать только один файл, вы можете использовать параметр fileName , например задав fileName = thefilename
. Кроме того, начальный каталог не должен содержать динамических выражений с заполнителями $ {}
. Снова используйте параметр fileName
, чтобы указать динамическую часть имени файла..
Избегайте чтения файлов, которые в настоящее время записываются другим приложением Остерегайтесь JDK File IO API немного ограничен в определении того, записывает/копирует файл в данный момент другое приложение. И реализация может быть разной в зависимости от платформы ОС. Это может привести к тому, что Camel решит, что файл не заблокирован другим процессом, и начнет его использовать. Следовательно, вы должны сами исследовать, что подходит вашей среде. Чтобы помочь с этим, Camel предоставляет различные параметры |
Параметры URI
Компонент File поддерживает 3 параметра, которые перечислены ниже.
Имя | Описание | По умолчанию | Тип |
---|---|---|---|
bridgeErrorHandler (потребитель) |
Разрешает для соединения потребителя с обработчиком ошибок маршрутизации Camel, что означает, что любые исключения, возникшие, когда потребитель пытается получить входящие сообщения или тому подобное, теперь будут обрабатываться как сообщение и обрабатываться обработчиком ошибок маршрутизации. По умолчанию потребитель будет использовать org.apache.camel.spi.ExceptionHandler для обработки исключений, которые будут регистрироваться на уровне WARN или ERROR и игнорироваться. |
ложно |
boolean |
lazyStartProducer (производитель) |
Должен ли производитель запускаться лениво (по первому сообщению). Запустив ленивый запуск, вы можете использовать это, чтобы разрешить CamelContext и маршруты для запуска в ситуациях, когда в противном случае производитель может выйти из строя во время запуска и вызвать сбой запуска маршрута. Если отложить этот запуск на «ленивый», тогда сбой запуска можно будет обработать во время маршрутизации сообщений с помощью обработчиков ошибок маршрутизации Camel. Помните, что при обработке первого сообщения создание и запуск производителя может занять некоторое время и увеличить общее время обработки. |
false |
boolean |
autowiredEnabled (расширенный) |
Включено ли автоматическое подключение. Это используется для параметров автоматического подключения (параметр должен быть помечен как автоматически подключенный) путем поиска в реестре, чтобы найти единственный экземпляр соответствующего типа, который затем настраивается на компоненте. Это можно использовать для автоматической настройки источников данных JDBC, фабрик соединений JMS, клиентов AWS и т. Д.. |
true |
boolean |
Конечная точка файла настроена с использованием синтаксиса URI:
file: directoryName
со следующим путем и параметрами запроса:
Параметры пути (1 параметр):
Имя | Описание | По умолчанию | Напечатайте |
---|---|---|---|
Обязательно Начальный каталог |
Файл |
Параметры запроса (93 параметра):
Имя | Описание | По умолчанию | Тип |
---|---|---|---|
charset (common) |
Этот параметр используется для указания кодировки файла. Вы можете использовать это на потребителе, чтобы указать кодировки файлов, которые позволяют Camel знать кодировку, в которой он должен загружать содержимое файла в случае доступа к содержимому файла. Точно так же при записи файла вы можете использовать эту опцию, чтобы указать кодировку для записи файла. Помните, что при записи файла Camel, возможно, придется прочитать содержимое сообщения в памяти, чтобы иметь возможность преобразовать данные в настроенную кодировку, поэтому не используйте это, если у вас большие сообщения. |
String |
|
doneFileName (common) |
Producer: Если указано, то Camel запишет второй готовый файл, когда будет записан исходный файл. Готовый файл будет пустым. Эта опция настраивает, какое имя файла использовать. Либо вы можете указать фиксированное имя. Или вы можете использовать динамические заполнители. Готовый файл всегда будет записан в той же папке, что и исходный файл. Consumer: если указано, Camel будет потреблять файлы только в том случае, если существует готовый файл. Эта опция настраивает, какое имя файла использовать. Либо вы можете указать фиксированное имя. Или вы можете использовать динамические заполнители. Готовый файл всегда находится в той же папке, что и исходный файл. Только $ {file.name} и $ {file.name.next} поддерживаются в качестве динамических заполнителей. |
String |
|
fileName (общее) |
Используйте выражение, например File Language, для динамической установки имени файла. Для потребителей он используется как фильтр имени файла. Для производителей он используется для оценки имени файла для записи. Если выражение установлено, оно имеет приоритет над заголовком CamelFileName. (Примечание: сам заголовок также может быть выражением). Параметры выражения поддерживают типы String и Expression. Если выражение является строковым, оно всегда вычисляется с использованием языка файлов.. Если выражение является типом выражения, используется указанный тип выражения — это позволяет, например, использовать выражения OGNL. Что касается потребителя, вы можете использовать его для фильтрации имен файлов, так что вы можете, например, использовать сегодняшний файл, используя синтаксис языка файлов: mydata — $ {date: now: yyyyMMdd} .txt. Производители поддерживают заголовок CamelOverruleFileName, который имеет приоритет над любым существующим заголовком CamelFileName; CamelOverruleFileName — это заголовок, который используется только один раз и упрощает задачу, поскольку позволяет избежать временного хранения CamelFileName и его последующего восстановления. |
String |
|
bridgeErrorHandler (потребитель) |
Позволяет связать потребителя с обработчиком ошибок маршрутизации Camel, что означает, что любые исключения, возникшие, когда потребитель пытается забрать входящие сообщения или тому подобное, теперь будут обрабатываться как сообщение и обрабатывается обработчиком ошибок маршрутизации. По умолчанию потребитель будет использовать org.apache.camel.spi.ExceptionHandler для обработки исключений, которые будут регистрироваться на уровне WARN или ERROR и игнорироваться. |
ложно |
boolean |
delete (потребитель) |
Если true, файл будет удален после успешной обработки. |
false |
boolean |
moveFailed (потребитель) |
Устанавливает выражение ошибки перемещения на основе простого языка. Например, чтобы переместить файлы в подкаталог .error, используйте: .error. Примечание. При перемещении файлов в место сбоя Camel обработает ошибку и больше не заберет файл. |
Строка |
|
noop (потребитель) |
Если true, файл никоим образом не перемещается и не удаляется. Этот вариант подходит для данных только для чтения или для требований типа ETL. Если noop = true, Camel также установит idempotent = true, чтобы не использовать одни и те же файлы снова и снова. |
false |
boolean |
preMove (потребитель) |
Выражение (например, File Language), используемое для динамической установки имени файла при его перемещении перед обработкой. Например, чтобы переместить незавершенные файлы в каталог заказов, установите для этого значения порядок. |
String |
|
preSort (потребитель) |
Когда предварительная сортировка включена, потребитель будет сортировать имена файлов и каталогов во время опроса, которые были получены из файловой системы. Вы можете сделать это, если вам нужно работать с файлами в отсортированном порядке. Предварительная сортировка выполняется до того, как потребитель начнет фильтровать и принимать файлы для обработки Camel. Эта опция по умолчанию = false, что означает отключение. |
false |
boolean |
рекурсивный (потребитель) |
Если каталог, также будет искать файлы во всех подкаталогах. |
false |
логическое |
sendEmptyMessageWhenIdle (потребитель) |
Если потребитель опроса не опрашивал какие-либо файлы, вы можете включить эту опцию, чтобы вместо этого отправлять пустое сообщение (без тела). |
false |
boolean |
directoryMustExist (потребитель) |
Аналогично опции startDirectoryMustExist, но применяется во время опроса (после запуска потребителя). |
false |
boolean |
exceptionHandler (потребитель) |
Чтобы позволить потребителю использовать пользовательский ExceptionHandler. Обратите внимание: если опция bridgeErrorHandler включена, то эта опция не используется. По умолчанию потребитель обрабатывает исключения, которые регистрируются на уровне WARN или ERROR и игнорируются. |
ExceptionHandler |
|
exchangePattern (потребитель) |
Устанавливает шаблон обмена, когда потребитель создает обмен. Существует 3 перечисления, и значение может быть одним из: InOnly, InOut, InOptionalOut |
ExchangePattern |
|
extendedAttributes (потребитель) |
Чтобы определить, какие атрибуты файла представляют интерес. Как и posix: permissions, posix: owner, basic: lastAccessTime, он поддерживает базовые подстановочные знаки, такие как posix :, basic: lastAccessTime |
Строка |
|
inProgressRepository (потребитель) |
Подключаемый репозиторий в процессе разработки org.apache.camel.spi.IdempotentRepository. Текущий репозиторий используется для учета текущих используемых файлов в процессе. По умолчанию используется репозиторий на основе памяти. |
IdempotentRepository |
|
localWorkDirectory (потребитель) |
При потреблении локальный Рабочий каталог можно использовать для хранения содержимого удаленного файла непосредственно в локальных файлах, чтобы избежать загрузки содержимого в память. Это полезно, если вы используете очень большой удаленный файл и, таким образом, можете сэкономить память. |
String |
|
onCompletionExceptionHandler (потребитель) |
Чтобы использовать настраиваемый org.apache.camel.spi.ExceptionHandler для обработки любых исключений, возникающих во время процесса завершения файла, когда потребитель выполняет либо фиксацию, либо откат. Реализация по умолчанию будет регистрировать любое исключение на уровне WARN и игнорировать. |
ExceptionHandler |
|
pollStrategy (потребитель) |
Подключаемая стратегия org.apache.camel.PollingConsumerPollingStrategy, позволяющая предоставить вам пользовательская реализация для управления обработкой ошибок обычно возникала во время операции опроса до того, как Exchange был создан и перенаправлен в Camel. |
PollingConsumerPollStrategy |
|
probeContentType (потребитель) |
Включить ли проверку типа содержимого. Если этот параметр включен, потребитель использует Files # probeContentType (java.nio.file.Path) для определения типа содержимого файла и сохраняет его как заголовок с ключом Exchange # FILE_CONTENT_TYPE в сообщении. |
false |
boolean |
processStrategy (потребитель) |
Подключаемый файл org.apache.camel.component.file .GenericFileProcessStrategy, позволяющий реализовать свой собственный параметр readLock или аналогичный. Может также использоваться, когда перед использованием файла должны быть выполнены особые условия, например, когда существует специальный готовый файл. Если этот параметр установлен, параметр readLock не применяется. |
GenericFileProcessStrategy |
|
startDirectoryMustExist (потребитель) |
Будет ли начальный каталог должен существовать. Помните, что опция autoCreate включена по умолчанию, что означает, что начальный каталог обычно создается автоматически, если он не существует. Вы можете отключить autoCreate и включить его, чтобы обеспечить существование начального каталога. Выдает исключение, если каталог не существует. |
false |
boolean |
startDirectoryMustHave Access (потребитель) |
Имеет ли начальный каталог права доступа. Помните, что параметр startDirectoryMustExist должен иметь значение true, чтобы проверить, существует ли каталог. Выдает исключение, если у каталога нет разрешений на чтение и запись. |
false |
логическое |
appendChars (производитель) |
Используется для добавления символов (текста) после записи файлов. Это можно, например, использовать для добавления новых строк или других разделителей при записи и добавлении в существующие файлы. Чтобы указать символы новой строки (косая черта-n или косая черта-r) или табуляции (косая черта-t), используйте дополнительную косую черту, например косую черту-n. |
String |
|
fileExist (производитель) |
Что делать, если файл с таким именем уже существует. Переопределение по умолчанию заменяет существующий файл. — Добавить — добавляет содержимое в существующий файл. — Ошибка — генерирует исключение GenericFileOperationException, указывающее на то, что файл уже существует. — Игнорировать — игнорирует проблему и не отменяет существующий файл, но предполагает, что все в порядке. — Move — опция требует использования опции moveExisting для настройки. Параметр eagerDeleteTargetFile можно использовать для управления действиями, если при перемещении файла уже существует существующий файл, что в противном случае приведет к сбою операции перемещения. Параметр «Переместить» переместит все существующие файлы перед записью целевого файла. — TryRename применимо, только если используется опция tempFileName. Это позволяет попробовать переименовать файл с временного имени на фактическое имя, не выполняя никаких проверок наличия. Эта проверка может быть быстрее в некоторых файловых системах и особенно на FTP-серверах. Имеется 6 перечислений, и значение может быть одним из: Override, Append, Fail, Ignore, Move, TryRename |
Override |
GenericFileExist |
flatten (производитель ) |
Flatten используется для сглаживания пути к имени файла, чтобы удалить все ведущие пути, так что это просто имя файла. Это позволяет вам рекурсивно использовать подкаталоги, но когда вы, например, записываете файлы в другой каталог, они будут записаны в одном каталоге. Установка этого значения в true на производителе принудительно приводит к тому, что любое имя файла в заголовке CamelFileName будет удалено для любых начальных путей. |
false |
boolean |
jailStartingDirectory (производитель ) |
Используется для блокировки (ограничения) записи файлов только в начальный каталог (и под). Это включено по умолчанию, чтобы Camel не мог записывать файлы во внешние каталоги (для большей безопасности из коробки). Вы можете отключить это, чтобы разрешить запись файлов в каталоги вне начального каталога, такие как родительские или корневые папки. |
true |
boolean |
lazyStartProducer (производитель ) |
Должен ли производитель запускаться ленивым (по первому сообщению). Запустив ленивый запуск, вы можете использовать это, чтобы разрешить CamelContext и маршруты для запуска в ситуациях, когда в противном случае производитель может выйти из строя во время запуска и вызвать сбой запуска маршрута. Если отложить этот запуск на «ленивый», тогда сбой запуска можно будет обработать во время маршрутизации сообщений с помощью обработчиков ошибок маршрутизации Camel. Помните, что при обработке первого сообщения создание и запуск производителя может занять некоторое время и увеличить общее время обработки. |
false |
boolean |
moveExisting (производитель) |
Выражение (например, File Language), используемое для вычисления имени файла, которое будет использоваться при настройке fileExist = Move. Чтобы переместить файлы в подкаталог резервной копии, просто введите резервную копию. Этот параметр поддерживает только следующие токены языка файлов: file: name, file: name.ext, file: name.noext, file: onlyname, file: onlyname.noext, file: ext и file: parent. Обратите внимание, что file: parent не поддерживается компонентом FTP, поскольку компонент FTP может перемещать любые существующие файлы только в относительный каталог на основе текущего каталога в качестве основы. |
String |
|
tempFileName ( производитель) |
То же, что и параметр tempPrefix, но предлагает более детализированный контроль над именованием временного имени файла, поскольку он использует язык файлов. Местоположение для tempFilename определяется относительно конечного местоположения файла в параметре fileName, а не целевого каталога в базовом uri. Например, если параметр fileName включает префикс каталога: dir/finalFilename, тогда tempFileName относится к этому подкаталогу dir. |
String |
|
tempPrefix (производитель) |
Эта опция используется для записи файла с использованием временного имени, а затем, после завершения записи, переименования его в настоящее имя. Может использоваться для идентификации записываемых файлов, а также для предотвращения чтения текущих файлов потребителями (без использования эксклюзивных блокировок чтения). Часто используется FTP при загрузке больших файлов. |
String |
|
allowNullBody (производитель) |
Используется для указания, если при записи файла допускается пустое тело. Если задано значение true, будет создан пустой файл, если задано значение false, и при попытке отправить нулевое тело компоненту файла возникает исключение GenericFileWriteException «Невозможно записать пустое тело в файл». будет брошен. Если для параметра fileExist установлено значение «Переопределить», то файл будет усечен, а если задано добавление, файл останется без изменений. |
false |
boolean |
chmod (производитель) |
Укажите права доступа к файлу, который отправляет производитель, значение chmod должно быть от 000 до 777; Если есть первая цифра, как в 0755, мы ее проигнорируем. |
String |
|
chmodDirectory (производитель) |
Укажите права доступа к каталогам, используемые, когда производитель создает отсутствующие каталоги, значение chmod должно быть от 000 до 777; Если есть первая цифра, как в 0755, мы ее проигнорируем. |
String |
|
eagerDeleteTargetFile (производитель) |
Следует ли без промедления удалить любой существующий целевой файл. Этот параметр применяется только тогда, когда вы используете fileExists = Override и параметр tempFileName. Вы можете использовать это, чтобы отключить (установить в false) удаление целевого файла до записи временного файла.. Например, вы можете записывать большие файлы и хотите, чтобы целевой файл существовал во время записи временного файла. Это гарантирует, что целевой файл удаляется только до самого последнего момента, непосредственно перед тем, как временный файл будет переименован в целевое имя файла. Этот параметр также используется для управления тем, следует ли удалять какие-либо существующие файлы, когда включен fileExist = Move и существующий файл существует. Если этот параметр copyAndDeleteOnRenameFails false, то будет выброшено исключение, если существующий файл существовал, если он истинен, то существующий файл будет удален перед операцией перемещения. |
истина |
boolean |
forceWrites (производитель) |
Следует ли принудительно выполнять синхронизацию записи в файловую систему. Вы можете отключить это, если вам не нужен этот уровень гарантии, например, при записи в журналы/журналы аудита и т. Д .; это даст более высокую производительность. |
true |
boolean |
keepLastModified (производитель) |
Сохранит последнюю измененную метку времени из исходного файла (если есть). Будет использоваться заголовок Exchange.FILE_LAST_MODIFIED для определения отметки времени. Этот заголовок может содержать либо java.util.Date, либо длинный с меткой времени. Если метка времени существует и опция включена, она установит эту метку времени в записанном файле. Примечание: этот параметр применим только к производителю файла. Вы не можете использовать эту опцию ни с одним из производителей ftp. |
false |
boolean |
moveExistingFileStrategy (производитель) |
Стратегия (пользовательская стратегия), используемая для перемещения файла со специальным токеном именования для использования при настройке fileExist = Move. По умолчанию используется реализация, если не предоставлена настраиваемая стратегия |
FileMoveExistingStrategy |
|
autoCreate (расширенный) |
Автоматически создавать отсутствующие каталоги в пути к файлу. Для потребителя файлов это означает создание начального каталога. Для производителя файлов это означает каталог, в который должны быть записаны файлы. |
true |
логическое |
bufferSize (расширенный) |
Размер буфера в байтах, используемый для записи файлов (или в случае FTP для загрузки и выгрузки файлов). |
131072 |
int |
copyAndDeleteOnRenameFail (расширенный) |
Следует ли откатиться и выполнить копирование и удаление файла, если файл не может быть переименован напрямую. Этот параметр недоступен для компонента FTP. |
true |
boolean |
renameUsingCopy (расширенный) |
Выполнение операций переименования с использованием стратегии копирования и удаления. Это в основном используется в средах, где обычная операция переименования ненадежна (например, в разных файловых системах или сетях). Этот параметр имеет приоритет над параметром copyAndDeleteOnRenameFail, который автоматически вернется к стратегии копирования и удаления, но только после дополнительных задержек. |
false |
boolean |
синхронный (дополнительно) |
Устанавливает, следует ли строго использовать синхронную обработку |
false |
boolean |
antExclude (фильтр) |
Исключение фильтра в стиле Ant. Если используются и antInclude, и antExclude, antExclude имеет приоритет над antInclude. Можно указать несколько исключений в формате с разделителями-запятыми. |
String |
|
antFilterCaseSensitive (фильтр) |
Устанавливает чувствительность к регистру флаг на фильтре муравьев. |
true |
boolean |
antInclude (фильтр) |
Включение фильтра в стиле Ant. Множественные включения могут быть указаны в формате с разделителями-запятыми. |
String |
|
eagerMaxMessagesPerPoll (фильтр) |
Позволяет управлять является ли ограничение от maxMessagesPerPoll активным или нет. Если есть желание, то ограничение будет на время сканирования файлов. Где false будет сканировать все файлы, а затем выполнять сортировку. Установка для этого параметра значения false позволяет сначала отсортировать все файлы, а затем ограничить опрос. Имейте в виду, что это требует более высокого использования памяти, так как все детали файла находятся в памяти для выполнения сортировки. |
true |
логическое |
exclude (фильтр) |
Используется для исключения файлов, если имя файла совпадает с шаблоном регулярного выражения (при сопоставлении регистр не учитывается). Обратите внимание, если вы используете такие символы, как знак плюса и другие, вам нужно будет настроить это с помощью синтаксиса RAW (), если вы настроите его как uri конечной точки. См. Дополнительные сведения при настройке uris конечной точки |
String |
|
excludeExt (filter) |
Используется для исключения файлов, соответствующих файлу имя расширения (без учета регистра). Например, чтобы исключить файлы bak, используйте excludeExt = bak. Несколько расширений можно разделить запятыми, например, чтобы исключить файлы bak и dat, используйте excludeExt = bak, dat. |
Строка |
|
фильтр (фильтр) |
Подключаемый фильтр как класс org.apache.camel.component.file.GenericFileFilter. Будет пропускать файлы, если фильтр возвращает false в методе accept (). |
GenericFileFilter |
|
filterDirectory (filter) |
Фильтрует каталог на основе простого языка. Например, для фильтрации по текущей дате вы можете использовать простой шаблон даты, такой как $ {date: now: yyyMMdd} |
Строка |
|
filterFile (фильтр) |
Фильтрует файл на основе простого языка. Например, для фильтрации по размеру файла вы можете использовать $ {file: size} 5000 |
String |
|
идемпотент (фильтр) |
Возможность использовать шаблон Idempotent Consumer EIP, чтобы позволить Camel пропускать уже обработанные файлы. По умолчанию будет использовать LRUCache на основе памяти, который содержит 1000 записей. Если noop = true, то идемпотент также будет включен, чтобы не использовать одни и те же файлы снова и снова. |
false |
Boolean |
idempotentKey (фильтр) |
Чтобы использовать настраиваемый идемпотентный ключ. По умолчанию используется абсолютный путь к файлу. Вы можете использовать File Language, например, чтобы использовать имя файла и размер файла, вы можете: idempotentKey = $ {file: name} — $ {file: size} |
String |
|
idempotentRepository (фильтр) |
Подключаемый репозиторий org.apache.camel.spi.IdempotentRepository, который по умолчанию использует MemoryMessageIdRepository, если не указан и идемпотент равен true. /p> |
IdempotentRepository |
|
include (filter) |
Используется для включения файлов, если имя файла соответствует шаблону регулярного выражения (соответствие без учета регистра). Обратите внимание, если вы используете такие символы, как знак плюса и другие, вам нужно будет настроить это с помощью синтаксиса RAW (), если вы настроите его как uri конечной точки. См. Дополнительные сведения о настройке uris конечной точки |
String |
|
includeExt (фильтр) |
Используется для включения файлов, соответствующих файлу имя расширения (без учета регистра). Например, чтобы включить файлы txt, используйте includeExt = txt. Несколько расширений можно разделить запятыми, например, чтобы включить файлы txt и xml, используйте includeExt = txt, xml |
Строка |
|
maxDepth (фильтр) |
Максимальная глубина прохождения при рекурсивной обработке каталога. |
2147483647 |
int |
maxMessagesPerPoll (фильтр) |
Чтобы определить максимальное количество сообщений, собираемых за один опрос. По умолчанию максимум не установлен. Может использоваться для установки лимита, например, 1000, чтобы при запуске сервера не было тысяч файлов. Установите значение 0 или отрицательное, чтобы отключить его. Примечание. Если эта опция используется, то компоненты File и FTP будут ограничены перед любой сортировкой. Например, если у вас есть 100000 файлов и вы используете maxMessagesPerPoll = 500, то будут выбраны и отсортированы только первые 500 файлов. Вы можете использовать параметр eagerMaxMessagesPerPoll и установить для него значение false, чтобы разрешить сначала сканировать все файлы, а затем сортировать их. |
int |
|
minDepth (фильтр) |
Минимальная глубина начала обработки при рекурсивной обработке каталога. Использование minDepth = 1 означает базовый каталог. Использование minDepth = 2 означает первый подкаталог. |
int |
|
перемещение (фильтр) |
Выражение (например, Simple Language) используется для динамической установки имени файла при его перемещении после обработки. Чтобы переместить файлы в подкаталог .done, просто введите .done. |
String |
|
exclusiveReadLockStrategy (блокировка) |
Подключаемый блокировка чтения как реализация org.apache.camel.component.file.GenericFileExclusiveReadLockStrategy. |
GenericFileExclusiveReadLockStrategy |
|
readLock (блокировка) |
Используется потребителем для опроса файлов только в том случае, если у него есть исключительная блокировка чтения для файла (т.е. файл не обрабатывается или не записывается). Camel будет ждать, пока не будет предоставлена блокировка файла. Этот параметр обеспечивает стратегии сборки: — none — Блокировка чтения не используется — markerFile — Camel создает файл маркера (fileName.camelLock), а затем удерживает на нем блокировку. Этот параметр недоступен для компонента FTP — изменено — Изменено использует метку длины/изменения файла, чтобы определить, копируется ли файл в данный момент или нет. По крайней мере, для определения этого потребуется 1 секунда, поэтому этот параметр не может потреблять файлы так же быстро, как другие, но может быть более надежным, поскольку API ввода-вывода JDK не всегда может определить, используется ли файл в настоящее время другим процессом. Параметр readLockCheckInterval может использоваться для установки частоты проверки. — fileLock — для использования java.nio.channels.FileLock. Этот параметр недоступен для ОС Windows и компонента FTP. Этого подхода следует избегать при доступе к удаленной файловой системе через монтирование/общий ресурс, если эта файловая система не поддерживает распределенные блокировки файлов. — rename — rename используется для использования попытки переименовать файл в качестве теста, если мы можем получить эксклюзивную блокировку чтения. — idempotent — (только для файлового компонента) идемпотент предназначен для использования idempotentRepository в качестве блокировки чтения. Это позволяет использовать блокировки чтения, которые поддерживают кластеризацию, если реализация идемпотентного репозитория поддерживает это. — idempotent-changed — (только для файлового компонента) idempotent-changed предназначен для использования idempotentRepository и изменен как комбинированная блокировка чтения. Это позволяет использовать блокировки чтения, которые поддерживают кластеризацию, если реализация идемпотентного репозитория поддерживает это. — idempotent-rename — (только для файлового компонента) idempotent-rename используется для использования idempotentRepository и переименования в качестве комбинированной блокировки чтения. Это позволяет использовать блокировки чтения, которые поддерживают кластеризацию, если реализация идемпотентного репозитория поддерживает это. Примечание: различные блокировки чтения не все подходят для работы в кластерном режиме, когда одновременные потребители на разных узлах конкурируют за одни и те же файлы в общей файловой системе . В markerFile используется операция, близкая к атомарной, для создания пустого файла маркера, но его работа в кластере не гарантируется. FileLock может работать лучше, но тогда файловая система должна поддерживать распределенные блокировки файлов и так далее. Использование идемпотентной блокировки чтения может поддерживать кластеризацию, если идемпотентный репозиторий поддерживает кластеризацию, например Hazelcast Component или Infinispan. Всего имеется 8 перечислений, и значение может быть одним из: none, markerFile, fileLock, rename, changed, idempotent, idempotent-changed, idempotent-rename |
none |
String |
readLockCheckInterval (блокировка) |
Интервал в миллисекундах для блокировки чтения, если поддерживается блокировкой чтения. Этот интервал используется для сна между попытками получить блокировку чтения. Например, при использовании измененной блокировки чтения вы можете установить более высокий интервал, чтобы обеспечить медленную запись. По умолчанию 1 сек. может быть слишком быстрым, если производитель очень медленно записывает файл. Примечание. Для FTP значение readLockCheckInterval по умолчанию равно 5000. Значение readLockTimeout должно быть выше, чем readLockCheckInterval, но практическое правило должно иметь тайм-аут, который по крайней мере в 2 или более раз превышает readLockCheckInterval. Это необходимо для обеспечения того, чтобы процессу блокировки чтения было предоставлено время ожидания, чтобы попытаться захватить блокировку до того, как истечет время ожидания. |
1000 |
long |
readLockDeleteOrphanLockFiles (lock) |
Должна ли блокировка чтения с файлами маркеров при запуске удалять любые потерянные файлы блокировки чтения, которые могли остаться в файловой системе , если Camel не был правильно завершен (например, сбой JVM). Если установить для этого параметра значение false, любой потерянный файл блокировки приведет к тому, что Camel не попытается получить этот файл, это также может быть связано с тем, что другой узел одновременно читает файлы из того же общего каталога. |
true |
boolean |
readLockIdempotentReleaseAsync (lock) |
Должна ли задача отложенного выпуска быть синхронной или асинхронной. Дополнительные сведения см. В параметре readLockIdempotentReleaseDelay.. |
false |
boolean |
readLockIdempotentReleaseAsync PoolSize (блокировка) |
Число потоков в запланированном пуле потоков при использовании задач асинхронного выпуска. Использование по умолчанию 1 основных потоков должно быть достаточным почти во всех случаях использования, установите более высокое значение только в том случае, если обновление идемпотентного репозитория происходит медленно или есть много файлов для обработки. Этот параметр не используется, если вы используете общий пул потоков, настроив параметр readLockIdempotentReleaseExecutorService. Дополнительные сведения см. В параметре readLockIdempotentReleaseDelay. |
int |
|
readLockIdempotentReleaseDelay (lock) |
Отложить ли задачу выпуска в течение миллисекунд. Это можно использовать, чтобы отложить задачи выпуска, чтобы расширить окно, когда файл рассматривается как заблокированный для чтения, в сценарии активного/активного кластера с общим идемпотентным репозиторием, чтобы другие узлы не могли потенциально сканировать и получать тот же файл из-за к условиям гонки. Расширение временного окна выпуска задач помогает предотвратить такие ситуации. Задержка примечания требуется только в том случае, если вы настроили для readLockRemoveOnCommit значение true. |
int |
|
readLockIdempotentRelease ExecutorService (блокировка) |
Чтобы использовать настраиваемый и общий пул потоков для задач асинхронного выпуска. Дополнительные сведения см. В параметре readLockIdempotentReleaseDelay. |
ScheduledExecutorService |
|
readLockLoggingLevel (lock) |
Уровень ведения журнала, используемый при чтении блокировка не может быть получена. По умолчанию DEBUG регистрируется. Вы можете изменить этот уровень, например, на ВЫКЛ, чтобы не вести журнал. Эта опция применима только для readLock типов: измененный, fileLock, идемпотент, идемпотент-измененный, идемпотент-переименование, переименование. Всего существует 6 перечислений, и значение может быть одним из: TRACE, DEBUG, INFO, WARN, ERROR, OFF |
DEBUG |
LoggingLevel |
readLockMarkerFile (блокировка ) |
Следует ли использовать файл маркера с измененным, переименованным или эксклюзивным типом блокировки чтения. По умолчанию файл маркера также используется для защиты от других процессов, собирающих те же файлы. Это поведение можно отключить, установив для этого параметра значение false. Например, если вы не хотите записывать файлы маркеров в файловые системы приложением Camel. |
true |
логическое |
readLockMinAge (блокировка) |
Эта опция применяется только для readLock = changed. Он позволяет указать минимальный возраст файла, который должен быть перед попыткой получить блокировку чтения.. Например, используйте readLockMinAge = 300s, чтобы требовать, чтобы файл был старше 5 минут. Это может ускорить измененную блокировку чтения, поскольку она будет пытаться получить только файлы, возраст которых не меньше заданного. |
0 |
long |
readLockMinLength (блокировка ) |
Эта опция применяется только для readLock = changed. Это позволяет вам настроить минимальную длину файла. По умолчанию Camel ожидает, что файл будет содержать данные, и поэтому значение по умолчанию равно 1. Вы можете установить для этого параметра значение ноль, чтобы разрешить использование файлов нулевой длины. |
1 |
long |
readLockRemoveOnCommit (блокировка) |
Этот параметр применяется только для readLock = idempotent. Он позволяет указать, следует ли удалять запись имени файла из репозитория идемпотентов, когда обработка файла завершена успешно и происходит фиксация. По умолчанию файл не удаляется, что гарантирует отсутствие каких-либо условий гонки, поэтому другой активный узел может попытаться захватить файл. Вместо этого идемпотентный репозиторий может поддерживать стратегии выселения, которые вы можете настроить для удаления записи имени файла через X минут — это гарантирует отсутствие проблем с условиями гонки. Дополнительные сведения см. В параметре readLockIdempotentReleaseDelay. |
false |
boolean |
readLockRemoveOnRollback (блокировка) |
Эта опция применяется только для readLock = idempotent. Он позволяет указать, следует ли удалять запись имени файла из репозитория идемпотентов, если обработка файла завершилась неудачно и произойдет откат. Если этот параметр имеет значение false, то запись имени файла подтверждается (как если бы файл был зафиксирован). |
true |
boolean |
readLockTimeout (блокировка ) |
Дополнительный тайм-аут в миллисекундах для блокировки чтения, если поддерживается блокировкой чтения. Если не удалось предоставить блокировку чтения и сработал тайм-аут, Camel пропустит файл. При следующем опросе Camel снова попробует файл, и на этот раз, возможно, будет предоставлена блокировка чтения. Используйте значение 0 или ниже, чтобы указать навсегда. В настоящее время fileLock изменен и переименован поддерживает тайм-аут. Примечание. Для FTP значение readLockTimeout по умолчанию составляет 20000 вместо 10000. Значение readLockTimeout должно быть выше readLockCheckInterval, но практическое правило должно иметь тайм-аут, который по крайней мере в 2 или более раз превышает readLockCheckInterval. Это необходимо для обеспечения того, чтобы процессу блокировки чтения было предоставлено время ожидания, чтобы попытаться захватить блокировку до того, как истечет время ожидания. |
10000 |
long |
backoffErrorThreshold (scheduler) |
Количество последующих опросов об ошибках (неудачных из-за некоторой ошибки), которые должны произойти до того, как backoffMultipler должен сработать. |
int |
|
backoffIdleThreshold (планировщик) |
Количество последующих опросов в режиме ожидания, которые должны произойти до того, как backoffMultipler должен запустить -в. |
int |
|
backoffMultiplier (планировщик) |
Разрешить запланированному опросу потребителя отсрочки, если был количество последующих простоев/ошибок подряд. Множитель — это количество опросов, которые будут пропущены до того, как следующая фактическая попытка будет повторена. Когда используется этот параметр, необходимо также настроить backoffIdleThreshold и/или backoffErrorThreshold. |
int |
|
delay (планировщик) |
Миллисекунды до следующего опроса. |
500 |
long |
жадный (планировщик) |
Если включен жадный режим, то ScheduledPollConsumer сразу же снова запустится, если предыдущий прогон опросил 1 или более сообщений. |
false |
boolean |
initialDelay (scheduler) |
Миллисекунды до начала первого опроса. |
1000 |
long |
repeatCount (планировщик) |
Задает максимальный предел количества возгораний. Поэтому, если вы установите его в 1, планировщик сработает только один раз. Если вы установите его на 5, он сработает только пять раз. Нулевое или отрицательное значение означает вечное срабатывание. |
0 |
long |
runLoggingLevel (планировщик) |
При опросе потребитель записывает начало/завершение строки журнала. Эта опция позволяет вам настроить для этого уровень ведения журнала. Всего имеется 6 перечислений, и значение может быть одним из: TRACE, DEBUG, INFO, WARN, ERROR, OFF |
TRACE |
LoggingLevel |
scheduleExecutorService (планировщик ) |
Позволяет настроить пользовательский/общий пул потоков для использования потребителем. По умолчанию у каждого потребителя есть собственный пул однопоточных потоков. |
ScheduledExecutorService |
|
планировщик (планировщик) |
Использовать планировщик cron из компонентов camel-spring или camel-quartz. Используйте пружину значений или кварц для встроенного планировщика |
none |
Object |
schedulerProperties (планировщик) |
Для настройки дополнительных свойств при использовании настраиваемого планировщика или любого планировщика на основе Quartz, Spring. |
Карта |
|
startScheduler (планировщик) |
Следует ли запускать планировщик автоматически. |
true |
boolean |
timeUnit (планировщик) |
Единица времени для параметров initialDelay и delay. Всего имеется 7 перечислений, и значение может быть одним из: НАНОСЕКУНД, МИКРОСЕКУНД, МИЛЛИСЕКУНД, СЕКУНД, МИНУТ, ЧАСОВ, ДНЕЙ |
МИЛЛИСЕКУНД |
TimeUnit |
useFixedDelay (планировщик) |
Управляет использованием фиксированной задержки или фиксированной скорости. Подробнее см. ScheduledExecutorService в JDK. |
true |
boolean |
в случайном порядке (сортировка) |
Перемешать список файлов (отсортировать в случайном порядке) |
false |
логическое |
sortBy (сортировка) |
Встроенная сортировка с использованием языка файлов. Поддерживает вложенную сортировку, поэтому вы можете сортировать по имени файла и в качестве второй группы сортировать по дате изменения. |
Строка |
|
sorter (sort) |
Подключаемый сортировщик как класс java.util.Comparator. |
Comparator |
Поведение по умолчанию для производителя файлов По умолчанию он заменяет любой существующий файл, если он существует с тем же именем. |
Операции перемещения и удаления
Любое перемещение или операции удаления выполняются после завершения (после команды) маршрутизации; поэтому во время обработки Exchange
файл все еще находится в папке входящих.
Давайте проиллюстрируем это на примере:
from ("file://inbox? move = .done") .to ("bean: handleOrder ");
Когда файл помещается в папку inbox
, файл потребитель замечает это и создает новый FileExchange
, который перенаправляется на bean-компонент handleOrder
. Затем компонент обрабатывает объект File
. На данный момент файл все еще находится в папке inbox
. После завершения bean-компонента и, следовательно, завершения маршрута, потребитель файла выполнит операцию перемещения и переместит файл в подпапку .done
..
Параметры move и preMove рассматриваются как имя каталога (хотя если вы используете такое выражение, как File Language или Simple, то результатом оценки выражения будет имя файла, которое будет использоваться — например, если вы установите
move = ../backup/copy-of - $ {file: name}
то, используя File Language, который мы используем, возвращает имя файла, которое будет использоваться), которое может быть относительным или абсолютным. Если относительный, каталог создается как подпапка внутри папки, в которой был использован файл.
По умолчанию Camel перемещает использованные файлы в папку Подпапка .camel
относительно каталога, в котором был использован файл.
Если вы хотите удалить файл после обработки, маршрут должен быть:
from ("file://inobox? delete = true"). to ("bean: handleOrder");
Мы ввели предварительное перемещение операция по перемещению файлов до их обработки. Это позволяет вам отмечать, какие файлы были просканированы при перемещении в эту подпапку перед обработкой.
from ("file://inbox? preMove = inprogress") .to ("bean: handleOrder");
Вы можете комбинировать pre и обычный ход:
из ( "file://inbox? preMove = inprogress & move = .done") .to ("bean: handleOrder");
Таким образом, в этой ситуации файл находится в папке inprogress
при обработке, а после обработки он перемещается в папку .done
.
Детальный контроль над опциями перемещения и предварительного перемещения
Параметры move и preMove основаны на выражениях, поэтому у нас есть все возможности языка файлов для расширенной настройки каталога и шаблона имени.
На самом деле верблюд будет в окончательно преобразовать имя каталога, которое вы вводите, в выражение языка файлов. Поэтому, когда мы вводим move = .done
, Camel преобразует это в: $ {file: parent}/. Done/$ {file: onlyname}
. Это делается только в том случае, если Camel обнаруживает, что вы сами не указали $ {} в значении опции. Поэтому, когда вы вводите $ {} Camel, он не преобразует его, и, таким образом, у вас есть все возможности.
Итак, если мы хотим переместить файл в резервную папку с сегодняшней датой в качестве шаблона, мы можем сделать:
move=backup/${date:now:yyyyMMdd}/${file:name}
О moveFailed
moveFailed Параметр
позволяет вам перемещать файлы, которые не могут быть успешно обработаны, в другое место, например в папку ошибок по вашему выбору. Например, чтобы переместить файлы в папку ошибок с меткой времени, вы можете использовать moveFailed =/error/$ {
}. file: name.noext
} - $ {date: now: ггггММддЧЧммссССС}. $ {`` file: ext
Дополнительные примеры см. на языке файлов
Заголовки сообщений
Этот компонент поддерживает следующие заголовки:
Только производитель файлов
Заголовок | Описание |
---|---|
|
Задает имя файла для записи (относительно каталога конечной точки ). Это имя может быть |
|
Фактический абсолютный путь к файлу (путь + имя) для записанного выходного файла. Этот заголовок установлен Camel, и его цель — предоставить конечным пользователям имя записанного файла. |
|
Используется для отмены заголовка |
Только потребитель файла
Заголовок | Описание |
---|---|
|
Имя потребляемого файла как относительный путь к файлу со смещением от начальный каталог, настроенный на конечной точке. |
|
Только имя файла (имя без начальных путей). |
|
Параметр |
|
Абсолютный путь к файлу. Для относительных файлов этот путь содержит относительный путь. |
|
Путь к файлу. Для относительных файлов это начальный каталог + относительное имя файла. Для абсолютных файлов это абсолютный путь. |
|
Относительный путь. |
|
Родительский путь. |
|
Значение |
|
Значение |
Batch Consumer
Этот компонент реализует Batch Consumer.
Свойства Exchange, только потребитель файла
Поскольку потребитель файла реализует BatchConsumer
, он поддерживает пакетирование файлов, которые он опрашивает. Под пакетной обработкой мы подразумеваем, что Camel добавит в Exchange следующие дополнительные свойства, чтобы вы знали количество опрошенных файлов, текущий индекс и то, завершен ли пакет уже.
Свойство | Описание |
---|---|
|
Общее количество файлов, опрошенных в этом пакете. |
|
Текущий индекс пакета. Начинается с 0. |
|
Логическое значение |
Это позволяет вам, например, узнать, сколько файлов существует в этом пакете, и, например, позволить Aggregator2 агрегировать это количество файлов.
Использование кодировки
Начиная с Camel 2.9.3
Параметр charset позволяет настраивать кодирование файлов на конечных точках потребителя и производителя. Например, если вы читаете файлы utf-8 и хотите преобразовать файлы в iso-8859-1, вы можете сделать:
from ("file: inbox? charset = utf-8"). to ("file: outbox? charset = iso-8859-1")
Вы также можете использовать convertBodyTo
в маршруте. В приведенном ниже примере у нас все еще есть входные файлы в формате utf-8, но мы хотим преобразовать содержимое файла в массив байтов в формате iso-8859-1. А затем позвольте bean-компоненту обработать данные. Перед записью содержимого в папку исходящих сообщений с использованием текущей кодировки.
from ("file: inbox? Charset = utf-8 ") .convertBodyTo (byte []. class," iso-8859-1 ") .to (" bean: myBean ") .to (" file: outbox ");
Если вы опустите кодировку в конечной точке потребителя, то Camel не знает кодировку файла и по умолчанию будет использовать «UTF-8». Однако вы можете настроить системное свойство JVM для переопределения и использования другой кодировки по умолчанию с помощью ключа org.apache.camel.default.charset
.
В приведенном ниже примере это может быть проблемой, если файлы не в кодировке UTF-8, которая будет кодировкой по умолчанию для чтения файлов.
В этом примере при записи файлов содержимое уже преобразовано в массив байтов, и поэтому содержимое будет записано напрямую как есть (без дополнительных кодировок).
from ("file: inbox") .convertBodyTo (byte []. class, "iso-8859-1") .to ("bean: myBean") .to ("file: outbox");
Вы также можете переопределить и контролировать динамическую кодировку при записи файлов, установив свойство на обмене с помощью ключа Exchange.CHARSET_NAME
. Например, в приведенном ниже маршруте мы устанавливаем свойство со значением из заголовка сообщения.
from ("file : inbox ") .convertBodyTo (byte []. class," iso-8859-1 ") .to (" bean: myBean ") .setProperty (Exchange.CHARSET_NAME, header (" someCharsetHeader ")) .to (" файл: outbox ");
Мы предлагаем сделать все проще, поэтому, если вы выбираете файлы с той же кодировкой и хотите напишите файлы в определенной кодировке, а затем используйте параметр charset
на конечных точках.
Обратите внимание, что если вы явно настроили параметр charset
на конечной точке, то эта конфигурация используется независимо от свойства Exchange.CHARSET_NAME
.
Если у вас есть проблемы, вы можете включить ведение журнала DEBUG в org.apache.camel.component.file
, и Camel журналы, когда он читает/записывает файл с использованием определенной кодировки.
Например, маршрут ниже будет записывать е следующее:
from ("file: inbox? charset = utf-8"). to ("file: outbox? charset = iso-8859-1")
И журналы:
DEBUG GenericFileConverter - чтение файла/Users/davsclaus/workspace/camel/camel-core/target/charset/input/input. txt с кодировкой utf-8DEBUG FileOperations - Использование Reader для записи файла: target/charset/output.txt с кодировкой: iso-8859-1
Общие проблемы с папками и именами файлов
Когда Camel создает файлы (записывает файлы), возникает несколько ошибок, влияющих на то, как установить имя файла по вашему выбору. По умолчанию Camel будет использовать идентификатор сообщения в качестве имени файла, а поскольку идентификатор сообщения обычно является уникальным сгенерированным идентификатором, вы получите такие имена файлов, как: ID-MACHINENAME-2443-1211718892437-1-0
. Если такое имя файла нежелательно, вы должны указать имя файла в заголовке сообщения CamelFileName
. Также можно использовать константу Exchange.FILE_NAME
.
Приведенный ниже пример кода создает файлы, используя идентификатор сообщения как имя файла:
from ("direct: report"). to ("file: target/reports") ;
Чтобы использовать report.txt
в качестве имени файла, вы должны:
from ("direct: report"). setHeader (Exchange.FILE_NAME, constant ("report.txt") ) .to ("file: target/reports");
-
то же, что и выше, но с
CamelFileName
:
from ("direct: report"). setHeader ("CamelFileName", constant ("report.txt")). to ("file: target/reports");
И синтаксис, в котором мы устанавливаем имя файла на конечной точке с помощью параметра URI fileName .
from ("direct: report"). to ("file: target/r eports/? fileName = report.txt ");
Выражение имени файла
Имя файла можно задать либо с помощью параметра expression , либо как строковое выражение языка файлов в Заголовок CamelFileName
. См. Синтаксис и примеры на языке файлов.
Использование файлов из папок, куда другие перетаскивают файлы напрямую
Будьте осторожны, если вы потребляете файлы из папки, в которую другие приложения записывают файлы напрямую. Взгляните на различные параметры readLock, чтобы увидеть, что подходит для ваших вариантов использования. Однако лучший подход — записать в другую папку и после записи переместить файл в папку для размещения.. Однако, если вы записываете файлы непосредственно в папку для перетаскивания, то измененная опция может лучше определить, записывается/копируется ли файл в данный момент, поскольку он использует алгоритм изменения файла, чтобы увидеть, изменяется ли размер/модификация файла с течением времени. Другие параметры readLock полагаются на Java File API, который, к сожалению, не всегда хорошо обнаруживает это. Вы также можете посмотреть параметр doneFileName, который использует файл-маркер (файл done), чтобы сигнализировать, когда файл готов и готов к использованию.
Использование готовых файлов
Начиная с Camel 2.6
См. также раздел Запись готовых файлов ниже.
Если вы хотите только для использования файлов, когда готовый файл существует, вы можете использовать параметр doneFileName
в конечной точке.
from ("file: bar? doneFileName = done");
Будет использоваться только файлы из папки панели, если готовый файл существует в том же каталоге, что и целевые файлы. Camel автоматически удалит готовый файл , когда закончит использование файлов. Camel не удаляет автоматически файл done , если настроен noop = true
.
Однако чаще всего используется один файл done для каждого целевого файла. Это означает, что существует соотношение 1: 1. Для этого вы должны использовать динамические заполнители в параметре doneFileName
. В настоящее время Camel поддерживает следующие два динамических токена: file: name
и file: name.noext
, которые должны быть заключены в $ {}. Потребитель поддерживает только статическую часть имени файла done как префикс или суффикс (но не оба сразу).
from ("file: bar? doneFileName = $ {file: name} .done");
В этом примере будут опрашиваться только файлы, если существует готовый файл с именем имя файла .done. Например
-
hello.txt
— это файл, который нужно использовать -
hello.txt.done
— это связанный файл готовой
Вы также можете использовать префикс для готового файла, например:
from("file:bar?doneFileName=ready-${file:name}");
-
hello.txt
— это файл, который нужно использовать -
ready-hello.txt
— это связанный файл готовой
Запись готовых файлов
Начиная с Camel 2.6
После того, как вы написали файл, вы можете захотеть написать дополнительный done файл как своего рода маркер, чтобы указать другим, что файл закончено и было написано. Для этого вы можете использовать параметр doneFileName
в конечной точке производителя файла.
.to ("file: bar? doneFileName = done");
Просто создаст файл с именем done
в том же каталоге, что и целевой файл.
Однако более распространено иметь один готовый файл для каждого целевого файла. Это означает, что существует соотношение 1: 1. Для этого вы должны использовать динамические заполнители в параметре doneFileName
. В настоящее время Camel поддерживает следующие два динамических токена: file: name
и file: name.noext
, которые должны быть заключены в $ {}.
.to ("file: bar? doneFileName = done - $ {file: name}");
Например, создаст файл с именем done-foo.txt
, если целевой файл был foo.txt
в том же каталоге, что и целевой файл.
.to ("file : bar? doneFileName = $ {file: name} .done ");
Например, создаст файл с именем foo.txt.done
, если целевой файл находился foo.txt
в том же каталоге, что и целевой файл.
.to("file:bar?doneFileName=${file:name.noext}.done");
Например, создаст файл с именем foo.done
, если целевой файл был foo.txt
в том же каталоге, что и целевой файл .
Образцы
# == = Чтение из каталога и запись в другой каталог
from ("file://inputdir/? Delete = true ") .to (" file://outputdir ")
Прочитать из каталога и записать в другой каталог с помощью отменяющее динамическое имя
from ("file://inputdir/? delete = true") .to ("file://outputdir? overruleFile = copy-of - $ {file: name} ")
Прослушать каталог и создать сообщение для каждого файла, помещенного туда. Скопируйте содержимое в outputdir
и удалите файл в inputdir
.
Рекурсивное чтение из каталога и запись в другой
from ("file://inputdir/? recursive = true & delete = true ") .to (" file://outputdir ")
Прослушайте каталог и создайте сообщение для каждый файл закинул туда. Скопируйте содержимое в outputdir
и удалите файл в inputdir
. Будет рекурсивно сканировать подкаталоги. Разместит файлы в той же структуре каталогов в outputdir
, что и inputdir
, включая все подкаталоги.
inputdir/foo.txtinputdir/sub/bar. txt
Результатом будет следующий формат вывода:
outputdir/foo.txtoutputdir/sub/bar.txt
Использование flatten
Если вы хотите хранить файлы в каталоге outputdir в том же каталоге, игнорируя макет исходного каталога (например, чтобы выровнять путь), вы просто добавляете параметр flatten = true
на стороне производителя файла:
from ("file://inputdir/? recursive = true & delete = true") .to ("file://outputdir? flatten = true")
Результатом будет следующий формат вывода:
outputdir/foo.txtoutputdir/bar.txt
Чтение из каталога и операция перемещения по умолчанию
Camel по умолчанию перемещает любой обработанный файл в .camel
подкаталог в каталоге, из которого был получен файл.
from ("file://inputdir/ ? recursive = true & delete = true ") .to (" file://outputdir ")
Влияет на макет следующим образом :
inputdir/foo.txtinputdir/ sub/bar.txt
inputdir/.camel/foo.txtinputdir/sub/.camel/bar.txtoutputdir/foo.txtoutputdir/sub/bar.txt
Чтение из каталога и обработка сообщения в java
from ("file://inputdir/") .process (new Processor () {public void process (Exchange exchange) throws Exception {body object = exchange.getIn (). getBody (); //выполняем некоторую бизнес-логику с телом ввода}});
Тело будет File
, указывающий на файл, который только что был помещен в каталог inputdir
.
Запись в файлы
Camel, конечно, также может записывать файлы, то есть создавать файлы. В приведенном ниже примере мы получаем несколько отчетов об очереди SEDA, которые мы обрабатываем, прежде чем они будут записаны в каталог.
Запись в подкаталог с использованием Exchange.FILE_NAME
Используя один маршрут, можно записать файл в любое количество подкаталогов. Если у вас настроен маршрут как таковой:
У вас может быть myBean
задайте для заголовка Exchange.FILE_NAME
такие значения, как:
Обмен. FILE_NAME = hello.txt =>/rootDirectory/hello.txtExchange.FILE_NAME = foo/bye.txt =>/rootDirectory/foo/bye.txt
Это позволяет использовать один маршрут для записи файлов в несколько пунктов назначения.
Запись файла через временный каталог относительно конечного пункта назначения
Иногда вам нужно временно записать файлы в какой-либо каталог относительно каталога назначения. Такая ситуация обычно возникает, когда какой-то внешний процесс с ограниченными возможностями фильтрации читает из каталога, в который вы пишете. В приведенном ниже примере файлы будут записаны в каталог /var/myapp/filesInProgress
, а после завершения передачи данных они будут атомарно перемещены в каталог/var/myapp/finalDirectory.
from ("direct: start"). to ("file:///var/myapp/finalDirectory? tempPrefix =/../filesInProgress/");
Использование выражения для имен файлов
В этом примере мы хотим переместить использованные файлы в папку резервного копирования, используя сегодняшняя дата как имя подпапки:
from ("file://inbox? move = backup/ $ {date: now: yyyyMMdd}/$ {file: name} "). to (" ... ");
Дополнительные примеры см. в разделе «Язык файлов».
Избегание чтения одного и того же файла более одного раза (идемпотентный потребитель)
Camel поддерживает Idempotent Consumer непосредственно в компоненте, поэтому он будет пропускать уже обработанные файлы. Эту функцию можно включить, установив параметр idempotent = true
.
from ("file://inbox? idempotent = true") .to ("...");
Camel использует абсолютное имя файла в качестве идемпотентного ключа для обнаружения повторяющихся файлов. Вы можете настроить этот ключ, используя выражение в параметре idempotentKey. Например, чтобы использовать в качестве ключа и имя, и размер файла
По умолчанию Camel использует хранилище в памяти для отслеживания потребляемых файлов, он использует кэш, который использовался недавно, до 1000 записей. Вы можете подключить свою собственную реализацию этого хранилища, используя параметр idempotentRepository
, используя знак #
в значении, чтобы указать, что это ссылка на компонент в реестре. с указанным id
.
Camel будет регистрироваться на уровне DEBUG
, если он пропускает файл, потому что он уже использовался раньше:
DEBUG FileConsumer идемпотентен, и файл уже использовался ранее. Этот файл будет пропущен: target idempotent report.txt
Использование файлового репозитория идемпотентов
В этом разделе мы будем использовать файловый репозиторий идемпотентов org.apache.camel.processor.idempotent.FileIdempotentRepository
вместо репозитория в памяти, который используется как по умолчанию.
Этот репозиторий использует кеш 1-го уровня, чтобы избежать чтения файлового репозитория. Он будет использовать файловый репозиторий только для хранения содержимого кеш-памяти 1-го уровня. Таким образом, репозиторий может пережить перезагрузки сервера. Он будет загружать t При запуске содержимое файла помещается в кэш 1-го уровня. Структура файла очень проста, поскольку ключ хранится в отдельных строках файла. По умолчанию размер хранилища файлов составляет 1 МБ. Когда файл становится больше, Camel усекает хранилище файлов, перестраивая содержимое, сбрасывая кеш 1-го уровня в новый пустой файл.
Мы настраиваем наш репозиторий, используя Spring XML создает наш репозиторий идемпотентных файлов и определяет нашего потребителя файлов для использования нашего репозитория с помощью idempotentRepository
, используя знак #
для указания поиска в реестре:
Использование идемпотентного репозитория на основе JPA
В этом разделе мы будет использовать идемпотентный репозиторий на основе JPA вместо хранилища в памяти, которое используется по умолчанию.
Сначала нам понадобится блок сохранения в META-INF/persistence.xml
, где нам нужно использовать класс org.apache.camel.processor.idempotent.jpa.MessageProcessed
в качестве модели.
org.apache.camel.processor. идемпо tent.jpa.MessageProcessed
Затем мы можем создать наш репозиторий идемпотентов JPA также в файле XML Spring:
И да, тогда нам просто нужно сослаться на Компонент jpaStore в конечной точке потребителя файла с использованием idempotentRepository
с использованием параметра синтаксиса #
:
Фильтр с использованием org.apache.camel.component.file.GenericFileFilter
Camel поддерживает подключаемые стратегии фильтрации. Затем вы можете настроить конечную точку с таким фильтром, чтобы пропустить определенные обрабатываемые файлы.
В этом примере мы создали собственный фильтр, который пропускает файлы, начинающиеся с skip
в имени файла:
А затем мы можем настроить наш маршрут с помощью фильтра атрибут для ссылки на наш фильтр (с использованием нотации #
), который мы определили в файле XML Spring:
Фильтрация с использованием средства сопоставления пути ANT
Средство сопоставления пути ANT основано на AntPathMatcher.
Пути к файлам соответствуют следующим правилам:
-
?
соответствует одному символу -
*
соответствует нулю или более символов -
**
соответствует нулю или нескольким каталогам в пути
antInclude
и Параметры antExclude
позволяют легко указать стиль ANT include/exclude без необходимости определять фильтр. См. Параметры URI выше для получения дополнительной информации..
Пример ниже демонстрирует, как его использовать:
Сортировка с использованием компаратора
Camel поддерживает подключаемые стратегии сортировки. Эта стратегия заключается в использовании сборки в java.util.Comparator
в Java. Затем вы можете настроить конечную точку с таким компаратором и попросить Camel отсортировать файлы перед обработкой.
В примере мы создали собственный компаратор, который просто сортирует по имени файла:
А затем мы можем настроить наш маршрут, используя параметр sorter для ссылки на наш сортировщик ( mySorter
) мы определили в XML-файле spring:
Параметры URI могут ссылаться на beans с использованием синтаксиса # В приведенном выше маршруте Spring DSL обратите внимание, что мы можем ссылаться на beans в реестре, добавив к идентификатору префикс |
Сортировка с использованием sortBy
Camel поддерживает подключаемые стратегии сортировки. Эта стратегия заключается в использовании языка файлов для настройки сортировки. Параметр sortBy
настраивается следующим образом:
sortBy = group 1; группа 2; группа 3; ...
Где каждая группа разделяется точкой с запятой. В простых ситуациях вы просто используете одну группу, поэтому простым примером может быть:
sortBy = file: name
Это будет отсортировано по имени файла, вы можете изменить порядок, добавив префикс в обратном направлении:
в группу, поэтому сортировка теперь Z.. A:
sortBy=reverse:file:name
Поскольку у нас есть все возможности File Language, мы можем использовать некоторые другие параметры, поэтому, если мы хотим отсортировать файлы по размеру, мы делаем:
sortBy=file:length
Вы можете настроить игнорирование регистра, используя ignoreCase:
для сравнения строк, поэтому, если вы хотите использовать сортировку имен файлов, но игнорировать регистр, мы делаем:
sortBy=ignoreCase:file:name
Вы можете комбинировать игнорирование регистра и обратное, однако сначала необходимо указать обратное:
sortBy = reverse: ignoreCase: file: name
В приведенном ниже примере мы хотим отсортировать по последнему измененному файлу, поэтому мы делаем:
sortBy=file:modified
А потом мы хотите сгруппировать по имени как второй вариант, чтобы файлы с одинаковой модификацией были отсортированы по имени:
sortBy = file : modified; file: name
Теперь здесь есть проблема, вы можете ее заметить? Что ж, измененная временная метка файла слишком хороша, поскольку она будет в миллисекундах, но что, если мы хотим отсортировать только по дате, а затем подгруппировать по имени?
Ну, поскольку у нас есть настоящая мощь File Language, мы можем используйте его команду даты, которая поддерживает шаблоны. Таким образом, это можно решить следующим образом:
sortBy = date: file: yyyyMMdd; file: name
Да, это довольно мощно, о, кстати, вы также можете использовать обратное преобразование для каждой группы, чтобы мы могли изменить имена файлов:
sortBy=date:file:yyyyMMdd;reverse:file:name
Использование GenericFileProcessStrategy
параметр processStrategy
можно использовать для использования настраиваемого GenericFileProcessStrategy
, который позволяет реализовать собственное begin , логика фиксации и отката .
Например, предположим, что система записывает файл в папку, которую вы должны использовать. Но вы не должны начинать использовать файл до того, как будет записан другой готов файл.
Итак, реализовав наш собственный GenericFileProcessStrategy
мы можем реализовать это как:
-
В
begin ()
, мы можем проверить, существует ли специальный файл ready . Метод begin возвращаетлогическое
, чтобы указать, можем ли мы использовать файл или нет. -
В
специальная логика метода abort ()
может выполняться в случае, если операцияbegin
вернулаfalse
, например, для очистки ресурсов и т. д.. -
в методе
commit ()
мы можем переместить фактический файл, а также удалить готовый файл.
Использование фильтра
Параметр filter
позволяет реализовать настраиваемый фильтр в коде Java путем реализации файла org.apache.camel.component.file. GenericFileFilter
интерфейс. В этом интерфейсе есть метод accept
, который возвращает логическое значение. Верните true
, чтобы включить файл, и false
, чтобы пропустить файл. Существует метод isDirectory
для GenericFile
, независимо от того, является ли файл каталогом. Это позволяет вам фильтровать нежелательные каталоги, чтобы избежать обхода нежелательных каталогов.
Например, чтобы пропустить любые каталоги, которые начинаются с "пропустить"
в названии может быть реализовано следующим образом:
Использование bridgeErrorHandler
Если вы хотите использовать обработчик ошибок Camel для обработки любых исключений, возникающих в файле-потребителе, вы можете включить параметр bridgeErrorHandler
, как показано ниже. :
//для обработки любого генерируемого исключения IOException onException (IOException.class) .handled (true) .log ( "Произошло исключение IOException из-за: $ {exception.message}") .transform (). Simple ("Error $ {exception.message}") .to ("mock: error");//это маршрут файла, по которому загружаются файлы обратите внимание, как мы соединяем потребителя для использования обработчика ошибок маршрутизации Camel//эксклюзивныйReadLockStrategy настроен только потому, что это из модульного теста, поэтому мы используем это для имитации исключения tionsfrom ("file: target/nospace? bridgeErrorHandler = true") .convertBodyTo (String.class) .to ("mock: result");
Итак, все, что вам нужно сделать, это включить эту опцию, и обработчик ошибок в маршруте возьмет ее оттуда.
Важно при использовании bridgeErrorHandler . При использовании bridgeErrorHandler затем перехватчики, OnCompletions не применяется. Обмен обрабатывается непосредственно обработчиком ошибок Camel и не позволяет выполнять предварительные действия, такие как перехватчики, onCompletion. |
Ведение журнала отладки
Этот компонент имеет уровень журнала TRACE , который может быть полезен при возникновении проблем.
Автоконфигурация загрузки Spring
При использовании файла с загрузкой Spring убедитесь, что вы используете следующую зависимость Maven для поддержки для автоматической настройки:
org.apache.camel.springboot верблюжий-файл-стартер xx. x
Компонент поддерживает 11 параметров, которые перечислены ниже.
Имя | Описание | По умолчанию | Тип |
---|---|---|---|
camel.component.file.autowired- enabled |
Включено ли автоматическое подключение. Это используется для параметров автоматического подключения (параметр должен быть помечен как автоматически подключенный) путем поиска в реестре, чтобы найти единственный экземпляр соответствующего типа, который затем настраивается на компоненте. Это можно использовать для автоматической настройки источников данных JDBC, фабрик соединений JMS, клиентов AWS и т. Д. |
true |
Boolean |
camel.component.file.bridge-error- обработчик |
Позволяет связать потребителя с обработчиком ошибок маршрутизации Camel, что означает любые исключения, возникшие, когда потребитель пытается получить входящие сообщения, или подобное, теперь будет обрабатываться как сообщение и обрабатываться обработчиком ошибок маршрутизации. По умолчанию потребитель будет использовать org.apache.camel.spi.ExceptionHandler для обработки исключений, которые будут регистрироваться на уровне WARN или ERROR и игнорироваться. |
false |
Boolean |
camel.component.file.cluster.service.acquire-lock-delay |
Время ожидания перед началом попытки получения блокировка. |
String |
|
camel.component.file.cluster.service.acquire-lock-interval |
время ожидания между попытками получить блокировку. |
String |
|
Пользовательские атрибуты службы. |
Map |
||
Устанавливает, если служба файлового кластера должна d быть включен или нет, по умолчанию — false. |
false |
Boolean |
|
ID кластерной службы |
String |
||
Порядок/приоритет поиска службы. |
Integer |
||
Корневой путь. |
String |
||
camel.component.file. enabled |
Включать ли автоконфигурацию файлового компонента. Это включено по умолчанию. |
Boolean |
|
Будет ли производителя надо запускать ленивым (по первому сообщению). Запустив ленивый запуск, вы можете использовать это, чтобы разрешить CamelContext и маршруты для запуска в ситуациях, когда в противном случае производитель может выйти из строя во время запуска и вызвать сбой запуска маршрута. Если отложить этот запуск на «ленивый», тогда сбой запуска можно будет обработать во время маршрутизации сообщений с помощью обработчиков ошибок маршрутизации Camel. Помните, что при обработке первого сообщения создание и запуск производителя может занять некоторое время и увеличить общее время обработки. |
false |
Boolean |