6

Tengo un servicio de seguimiento personalizado que se ha estado ejecutando desde hace un tiempo con más de 1500 flujos de trabajo en tiempo continuo, ahora estoy en el proceso de versionar los flujos de trabajo para poder liberar algunas solicitudes de cambio.WF Custom SQL Tracking Service detenido ¿Trabajó para flujos de trabajo antiguos?

Desafortunadamente, el sistema no se implementó inicialmente con ensamblajes fuertemente tipados, por lo que estoy en el proceso de ordenar este desastre.

Estoy teniendo que usar una combinación de SerializationBinder personalizado para traducir PublicKeyToken = null a mi nuevo PublicKeyToken, y un delegado AppDomain_AssemblyResolve para ayudar a apuntar el host a los ensamblajes ahora fuertemente tipados - Referenced here.

También he tenido que sustituir el contenido de las filas relacionadas en la tabla [Tipo] que viene con el SqlTrackingService por defecto para hacer referencia a la nueva PublicKeyToken, por lo que:

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

se sustituye por:

some.namespace.foobar, Version=1.0.0.0, Culture=neutral, PublicKeyToken=123456789acb 

Parecía que estaba haciendo un buen progreso; sin embargo, cuando cambio mi flujo de trabajo de State Machine, el servicio de seguimiento personalizado que agregué como servicio ya no funciona para los flujos de trabajo de la versión 1.0.0.0, pero funciona para los recién creados flujos de trabajo de la versión 2.0.0.0.

Nota: El SqlTrackingService predeterminado sigue funcionando bien en ambas versiones del flujo de trabajo, esto es solo un problema con el servicio de seguimiento personalizado en los flujos de trabajo persistentes existentes.

el servicio de seguimiento personalizado siempre ha sido añadido a través de la app.config así:

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

Cualquier ideas sobre qué más tengo que cambiar para conseguir este trabajo para los flujos de trabajo ya existentes?

Según lo solicitado, aquí está el servicio de seguimiento personalizado, aunque el problema es hacer con el host "vinculando" el servicio de seguimiento personalizado, no el servicio de seguimiento en sí mismo. Lo sé porque en el caso donde el servicio de seguimiento personalizado no está 't disparado, ninguno de los métodos, incluido el constructor se llama.

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

La etiqueta 'assembly' es para programación de bajo nivel, no para ensamblados .NET. – harold

+0

Gracias, corrigió el error tipográfico. – Tr1stan

+0

Difícil de ver sin ver más de su servicio de seguimiento personalizado. –

Respuesta

0

Resulta que el paso final es fácil. El problema es un error en WF y microsoft have outlined the answer here.

Es, básicamente, tiene que adornar su clase de servicio de seguimiento personalizado con un atributo que le permite resolver referencias de servicios de seguimiento anterior, así:

[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 
     } 

bajo y contemplar, mis flujos de trabajo previamente persistido ahora resolver la nueva versión del servicio de seguimiento.

Cuestiones relacionadas