6

Ho un servizio di tracciamento personalizzato che è in esecuzione da un po 'ora con oltre 1500 flussi di lavoro in tempo reale che scorrono, sono ora in fase di controllo dei flussi di lavoro in modo da poter rilasciare alcune richieste di modifica.Servizio di tracciamento personalizzato SQL WF Interrotto il lavoro per i vecchi flussi di lavoro?

Sfortunatamente il sistema non è stato inizialmente distribuito con assembly fortemente tipizzati, quindi sono in procinto di ordinare questo caos.

Sto dover utilizzare una miscela di un SerializationBinder personalizzato per tradurre il PublicKeyToken = null al mio nuovo PublicKeyToken, e un delegato AppDomain_AssemblyResolve per contribuire a puntare l'host per le assemblee ora fortemente tipizzati - Referenced here.

Ho avuto anche per sostituire il contenuto dei relativi file all'interno del [Tipo] tabella che viene fornito con lo SqlTrackingService di default per fare riferimento alla nuova PublicKeyToken, quindi:

some.namespace.foobar, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null 

è sostituito con:

Mi sembra che stia facendo dei buoni progressi, tuttavia quando passo il flusso di lavoro della mia macchina di stato, il servizio di tracciamento personalizzato che ho aggiunto come servizio non spara più per i flussi di lavoro della versione 1.0.0.0, ma sta funzionando per la nuova creazione flussi di lavoro della versione 2.0.0.0.

Nota: SqlTrackingService è ancora in esecuzione correttamente su entrambe le versioni del flusso di lavoro, questo è solo un problema con il servizio di tracciamento personalizzato sui flussi di lavoro persistenti esistenti.

il servizio di monitoraggio personalizzato è sempre stato aggiunto attraverso l'app.config come questo:

<Services> 
     ...other services here... 
     <add type="some.namespace.ActiveStateTrackingService, some.namespace.extensions" assembly="uk.gov.gsi.cma.extensions" /> 
</Services> 

Tutte le idee su che altro ho bisogno di cambiare per ottenere questo lavoro per i flussi di lavoro già esistenti?

Come richiesto, ecco il servizio di tracciamento personalizzato, sebbene il problema riguardi l'host che "associa" il servizio di tracciamento personalizzato, non il servizio di tracciamento stesso - Lo so perché nell'istanza in cui il servizio di tracciamento personalizzato non è licenziato, nessuno dei metodi, incluso il costruttore, viene chiamato.

public class ActiveStateTrackingService : TrackingService 
{ 
    protected override TrackingProfile GetProfile(Guid workflowInstanceId) 
    { 
     return GetDefaultProfile(); 
    } 

    protected override TrackingProfile GetProfile(Type workflowType, Version profileVersionId) 
    { 
     return GetDefaultProfile(); 
    } 

    protected override TrackingChannel GetTrackingChannel(TrackingParameters parameters) 
    { 
     return new ActiveStateTrackingChannel(parameters); 
    } 

    protected override bool TryGetProfile(Type workflowType, out TrackingProfile profile) 
    { 
     profile = GetDefaultProfile(); 
     return true; 
    } 

    protected override bool TryReloadProfile(Type workflowType, Guid workflowInstanceId, out TrackingProfile profile) 
    { 
     profile = null; 
     return false; 
    } 

    private TrackingProfile GetDefaultProfile() 
    { 
     TrackingProfile profile = new TrackingProfile(); 
     profile.Version = new Version(1, 0); 

     // Add tracking point for state activity executing 
     ActivityTrackPoint statePoint = new ActivityTrackPoint(); 
     ActivityTrackingLocation location = new ActivityTrackingLocation(typeof(StateActivity), new ActivityExecutionStatus[] { ActivityExecutionStatus.Executing }); 
     statePoint.MatchingLocations.Add(location); 
     profile.ActivityTrackPoints.Add(statePoint); 

     return profile; 
    } 
} 

public class ActiveStateTrackingChannel : TrackingChannel 
{ 

    private TrackingParameters param; 

    public ActiveStateTrackingChannel(TrackingParameters parameters) 
    { 
     param = parameters; 
    } 

    protected override void InstanceCompletedOrTerminated() 
    { 
     return; 
    } 

    protected override void Send(TrackingRecord record) 
    { 

     // get the tracking record and write out the name of the state. 
     var r = record as ActivityTrackingRecord; 

     if (r != null) 
      if (!string.IsNullOrEmpty(r.QualifiedName)) 
      { 
       using (ICaseService caseService = new CaseService()) 
        { 
         SomeServiceLayer.UpdateCurrentStateOutsideOfTheWorkflow(param.ContextGuid, r.ParentContextGuid, r.QualifiedName); 
         Console.WriteLine("*** Current State: {0} ***", r.QualifiedName); 
        } 
      }      
    } 
} 
+0

Il tag 'assembly' è per la programmazione di basso livello, non per gli assembly .NET. – harold

+0

Grazie, corretto l'errore di battitura. – Tr1stan

+0

Difficile da dire senza vedere altro del servizio di tracciamento personalizzato. –

risposta

0

Si scopre che il passaggio finale è facile. Il problema è un bug in WF e microsoft have outlined the answer here.

Hai sostanzialmente per decorare la vostra classe di servizio di monitoraggio personalizzato con un attributo che consente di risolvere i vecchi riferimenti di servizi di monitoraggio, in questo modo:

[System.Workflow.Runtime.Tracking.PreviousTrackingService("myNamespace.Workflow.StateMachineTrackingService, myNamespace.Workflow.StateMachineTracking, Version=1.2.0.1, Culture=neutral, PublicKeyToken=gr4b2191f58h9e0d")] 
public class StateMachineTrackingService : TrackingService 
     { 
     //Body of your custom tracking service here 
     } 

Basso ed ecco, i miei flussi di lavoro in precedenza persistito ora risolvere la nuova versione del servizio di tracciamento.