2

シナリオ:パッケージ#1は、外部システムの「INPUT」フォルダーにドロップされる複数のメッセージ(1行に1つ)を含むフラットファイルを作成します。ファイルは外部システムによって取得されて処理され、応答は同じ形式で「OUTPUT」フォルダー内のファイルに書き込まれます。外部システムがメッセージを処理している間にファイルの書き込みが開始されるため、foo.rspproとして書き込まれます。処理が完了し、すべての応答メッセージが書き込まれると、名前がfoo.rspに変更されます。

完了したら(つまり、名前の変更後に)そのファイルを取得し、Package#1の直後に開始されるPackage#2を使用して処理する必要があります。Package#2が起動すると、外部システムは次の3つの状態になる可能性があります。

  1. 最初のメッセージの処理はまだ完了しておらず、応答ファイルもまだ書き込まれていません。この場合、foo.rspproが書き込まれるのを待ってから、名前をfoo.rspに変更する必要があります。
  2. 処理が進行中で、foo.rspproが書き込まれます。この場合、foo.rspproの名前がfoo.rspに変更されるのを待つ必要があります。
  3. 処理が完了し、foo.rspproが作成され、名前がfoo.rspに変更されました。この場合、foo.rspを処理する必要があります。

私が試してみました:

  1. 使用中のファイルを使用しているが、タスクの開始時に予期されたファイルが存在しない場合のエラー(つまり、シナリオ1および2のエラー)
  2. ファイルウォッチャータスクを使用しますが、設計上ファイルの名前変更を無視しているように見えるため、シナリオ1または2を処理することはありません。

スクリプトタスクを作成する以外に、3つのシナリオすべてを処理するカスタムタスクはありますか?

編集:SSIS 2008 R2

4

3 に答える 3

0

うーん、出力フォルダーのfor eachループコンテナーを使用して、.rspファイルのみを読み取るように設定することで解決できるようです。それはあなたの.rspファイルを扱います。

パッケージ1が終了した後にのみパッケージ2が実行される場合、シナリオ1と2はどのように発生しますか?私が理解しているように、package1はファイルの名前を変更するため、すべてのファイルがプロセスで名前が変更されたときにのみ終了します

編集:

わかりました、心配しないでください、すべてのための解決策があります。処理するファイルの総数を使用して@TotalNumberOfFilesという変数をpackage1に作成し、パッケージ1を使用してpacakge2を呼び出します(これをすでに行っているかどうかはわかりませんが、非常に単純でない場合は、 pacakgeタスクを実行します)そしてpackage2で「親パッケージ変数」を作成し(これを行ったことがない場合も非常に簡単です)、パッケージ2は出力フォルダーに.rsp拡張子の@TotalNumberOfFilesファイルがあるときに処理を開始します?

EDIT2:それを取得するコマンドがあるかどうかはわかりません。おそらくグーグルですが、見つからない場合は、出力ディレクトリを指すforeachloopコンテナを追加して、スクリプトタスクで次のようなことを行うことができます。

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

カウントが終了したら、TotalNumberOfFilesと比較してください。等しい場合は次のタスクに移動し、そうでない場合はしばらくスリープしてからもう一度カウントします

于 2012-05-03T08:22:00.650 に答える
0

あなたの場合、スクリプトタスクだけが役に立ちます。

可能であれば、スクリプト内でFileSystemWatcherを使用することを検討するか、FileSystemWatcherを使用してファイルシステムを監視し、イベントがトリガーされたときにパッケージを呼び出すことができるアプリケーション/Windowsサービスを用意してください。

于 2012-05-03T10:17:25.390 に答える
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
于 2012-07-03T14:51:14.543 に答える