프로그래밍 방식으로 이벤트 처리
적용 대상: Azure Data Factory의 SQL Server SSIS Integration Runtime
SSIS 런타임에서는 패키지의 유효성 검사 및 실행 전후와 도중에 발생하는 이벤트 컬렉션을 제공합니다. 이러한 이벤트는 두 가지 방법으로 캡처할 수 있습니다. 첫 번째 방법은 클래스에서 인터페이스를 IDTSEvents 구현하고 클래스를 패키지의 Execute 및 Validate 메서드에 매개 변수로 제공하는 것입니다. 두 번째 방법은 태스크 및 루프와 같이 다른 SSIS 개체를 포함할 수 있으며 IDTSEvents에서 이벤트가 발생할 때 실행되는 DtsEventHandler 개체를 만드는 것입니다. 이 섹션에서는 이러한 두 가지 메서드를 설명하고 사용법을 보여 주는 코드 예제를 제공합니다.
IDTSEvents 콜백 수신
프로그래밍 방식으로 패키지를 빌드하고 실행하는 개발자는 인터페이스를 사용하여 IDTSEvents 유효성 검사 및 실행 프로세스 중에 이벤트 알림을 받을 수 있습니다. 이 작업은 인터페이스를 구현하는 클래스를 IDTSEvents 만들고 이 클래스를 패키지의 Validate 및 Execute 메서드에 매개 변수로 제공하여 수행됩니다. 그런 다음 이벤트가 발생할 때 런타임 엔진에서 클래스의 메서드를 호출합니다.
DefaultEvents 클래스는 이미 인터페이스를 IDTSEvents 구현하는 클래스이므로 직접 구현하는 IDTSEvents 또 다른 대안은 응답하려는 특정 이벤트에서 파생 DefaultEvents 및 재정의하는 것입니다. 그런 다음 클래스를 이벤트 콜백을 수신할 유효성 검사 및 실행 메서드에 Package 대한 매개 변수로 제공합니다.
다음 코드 예제에서는 DefaultEvents의 파생 클래스를 보여 주고 OnPreExecute 메서드를 재정의합니다. 그런 다음 클래스는 패키지의 유효성 검사 및 실행 메서드에 대한 매개 변수로 제공됩니다.
using System;
using Microsoft.SqlServer.Dts.Runtime;
namespace Microsoft.SqlServer.Dts.Samples
{
class Program
{
static void Main(string[] args)
{
Package p = new Package();
MyEventsClass eventsClass = new MyEventsClass();
p.Validate(null, null, eventsClass, null);
p.Execute(null, null, eventsClass, null, null);
Console.Read();
}
}
class MyEventsClass : DefaultEvents
{
public override void OnPreExecute(Executable exec, ref bool fireAgain)
{
// TODO: Add custom code to handle the event.
Console.WriteLine("The PreExecute event of the " +
exec.ToString() + " has been raised.");
}
}
}
Imports Microsoft.SqlServer.Dts.Runtime
Module Module1
Sub Main()
Dim p As Package = New Package()
Dim eventsClass As MyEventsClass = New MyEventsClass()
p.Validate(Nothing, Nothing, eventsClass, Nothing)
p.Execute(Nothing, Nothing, eventsClass, Nothing, Nothing)
Console.Read()
End Sub
End Module
Class MyEventsClass
Inherits DefaultEvents
Public Overrides Sub OnPreExecute(ByVal exec As Executable, ByRef fireAgain As Boolean)
' TODO: Add custom code to handle the event.
Console.WriteLine("The PreExecute event of the " & _
exec.ToString() & " has been raised.")
End Sub
End Class
DtsEventHandler 개체 만들기
런타임 엔진은 개체를 통해 DtsEventHandler 강력하고 매우 유연한 이벤트 처리 및 알림 시스템을 제공합니다. 이러한 개체를 사용하면 이벤트 처리기가 속해 있는 이벤트가 발생할 때만 실행되는 이벤트 처리기 내의 전체 워크플로를 디자인할 수 있습니다. DtsEventHandler 개체는 부모 개체의 해당 이벤트가 발생할 때 실행되는 컨테이너입니다. 이 아키텍처를 사용하면 컨테이너에서 발생하는 이벤트에 대한 응답으로 실행되는 격리된 워크플로를 만들 수 있습니다. DtsEventHandler 개체는 동기적이므로 이벤트에 연결된 이벤트 처리기가 반환될 때까지 실행이 다시 시작되지 않습니다.
다음 코드에서는 개체를 만드는 DtsEventHandler 방법을 보여 줍니다. 이 코드는 패키지 컬렉션에 Executables a를 추가 FileSystemTask 한 DtsEventHandler 다음 태스크의 이벤트에 대한 개체를 OnError 만듭니다. FileSystemTask는 첫 번째 OnError에 대해 FileSystemTask 이벤트가 발생할 때 실행되는 이벤트 처리기에 추가됩니다. 이 예에서는 C:\Windows\Temp\DemoFile.txt라는 테스트용 파일이 있다고 가정합니다. 샘플을 처음 실행할 때 파일을 성공적으로 복사하고 이벤트 처리기가 호출되지 않는 경우 샘플을 두 번째로 실행할 때 첫 번째는 FileSystemTask 파일 복사에 실패하고(값 OverwriteDestinationFile 이 false이기 때문에), 이벤트 처리기가 호출되고, 두 번째 FileSystemTask 가 원본 파일을 삭제하고, 발생한 오류로 인해 패키지가 실패를 보고합니다.
예시
using System;
using System.IO;
using Microsoft.SqlServer.Dts.Runtime;
using Microsoft.SqlServer.Dts.Tasks.FileSystemTask;
namespace Microsoft.SqlServer.Dts.Samples
{
class Program
{
static void Main(string[] args)
{
string f = "DemoFile.txt";
Executable e;
TaskHost th;
FileSystemTask fst;
Package p = new Package();
p.Variables.Add("sourceFile", true, String.Empty,
@"C:\Windows\Temp\" + f);
p.Variables.Add("destinationFile", true, String.Empty,
Path.Combine(Directory.GetCurrentDirectory(), f));
// Create a first File System task and add it to the package.
// This task tries to copy a file from one folder to another.
e = p.Executables.Add("STOCK:FileSystemTask");
th = e as TaskHost;
th.Name = "FileSystemTask1";
fst = th.InnerObject as FileSystemTask;
fst.Operation = DTSFileSystemOperation.CopyFile;
fst.OverwriteDestinationFile = false;
fst.Source = "sourceFile";
fst.IsSourcePathVariable = true;
fst.Destination = "destinationFile";
fst.IsDestinationPathVariable = true;
// Add an event handler for the FileSystemTask's OnError event.
DtsEventHandler ehOnError = (DtsEventHandler)th.EventHandlers.Add("OnError");
// Create a second File System task and add it to the event handler.
// This task deletes the source file if the event handler is called.
e = ehOnError.Executables.Add("STOCK:FileSystemTask");
th = e as TaskHost;
th.Name = "FileSystemTask2";
fst = th.InnerObject as FileSystemTask;
fst.Operation = DTSFileSystemOperation.DeleteFile;
fst.Source = "sourceFile";
fst.IsSourcePathVariable = true;
DTSExecResult vr = p.Validate(null, null, null, null);
Console.WriteLine("ValidationResult = " + vr.ToString());
if (vr == DTSExecResult.Success)
{
DTSExecResult er = p.Execute(null, null, null, null, null);
Console.WriteLine("ExecutionResult = " + er.ToString());
if (er == DTSExecResult.Failure)
if (!File.Exists(@"C:\Windows\Temp\" + f))
Console.WriteLine("Source file has been deleted by the event handler.");
}
Console.Read();
}
}
}
Imports System.IO
Imports Microsoft.SqlServer.Dts.Runtime
Imports Microsoft.SqlServer.Dts.Tasks.FileSystemTask
Module Module1
Sub Main()
Dim f As String = "DemoFile.txt"
Dim e As Executable
Dim th As TaskHost
Dim fst As FileSystemTask
Dim p As Package = New Package()
p.Variables.Add("sourceFile", True, String.Empty, _
"C:\Windows\Temp\" & f)
p.Variables.Add("destinationFile", True, String.Empty, _
Path.Combine(Directory.GetCurrentDirectory(), f))
' Create a first File System task and add it to the package.
' This task tries to copy a file from one folder to another.
e = p.Executables.Add("STOCK:FileSystemTask")
th = CType(e, TaskHost)
th.Name = "FileSystemTask1"
fst = CType(th.InnerObject, FileSystemTask)
fst.Operation = DTSFileSystemOperation.CopyFile
fst.OverwriteDestinationFile = False
fst.Source = "sourceFile"
fst.IsSourcePathVariable = True
fst.Destination = "destinationFile"
fst.IsDestinationPathVariable = True
' Add an event handler for the FileSystemTask's OnError event.
Dim ehOnError As DtsEventHandler = CType(th.EventHandlers.Add("OnError"), DtsEventHandler)
' Create a second File System task and add it to the event handler.
' This task deletes the source file if the event handler is called.
e = ehOnError.Executables.Add("STOCK:FileSystemTask")
th = CType(e, TaskHost)
th.Name = "FileSystemTask1"
fst = CType(th.InnerObject, FileSystemTask)
fst.Operation = DTSFileSystemOperation.DeleteFile
fst.Source = "sourceFile"
fst.IsSourcePathVariable = True
Dim vr As DTSExecResult = p.Validate(Nothing, Nothing, Nothing, Nothing)
Console.WriteLine("ValidationResult = " + vr.ToString())
If vr = DTSExecResult.Success Then
Dim er As DTSExecResult = p.Execute(Nothing, Nothing, Nothing, Nothing, Nothing)
Console.WriteLine("ExecutionResult = " + er.ToString())
If er = DTSExecResult.Failure Then
If Not File.Exists("C:\Windows\Temp\" + f) Then
Console.WriteLine("Source file has been deleted by the event handler.")
End If
End If
End If
Console.Read()
End Sub
End Module