Получение сообщений из файлов

Для получения сообщений из файлов в локальной файловой системе или в локальной сети предназначен узел процесса интеграции вида ФайлИсточник. Он порождает сообщения из файлов, расположенных в указанном каталоге. В этом случае в теле сообщения будет находиться сам файл.

После чтения сообщения из файла сохраняет в свойствах сообщения некоторую информацию о прочитанном файле, например: ИмяФайла, АбсолютныйПутьФайла, РазмерФайла, ФайлИзменен и др. Подробнее см. тип имя-процесса-интеграции.Сообщение.

Выбор файлов

При создании процесса интеграции в свойстве Каталог этого узла нужно указать тот каталог, из которого должна брать файлы.

После этого вы можете заполнить свойство ИмяФайла, и тогда будет искать конкретный файл с таким именем. Также вы можете вычислить имя файла, который нужно прочитать, уже во время работы приложения. Для этого используйте обработчик события ОбработчикОпределенияИмени. Если заполнено свойство ИмяФайла и указан ОбработчикОпределенияИмени, то имя файла будет браться из обработчика, и, только в случае ошибки в обработчике, будет взято из свойства ИмяФайла.

Если Каталог имеет вложенные каталоги, то вы можете установить свойство ИскатьВКаталогеРекурсивно в значение Истина. В этом случае будет искать файлы в указанном каталоге и во всех каталогах, вложенных в него.

Если вам нужен не один, а несколько файлов, то вы можете использовать свойства МаскаВключенияФайлов и МаскаИсключенияФайлов. Множественные значения разрешены через запятую. Оба эти свойства используют маску в стиле Ant:
  • ? — обозначает один символ;
  • * — обозначает любое количество символов;
  • ** — обозначает любое количество каталогов в пути файла.

Например, если будет маска включения **/*.txt, то найдет все файлы с расширением txt, независимо от того, в каком вложенном каталоге они лежат.

Например, если будет маска включения subdir?/1.txt, то найдет все файлы 1.txt, которые лежат в подкаталогах subdir1 ... subdirN исходного каталога.

Маска исключения более приоритетна, чем маска включения, то есть сначала имеющиеся файлы исключаются, потом включаются. Таким образом, будут найдены все файлы, удовлетворяющие маске включения, кроме тех, которые удовлетворяют маске исключения.

Важно: Обратите внимание, что для использования свойств МаскаВключенияФайлов и МаскаИсключенияФайлов значение свойства ИскатьВКаталогеРекурсивно должно быть равно Истина.
Не следует одновременно задавать свойство МаскаВключенияФайлов и ИмяФайла, так как это не имеет смысла (в таком случае, вначале будет искаться файл с заданным в свойстве ИмяФайла именем, и после этого найденное имя будет валидироваться маской). Если вы зададите ОбработчикОпределенияИмени и свойство МаскаВключенияФайлов, то вначале имя будет определено в обработчике, и лишь после этого будет провалидировано с использованием указанной маски.

Что делать с файлом после чтения

После того как файл прочитан, вы можете оставить его на своем месте, либо удалить, либо переместить (переименовать). За это отвечает свойство ИсходныйФайлПослеЧтения.

Если вы решаете его переместить (переименовать), то нужно указать его новое имя. Это можно сделать либо в свойстве ИмяПослеЧтения, либо в обработчике события ОбработчикОпределенияИмениПослеЧтения.

Мы рекомендуем удалять исходный файл после чтения. Если это не подходит — тогда переименовывать его или перемещать в другой каталог, чтобы сократить возможные коллизии, вызванные повторной отправкой этого же файла.

Перечитывание файла

Если вы решили оставить файл на своем месте, то нужно учитывать, что он будет перечитываться каждый раз при запуске процесса интеграции. Например, вы запустили процесс интеграции, он обнаружил файл, прочитал его, отправил сообщение. После этого вы остановили процесс интеграции, а потом запустили его заново. В этом случае, если файл лежит на том же месте, он опять будет прочитан и опять будет отправлено сообщение.

После чтения файла и отправки сообщения, пока процесс интеграции работает, постоянно проверяет, что прочитанный файл не изменился. Проверяются размер файла и момент изменения файла. Такие проверки осуществляются 10 раз в секунду. Если обнаружит, что файл изменился, этот файл будет заново прочитан и заново отправлен.

Если в процессе чтения происходит ошибка (например, та система, которая породила файл, захватила его эксклюзивно), то это не приводит к фатальным последствиям. Просто через 1/10 секунды попытается прочитать файл еще раз.

Пример

Есть следующий процесс интеграции: отправители помещают файлы в два разных каталога, из которых читает эти файлы, формирует сообщения и помещает их в каталог, из которого получатели забирают свои файлы.

Два разных каталога Источник1 и Источник2 сделаны только для того, чтобы показать два разных способа поиска файлов: с помощью свойства МаскаВключенияФайлов и с помощью обработчика события ОбработчикОпределенияИмени. Оба источника ищут файлы рекурсивно (ИскатьВКаталогеРекурсивно равно Истина).

Источник1 использует свойство МаскаВключенияФайлов:

**/%{Участник.Код}.*

Файлы будут искаться во всех вложенных каталогах (**) с именем, равным коду информационной системы (%{Участник.Код}) с любым расширением (.*).

Источник2 использует событие ОбработчикОпределенияИмени:

метод ОпределениеИмениИсточника(Контекст: ПримерИнтеграции3.КонтекстВызова): Строка
    возврат "%{Контекст.Участник.Код}.txt" 
;

В этот обработчик передается контекст вызова, экземпляр типа имя-процесса-интеграции.КонтекстВызова. В свойстве Участник он содержит данные информационной системы-отправителя из справочника Инфосистемы. В результате файлы будут искаться в указанном каталоге, с именем, которое совпадает с кодом инфосистемы и с расширением TXT.

В узле ФайлНазначение с помощью встроенного языка определяется имя файла, в который будет записано сообщение. Для этого используется обработчик события ОбработчикОпределенияИмени.

метод ИмяИзИстории(Контекст: ПримерИнтеграции3.КонтекстВызова, 
                   Сообщение: ПримерИнтеграции3.Сообщение): Строка

    пер Префикс = Сообщение.УзлыПути.Источник.Узел == Схема.Узлы.Источник1 
                     ? "1" 
                     : "2"
    возврат "%{Префикс}-%{Контекст.Участник.Код}"
;

Если источником сообщения является узел Источник1, то файл будет записан с префиксом 1, в противном случае — с префиксом 2.

См. также Свойства узла процесса интеграции вида «ФайлИсточник».