2010-03-19 5 views
0

Фон:Файлы процесса SSIS из папки

У меня есть папка, которая непрерывно перекачивается с файлами. Мой пакет SSIS должен обрабатывать файлы и удалять их. Пакет SSIS планируется запускать каждую минуту. Я собираю файлы в порядке возрастания времени создания файла. Я создаю массив файлов, а затем обрабатываю-удаляя их по одному.

Проблема:

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

Мне было интересно, существует ли способ избежать исключения.

Спасибо.

ответ

1

Как вы планирования задания? Если вы используете планировщик заданий SQL Server, я под впечатлением не должен повторно запускать уже запущенную работу; см. этот вопрос: Will a SQL Server Job skip a scheduled run if it is already running?

В качестве альтернативы вместо того, чтобы пытаться переместить файл вокруг вас, вы можете построить шаг своей работы, чтобы проверить, запущен ли он. Я не делал этого сам, но, возможно, это было возможно, прочитайте эту статью. Detecting The State of a SQL Server Agent Job

+0

Спасибо за информацию. Поскольку агент не будет запускать второй экземпляр до завершения первого экземпляра, я могу безопасно планировать свой пакет с интервалом в одну минуту. –

1

Вы можете проверить наличие файла перед его удалением.

File.Exists (filepathandname)

+0

Да, для удаления части. Но обрабатывающая часть будет дублироваться. –

+0

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

+0

@revelator, Да, это возможно.Тем не менее, это связано с созданием временного каталога, перемещением файлов в этот каталог, их обработкой и удалением. Если по какой-либо причине процесс завершился неудачно, у вас есть файлы, «застрявшие» в каталоге temp. Мне было интересно, есть ли «чище» решение. –

0

Чтобы убедиться, что ваш пакет не испорчен одними и теми же файлами, вы можете просто создать пустой файл, имя файла, но с другим расширением (например, mydata.csv.being_processes) и убедитесь, что ваша задача потока данных запущена только в файлах, которые не имеют такого файла.

Это действует как замок.

Конечно, вы могли бы изменить способ вы планирования заданий, но часто - когда мы сталкиваемся с такой проблемой - это потому, что мы не получили рычаги влияния на эти вещи :)

0

Вы можете создать «заблокировать файл» для предотвращения параллельного выполнения пакетов. Чтобы защитить себя от случая с разбитым пакетом, рассмотрите возможность создания даты создания файла для эмулирования таймаута блокировки.

I.e .: В начале пакета вы проверите наличие файла блокировки. Если он отсутствует или он был создан больше, чем X часов назад - затем продолжите импорт. В противном случае выйдите.

0

У меня такая же ситуация. Что вы делаете, так это ваш пакет SSIS для чтения всех файлов в папке и создания рабочего файла, такого как «process.txt». Это приведет к созданию списка допустимых файлов в этот момент времени. Если у вас несколько пакетов, создайте файл с именем типа process_.txt. Пакет обрабатывает только файлы, указанные в их файле процесса. Это предотвратит совпадение.

Смежные вопросы