Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Şunlar için geçerlidir:SQL Server
Azure Data Factory'de SSIS Tümleştirme Çalışma Zamanı
Entegrasyon Hizmetleri çalışma zamanı motoru, paketlerin, görevlerin ve diğer konteyner türlerinin çalışma sırasında kesme noktaları kullanılarak askıya alınmasını sağlar. Breakpoint'lerin kullanımı, uygulamanızın veya görevlerinizin doğru çalışmasını engelleyen hataları gözden geçirmenize ve düzeltmenize olanak tanır. Breakpoint mimarisi, istemcinin görev işleme duraklıyken paketteki nesnelerin çalışma zamanı değerini belirlemesini sağlar.
Özel görev geliştiricileri, bu mimariyi arayüz ve ana arayüzü kullanarak IDTSBreakpointSite özel kesme noktası hedefleri oluşturabilirler. IDTSSuspend Arayüz, IDTSBreakpointSite çalışma zamanı motoru ile özel kesme noktası siteleri veya hedefler oluşturma ve yönetme görevi arasındaki etkileşimi tanımlar. Arayüz, IDTSSuspend çalışma zamanı motoru tarafından çağrılan yöntemler ve özellikler sunar ve görevin askıya alınması veya devam ettirilmesi için bildirimde bulunur.
Bir kırılma noktası veya hedef, görevin yürütülmesinde işlemin durdurulabileceği bir noktadır. Kullanıcılar, Break Points Ayarlan iletişim kutusunda mevcut breakpoint sitelerinden seçim yapar. Örneğin, varsayılan kesme noktası seçeneklerine ek olarak, Foreach Döngü Konteyneri "Her döngünün başında Break" seçeneğini sunar.
Bir görev yürütme sırasında bir kesme noktası hedefine ulaştığında, kırılma noktası hedefini değerlendirerek bir kesme noktasının etkinleştirilip etkinleştirilmediğini belirler. Bu, kullanıcının yürütmenin o kırılma noktasında durmasını istediğini gösterir. Breakpoint etkinleştirilirse, görev olayı OnBreakpointHit çalışma zamanı motoruna yükseltir. Çalışma zamanı motoru, pakette şu anda çalışan her görevin Askıya Alma metodunu çağırarak olaya yanıt verir. Görevin yürütülmesi, çalışma zamanı askıya alınan görevin ResumeExecution metodunu çağırdığında devam eder.
Breakpoint kullanmayan görevler yine de ve IDTSSuspend arayüzlerini uygulamalıdırIDTSBreakpointSite. Bu, paketteki diğer nesneler olay yarattığında OnBreakpointHit görevin doğru şekilde askıya alınmasını sağlar.
IDTSBreakpointSite Arayüzü ve BreakpointManager
Görevler, , bir tam sayı kimliği ve dize açıklaması parametreleri sunarak metodunu BreakpointManagerçağırarak CreateBreakpointTarget breakpoint hedefleri oluşturur. Görev, kodunda bir kırılma noktası hedefi içeren noktaya ulaştığında, bu yöntemi kullanarak kırılma noktasının IsBreakpointTargetEnabled hedefini değerlendirerek o kırılma noktasının etkin olup olmadığını belirler. Eğer doğruysa, görev olayı OnBreakpointHit yükselterek çalışma zamanı motorunu bilgilendirir.
Arayüz, IDTSBreakpointSite görev oluşturma sırasında çalışma zamanı motoru tarafından çağrılan tek bir yöntem AcceptBreakpointManagertanımlar. Bu yöntem, nesneyi parametre BreakpointManager olarak sağlar ve görev tarafından mola noktalarını oluşturmak ve yönetmek için kullanılır. Görevler, Validate ve Execute yöntemleri sırasında kullanılmak üzere yerel olarak saklanmalıdırBreakpointManager.
Aşağıdaki örnek kod, . kullanılarak bir kırılma noktası hedefi nasıl oluşturulacağını gösterir.BreakpointManager Örnek, olayı yükseltmek için yöntemi çağırır OnBreakpointHit .
public void AcceptBreakpointManager( BreakpointManager breakPointManager )
{
// Store the breakpoint manager locally.
this.bpm = breakPointManager;
}
public override DTSExecResult Execute( Connections connections,
Variables variables, IDTSComponentEvents events,
IDTSLogging log, DtsTransaction txn)
{
// Create a breakpoint.
this.bpm.CreateBreakPointTarget( 1 , "A sample breakpoint target." );
...
if( this.bpm.IsBreakpointTargetEnabled( 1 ) == true )
events.OnBreakpointHit( this.bpm.GetBreakpointTarget( 1 ) );
}
Public Sub AcceptBreakpointManager(ByVal breakPointManager As BreakpointManager)
' Store the breakpoint manager locally.
Me.bpm = breakPointManager
End Sub
Public Overrides Function Execute(ByVal connections As Connections, _
ByVal variables As Variables, ByVal events As IDTSComponentEvents, _
ByVal log As IDTSLogging, ByVal txn As DtsTransaction) As DTSExecResult
' Create a breakpoint.
Me.bpm.CreateBreakPointTarget(1 , "A sample breakpoint target.")
If Me.bpm.IsBreakpointTargetEnabled(1) = True Then
events.OnBreakpointHit(Me.bpm.GetBreakpointTarget(1))
End If
End Function
IDTSSuspend Arayüzü
Arayüz, IDTSSuspend çalışma zamanı motoru bir görevi durdurduğunda veya yürütmeye devam ettiğinde çağrılan yöntemleri tanımlar. Arayüz, IDTSSuspend arayüz tarafından IDTSBreakpointSite uygulanır ve Suspend ile ResumeExecution yöntemleri genellikle özel görev tarafından geçersiz kılılır. Çalışma zamanı motoru bir görevden OnBreakpointHit olayı aldığında, her çalışan görevin Askıya Alma metodunu çağırır ve görevlerin duraklatılması için bildirilir. İstemci yürütmeye devam ettiğinde, çalışma zamanı motoru askıya alınan görevlerin ResumeExecution metodunu çağırır.
Görev yürütmesini askıya almak ve yeniden başlatmak, görevin yürütme iş parçacılığını duraklatıp devam ettirmeyi içerir. Yönetilen kodda, bunu .NET Framework'ün System.Threading isim alanındaki ManualResetEvent sınıfı kullanılarak yaparsınız.
Aşağıdaki kod örneği, görevin askıya alınmasını ve yeniden başlatılmasını göstermektedir. Execute yönteminin önceki kod örneğinden değiştiğine ve kırılma noktası ateşlenirken yürütme iş parçacığına duraklatıldığına dikkat edin.
private ManualResetEvent m_suspended = new ManualResetEvent( true );
private ManualResetEvent m_canExecute = new ManualResetEvent( true );
private int m_suspendRequired = 0;
private int m_debugMode = 0;
public override DTSExecResult Execute( Connections connections, Variables variables, IDTSComponentEvents events, IDTSLogging log, DtsTransaction txn)
{
// While a task is not executing, it is suspended.
// Now that we are executing,
// change to not suspended.
ChangeEvent(m_suspended, false);
// Check for a suspend before doing any work,
// in case the suspend and execute calls
// were initiated at virtually the same time.
CheckAndSuspend();
CheckAndFireBreakpoint( componentEvents, 1);
}
private void CheckAndSuspend()
{
// Loop until we can execute.
// The loop is required rather than a simple If
// because there is a time between the return from WaitOne and the
// reset that we might receive another Suspend call.
// Suspend() will see that we are suspended
// and return. So we need to rewait.
while (!m_canExecute.WaitOne(0, false))
{
ChangeEvent(m_suspended, true);
m_canExecute.WaitOne();
ChangeEvent(m_suspended, false);
}
}
private void CheckAndFireBreakpoint(IDTSComponentEvents events, int breakpointID)
{
// If the breakpoint is enabled, fire it.
if (m_debugMode != 0 && this.bpm.IsBreakpointTargetEnabled(breakpointID))
{
// Enter a suspend mode before firing the breakpoint.
// Firing the breakpoint will cause the runtime
// to call Suspend on this task.
// Because we are blocked on the breakpoint,
// we are suspended.
ChangeEvent(m_suspended, true);
events.OnBreakpointHit(this.bpm.GetBreakpointTarget(breakpointID));
ChangeEvent(m_suspended, false);
}
// Check for a suspension for two reasons:
// 1. If we are at a point where we could fire a breakpoint,
// we are at a valid suspend point. Even if we didn't hit a
// breakpoint, the runtime may have called suspend,
// so check for it.
// 2. Between the return from OnBreakpointHit
// and the reset of the event, it is possible to have
// received a suspend call from which we returned because
// we were already suspended. We need to be sure it is okay
// to continue executing now.
CheckAndSuspend();
}
static void ChangeEvent(ManualResetEvent e, bool shouldSet)
{
bool succeeded;
if (shouldSet)
succeeded = e.Set();
else
succeeded = e.Reset();
if (!succeeded)
throw new Exception("Synchronization object failed.");
}
public bool SuspendRequired
{
get {return m_suspendRequired != 0;}
set
{
// This lock is also taken by Suspend().
// Because it is possible for the package to be
// suspended and resumed in quick succession,
// this property might be set before
// the actual Suspend() call.
// Without the lock, the Suspend() might reset the canExecute
// event after we set it to abort the suspension.
lock (this)
{
Interlocked.Exchange(ref m_suspendRequired, value ? 1 : 0);
if (!value)
ResumeExecution();
}
}
}
public void ResumeExecution()
{
ChangeEvent( m_canExecute,true );
}
public void Suspend()
{
// This lock is also taken by the set SuspendRequired method.
// It prevents this call from overriding an
// aborted suspension. See comments in set SuspendRequired.
lock (this)
{
// If a Suspend is required, do it.
if (m_suspendRequired != 0)
ChangeEvent(m_canExecute, false);
}
// We can't return from Suspend until the task is "suspended".
// This can happen one of two ways:
// the m_suspended event occurs, indicating that the execute thread
// has suspended, or the canExecute flag is set,
// indicating that a suspend is no longer required.
WaitHandle [] suspendOperationComplete = {m_suspended, m_canExecute};
WaitHandle.WaitAny(suspendOperationComplete);
}
Private m_suspended As ManualResetEvent = New ManualResetEvent(True)
Private m_canExecute As ManualResetEvent = New ManualResetEvent(True)
Private m_suspendRequired As Integer = 0
Private m_debugMode As Integer = 0
Public Overrides Function Execute(ByVal connections As Connections, _
ByVal variables As Variables, ByVal events As IDTSComponentEvents, _
ByVal log As IDTSLogging, ByVal txn As DtsTransaction) As DTSExecResult
' While a task is not executing it is suspended.
' Now that we are executing,
' change to not suspended.
ChangeEvent(m_suspended, False)
' Check for a suspend before doing any work,
' in case the suspend and execute calls
' were initiated at virtually the same time.
CheckAndSuspend()
CheckAndFireBreakpoint(componentEvents, 1)
End Function
Private Sub CheckAndSuspend()
' Loop until we can execute.
' The loop is required rather than a simple if
' because there is a time between the return from WaitOne and the
' reset that we might receive another Suspend call.
' Suspend() will see that we are suspended
' and return. So we need to rewait.
Do While Not m_canExecute.WaitOne(0, False)
ChangeEvent(m_suspended, True)
m_canExecute.WaitOne()
ChangeEvent(m_suspended, False)
Loop
End Sub
Private Sub CheckAndFireBreakpoint(ByVal events As IDTSComponentEvents, _
ByVal breakpointID As Integer)
' If the breakpoint is enabled, fire it.
If m_debugMode <> 0 AndAlso Me.bpm.IsBreakpointTargetEnabled(breakpointID) Then
' Enter a suspend mode before firing the breakpoint.
' Firing the breakpoint will cause the runtime
' to call Suspend on this task.
' Because we are blocked on the breakpoint,
' we are suspended.
ChangeEvent(m_suspended, True)
events.OnBreakpointHit(Me.bpm.GetBreakpointTarget(breakpointID))
ChangeEvent(m_suspended, False)
End If
' Check for a suspension for two reasons:
' 1. If we are at a point where we could fire a breakpoint,
' we are at a valid suspend point. Even if we didn't hit a
' breakpoint, the runtime may have called suspend,
' so check for it.
' 2. Between the return from OnBreakpointHit
' and the reset of the event, it is possible to have
' received a suspend call from which we returned because
' we were already suspended. We need to be sure it is okay
' to continue executing now.
CheckAndSuspend()
End Sub
Shared Sub ChangeEvent(ByVal e As ManualResetEvent, ByVal shouldSet As Boolean)
Dim succeeded As Boolean
If shouldSet Then
succeeded = e.Set()
Else
succeeded = e.Reset()
End If
If (Not succeeded) Then
Throw New Exception("Synchronization object failed.")
End If
End Sub
Public Property SuspendRequired() As Boolean
Get
Return m_suspendRequired <> 0
End Get
Set
' This lock is also taken by Suspend().
' Because it is possible for the package to be
' suspended and resumed in quick succession,
' this property might be set before
' the actual Suspend() call.
' Without the lock, the Suspend() might reset the canExecute
' event after we set it to abort the suspension.
SyncLock Me
Interlocked.Exchange(m_suspendRequired,IIf(Value, 1, 0))
If (Not Value) Then
ResumeExecution()
End If
End SyncLock
End Set
End Property
Public Sub ResumeExecution()
ChangeEvent(m_canExecute,True)
End Sub
Public Sub Suspend()
' This lock is also taken by the set SuspendRequired method.
' It prevents this call from overriding an
' aborted suspension. See comments in set SuspendRequired.
SyncLock Me
' If a Suspend is required, do it.
If m_suspendRequired <> 0 Then
ChangeEvent(m_canExecute, False)
End If
End SyncLock
' We can't return from Suspend until the task is "suspended".
' This can happen one of two ways:
' the m_suspended event occurs, indicating that the execute thread
' has suspended, or the canExecute flag is set,
' indicating that a suspend is no longer required.
Dim suspendOperationComplete As WaitHandle() = {m_suspended, m_canExecute}
WaitHandle.WaitAny(suspendOperationComplete)
End Sub