2012-05-03 2 views
2

Сценарий: Пакет # 1 создает плоский файл, содержащий несколько сообщений (по одной в строке), которые удаляются в папке «INPUT» внешней системы. Файл подбирается внешней системой и обрабатывается, а ответы записываются в том же формате в файл в папке «OUTPUT». Файл начинает записываться, пока внешняя система все еще обрабатывает сообщения, поэтому она написана как foo.rsppro. Когда обработка завершена и все сообщения ответа записаны, она переименована в foo.rsp.Как получить SSIS, чтобы ждать, пока файл будет существовать и/или станет доступен

Мне нужно забрать этот файл после его завершения (т. Е. После переименования) и обработать с использованием пакета №2, который немедленно начнется после пакета № 1. Когда пакет # 2 начинается, внешняя система может находиться в трех состояниях:

  1. Обработка первого сообщения еще не полностью и файла ответов написанного еще, в этом случае мне нужно ждать foo.rsppro быть написано, затем переименовано в foo.rsp
  2. обработки продолжается и foo.rsppro написано, в этом случае мне нужно ждать foo.rsppro быть переименована в foo.rsp
  3. Обработка завершена, foo.rsppro было написано и был переименован в foo.rsp, и в этом случае мне просто нужно обработать foo.rsp.

Я попытался:

  1. используя file in use task но ошибки, если ожидаемый файл не присутствует, когда начинается задача (т.е. ошибок для сценария 1 и 2)
  2. используя file watcher task но что, как представляется, игнорировать файл переименовывается дизайн, поэтому никогда не будет обрабатывать сценарий 1 или 2

Помимо строительства script task, есть пользовательские задачи, которые будут обращаться с Три сценария?

Edit: SSIS 2008 R2

ответ

0

Задача сценария может помочь в вашем случае.

Рассмотрите возможность использования FileSystemWatcher в скрипте, если это возможно, или иметь службу приложения/Windows, которая может контролировать файловую систему с помощью FileSystemWatcher и вызывать ваши пакеты при запуске события.

+0

Я сдался в конце и написал сценарий. На самом деле два сценария. Один ищет .rsppro или .rsp, чтобы зарегистрировать эту обработку, и тот, который просто ищет .rsp для регистрации этой обработки. переменные используются для определения интервала ожидания и количества проверок. – Aphillippe

+0

, который служит вашей цели. что вы используете в своих сценариях для поиска файлов? Занятые петли? – Vivek

+0

Точно. См. Мой ответ ниже для кода. – Aphillippe

0

Хамм, кажется, что вы можете решить ее с помощью каждого контейнера петли на выходную папку и установить его только для чтения .rsp файлов. Это касается ваших файлов .rsp.

Как может произойти сценарий 1 и 2, если пакет 2 будет работать только после завершения пакета 1? Как я понимаю, package1 переименовывает файл, так это будет только конец, когда все файлы процессов и переименован

EDIT:

ок, не волнуйтесь, есть решение для всего. Как насчет того, вы создаете переменную в пакете 1, называемую @TotalNumberOfFiles, с общим количеством обрабатываемых файлов, тогда вы используете один пакет для вызова pacakge2 (не уверен, что вы это делаете, но если это не так просто, просто используйте выполнить задачу pacakge), а на пакете 2 вы создаете «родительскую переменную пакета» (это тоже очень просто, если вы этого еще не сделали), а пакет 2 просто начнет обработку, когда в выходной папке есть файлы @TotalNumberOfFiles с .rsp расширение?

EDIT2: Я не знаю, есть ли команда, чтобы получить это, может быть, google, но если вы не узнаете, вы можете добавить контейнер foreachloop, указывающий на выходной каталог, и сделать что-то вроде этого в задаче скрипта:

Public Sub Main() 
     Dts.Variables("User::filesCount").Value = Dts.Variables("User::FilesCount").Value + 1 
     Dts.TaskResult = ScriptResults.Success 
    End Sub 

после того, как он заканчивает подсчет, просто сравните с TotalNumberOfFiles. Если он равен, переходите к следующей задаче, иначе спящий на некоторое время и снова подсчитывайте

+0

no, внешняя система переименовывает файл. Проблема в том, что пакет №2 начинается сразу после завершения пакета №1, но внешняя система может находиться в одном из трех состояний, описанных, и я не могу найти существующую задачу типа файла, которая будет обрабатывать все три. – Aphillippe

+0

нормально, и есть ли у вас доступ к этой внешней системе? что-то изменить, если необходимо – Diego

+0

нет, у нас нет способа изменить обработку во внешней системе. Сценарий исправлен, и SSIS необходимо обойти его. – Aphillippe

0

Окончательный код используется следующим образом. В основном выполняется цикл до тех пор, пока не будет найден файл или не будет достигнут максимальное количество попыток. Imports System.Threading требуется для Thread.sleep. Это может быть не самый эффективный процессор, но это 100% специализированное оборудование, и пакеты работают в серийном режиме.

'loop until number of required attempts is hit or file is found 
     Do Until iCounter = iAttempts Or bFileFound = True 

      'Check if the file exists 
      If File.Exists(sFilename) Then 

       'Switch bFileFound to true 
       bFileFound = True 

       'Report that file has been found to VERIFY_Input_File_Exists_INT variable 
       Dts.Variables("VERIFY_Input_File_Exists_INT").Value = True 

       Dts.Events.FireInformation(1, "DEBUG:", sFilename & " found successfully.", "", 0, False) 

      Else 

       'sleep for specified time 
       Thread.Sleep(iInterval * 1000) 

       Dts.Events.FireInformation(1, "DEBUG:", sFilename & " not found successfully. Sleeping for " & iInterval & "* 1000", "", 0, False) 

      End If 

      'increment counter 
      iCounter = iCounter + 1 

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