Aggiunta di una nuova versione di un flusso di lavoro o di un'attività personalizzata in Gestione flusso di lavoro 1.0

 

Durante lo sviluppo dei flussi di lavoro può essere necessario modificare la definizione di un'attività a causa di un bug che deve essere corretto o della variazione dei requisiti aziendali.In entrambi i casi, è possibile creare una nuova revisione della definizione di attività o di flusso di lavoro pubblicata in precedenza.Di seguito viene presentata una panoramica delle funzionalità di controllo delle versioni offerte da Progettazione flussi di lavoro 1.0 e delle possibili applicazioni a scenari reali.

Con Progettazione flussi di lavoro 1.0 è possibile aggiornare le proprie definizioni di attività e flusso di lavoro.Anche se si sta semplicemente aggiornando una definizione di attività o flusso di lavoro, l'operazione può attivare un meccanismo di revisione interno.Ad esempio, per correggere un bug presente nell'attività LoanProcessing usata dal flusso di lavoro EligibilityCheck, è sufficiente aggiornare l'attività EligibilityCheck con la nuova definizione.È tuttavia opportuno considerare l'effetto prodotto dall'operazione sui flussi di lavoro esistenti che fanno riferimento a tale attivitàe chiedersi se dovranno usare la vecchia definizione o quella nuovae quale implementazione verrà usata dalle istanze esistentie da quelle nuove.

Analogamente, il flusso di lavoro LoanProcessing può essere aggiornato in modo da includere un passaggio di approvazione aggiuntivo per prestiti superiori ai 500.000 euro.Anche in questo caso sarà opportuno interrogarsi riguardo all'effetto prodotto sulle istanze esistenti,chiedersi se dovranno usare la vecchia definizione o quella nuovae quale versione verrà usata dalle nuove istanze.

In questo argomento viene descritto come implementare questi scenari e viene presentata una panoramica delle funzionalità di controllo delle versioni in Progettazione flussi di lavoro 1.0.

Verrà ora esaminato uno scenario di revisione di un flusso di lavoro.Si supponga di avere un flusso di lavoro denominato LoanProcessing.LoanProcessing contiene un'attività EligibilityCheck.L'attività EligibilityCheck e il flusso di lavoro LoanProcessing sono stati già pubblicati in Progettazione flussi di lavoro 1.0.È ora necessario eseguire una revisione del flusso di lavoro LoanProcessing per correggere un bug nella logica del flusso di lavoro.Dopo aver eseguito le modifiche necessarie, è possibile chiamare il metodo PublishWorkflow nella classe WorkflowResourceManager oppure usare HTTP PUT sulla risorsa del flusso di lavoro se si chiama direttamente l'API REST.Come parte dell'operazione, Progettazione flussi di lavoro 1.0 crea internamente una nuova versione del flusso di lavoro corrente con la definizione passata durante la chiamata.A seconda della natura della correzione del bug, è possibile terminare le istanze esistenti, che usano la definizione precedente, o continuare a consentirne l'esecuzione con la definizione meno recente con la quale sono state avviate.Per pubblicare un flusso di lavoro, è possibile usare il metodo PublishWorkflow.Nel seguente esempio viene pubblicato il flusso di lavoro LoanProcessing che usa l'attività EligibilityCheck come implementazione.

WorkflowDescription wfDesc = new WorkflowDescription();
wfDesc.Name = "LoanProcessing";
wfDesc.ActivityPath = "EligibilityCheck";
Uri wfUri = client.Workflows.Publish(wfDesc);

Se si decide di terminare le istanze esistenti, è possibile chiamare il metodo PublishWorkflow con terminateActiveInstances impostato su true.Se false viene impostato su PublishWorkflow o se viene chiamato l'overload del metodo terminateActiveInstances che non contiene un parametro di questo tipo, che specifica internamente un valore false, l'esecuzione delle istanze esistenti continuerà in base alla definizione con la quale sono state create.Questa procedura è appropriata per scenari in cui la correzione dei bug è di natura incrementale.Se ad esempio è presente una variazione in LoanProcessingWorkflow che però deve diventare operativa solo per l'applicazione di nuovi prestiti, e se le applicazioni di prestito esistenti possono usare la versione precedente del processo, ovvero quella comunicata ai clienti esistenti del prestito, è possibile impostare terminateActiveInstances su false.Nell'esempio precedente è stato chiamato l'overload di PublishWorkflow che non accettava un parametro terminateActiveInstances e di conseguenza le istanze esistenti non sono state terminate.

Se la correzione dei bug è indispensabile e si desidera terminare le istanze esistenti, ad esempio il flusso di lavoro relativo all'elaborazione dei prestiti ha accidentalmente approvato tutte le applicazioni, è possibile aggiornare la definizione con terminateActiveInstances impostato su true.Poiché il processo di terminazione delle istanze attive è asincrono, quindi non necessariamente istantaneo, è possibile che l'esecuzione di una o più istanze continui finché non verranno terminate.Anche se si dispone di più revisioni del flusso di lavoro, per la creazione di nuove istanze viene usata solo l'ultima versione.Analogamente, quando si esegue una chiamata GetWorkflow per il flusso di lavoro corrente, è possibile visualizzare solo l'ultima definizione del flusso di lavoro.

Si supponga di estendere il precedente esempio di processo di approvazione del prestito all'esecuzione di una revisione dell'attività EligibilityCheck nel caso di una modifica di un requisito aziendale.Sono state apportate le modifiche necessarie all'attività corrente e si desidera pubblicare la nuova definizione per EligibilityCheck.Per eseguire questa operazione, è possibile chiamare il metodo PublishActivity sul client o HTTP PUT con l'URI risorsa dell'attività.In seguito alla chiamata, tutte le attività e tutti i flussi di lavoro che usano direttamente o indirettamente questa attività verranno aggiornati internamente in modo da usare una nuova versione e le nuove istanze dei flussi di lavoro che usano direttamente o indirettamente questa attività inizieranno a usare la nuova definizione.

È possibile terminare le istanze attive esistenti non solo aggiornando un flusso di lavoro, ma anche aggiornando un'attività.Questa operazione può avere tuttavia un impatto molto più forte sul sistema.È necessario infatti ricordare che i flussi di lavoro possono fare riferimento ad almeno una attività e le attività possono a loro volta fare riferimento a zero o più attività.A una particolare attività possono quindi fare riferimento zero o più attività, alle quali possono fare riferimento zero o più flussi di lavoro.Questo significa che a una particolare attività possono fare riferimento, direttamente o indirettamente, molte definizioni di flussi di lavoro.

Per l'aggiornamento di un'attività è necessario effettuare la stessa scelta richiesta per l'aggiornamento di un flusso di lavoro.È possibile terminare tutte le istanze di tutti i flussi di lavoro che dipendono dall'attività come parte dell'operazione di aggiornamento oppure è possibile continuarne l'esecuzione con la precedente definizione di attività.Il comportamento è determinato dal parametro terminateDependentInstances.Se viene chiamato l'overload che non accetta un parametro terminateDependentInstances, le istanze dipendenti non vengono terminate e useranno la versione precedente dell'attività.Nell'esempio seguente viene pubblicata un'istanza di TestActivity e le istanze dipendenti non vengono terminate.

Activity newActivity = new Sequence
{
     ...
};

XElement activityXaml = XElement.Parse(XamlServices.Save(newActivity));

ActivityDescription activityDesc = new ActivityDescription();
activityDesc.SetXaml(activityXaml);

activityDesc.Name = "TestActivity";
client.Activities.Publish(activityDesc);

Quando viene aggiornata una definizione di attività esistente, Progettazione flussi di lavoro 1.0 effettua le seguenti operazioni:

  1. Crea una nuova versione dell'attività usando le informazioni specificate.

  2. Aggiorna tutte le definizioni di flusso di lavoro che fanno riferimento all'attività di modo da usare la nuova versione dell'attività.

  3. Se la chiamata è stata eseguita con terminateDependentInstances impostato su true, tutte le istanze di tutti i flussi di lavoro che fanno riferimento all'attività verranno terminate.

System_CAPS_noteNota

Il primo passaggio dell'elenco precedente viene eseguito in modo sincrono come parte della chiamata per l'aggiornamento della definizione di attività, pertanto i passaggi successivi vengono eseguiti in modo asincrono.Di conseguenza, anche se una particolare attività è stata aggiornata, l'applicazione di tale modifica a tutti i flussi di lavoro che fanno riferimento all'attività può richiedere alcuni minuti.È possibile che nel frattempo i flussi di lavoro usino la definizione precedente.Una volta completato questo processo asincrono, tutti i flussi di lavoro che fanno riferimento all'attività useranno tuttavia la nuova versione dell'attività.

System_CAPS_noteNota

Anche se si dispone di più revisioni di un'attività, solo una di esse è attiva in qualsiasi momento.Le altre revisioni vengono mantenute internamente per il supporto delle istanze esistenti dei flussi di lavoro che fanno riferimento all'attività.Quando si esegue una chiamata Get per l'attività, è quindi possibile visualizzarne solo l'ultima definizione.

In alcune situazioni può essere necessario eliminare un determinato flusso di lavoro che non è più richiesto.Nel caso del flusso di lavoro LoanProcessing, si supponga che l'organizzazione abbia interrotto l'elaborazione di quel tipo specifico di prestito.È possibile eliminare il flusso di lavoro per assicurarsi che non venga attivata accidentalmente alcuna istanza.Per eliminare un flusso di lavoro, è possibile chiamare il metodo DeleteWorkflow usando l'API client oppure chiamare DELETE sull'endpoint REST con l'URI della risorsa di Workflow.Quando viene eliminato un flusso di lavoro, è possibile scegliere fra due alternative in merito alle istanze esistenti.Se si è deciso di consentire il completamento dell'elaborazione dei prestiti esistenti ma di non consentire nuove istanze, è possibile chiamare il seguente metodo Delete su WorkflowManager.

public void Delete(string workflowName)

Questo overload non terminerà le istanze esistenti,che continueranno a essere elaborate fino al completamento.Non verranno tuttavia create nuove istanze, poiché il flusso di lavoro non esiste.Qualsiasi messaggio inviato per attivare nuove istanze del flusso di lavoro corrente non darà quindi luogo all'attivazione di un'istanza del flusso di lavoro.Se invece si è deciso di terminare anche le applicazioni di prestito esistenti, è possibile eseguire l'overload di Delete che usa il parametro terminateActiveInstances e lo imposta su true.

public void Delete(string workflowName, bool terminateActiveInstances)

In questo modo verrà impedito l'avvio di nuove istanze e verranno terminate le istanze in esecuzione.

In rari casi può essere necessario eliminare anche le attività.Come nel caso dell'aggiornamento di attività, più flussi di lavoro possono direttamente o indirettamente fare riferimento all'attività e quindi essere interessati dalla relativa eliminazione.È possibile eliminare un'attività mediante il metodo Delete nell'API client o chiamando DELETE sull'endpoint REST con l'URI della risorsa dell'attività.Anche in questo caso è possibile scegliere fra due alternative riguardo alle istanze esistenti dei flussi di lavoro che fanno riferimento all'attività.Se si desidera continuare a consentire l'esecuzione delle istanze esistenti che fanno riferimento direttamente o indirettamente all'attività, è possibile chiamare l'overload del metodo Delete su ActivityManager che non usa un parametro terminateDependentInstances, altrimenti è possibile chiamare l'overload che usa questo parametro e impostarlo su false.

public void Delete(string activityName)

Questo overload non terminerà le istanze esistenti dei flussi di lavoro che fanno riferimento all'attività.Non verranno tuttavia create nuove istanze dei flussi di lavoro che fanno riferimento all'attività, poiché per le nuove istanze l'attività non esiste più.Il runtime genererà quindi eccezioni nel registro in cui è indicato che non è possibile calcolare completamente l'XAML del flusso di lavoro poiché una delle attività non è presente.

Si noti la differenza di comportamento fra l'eliminazione di un'attività e l'eliminazione di un flusso di lavoro.Quando viene eliminato un flusso di lavoro, i messaggi per l'attivazione di un'istanza del flusso di lavoro verranno semplicemente ignorati.Quando viene eliminata un'attività, invece, le definizioni di flusso di lavoro che fanno riferimento all'attività non verranno eliminate,ma continueranno a esistere e tenteranno di elaborare i messaggi appartenenti a tali definizioni.Non essendo tuttavia in grado di individuare l'attività da eseguire, genereranno un'eccezione e termineranno l'istanza.Di conseguenza, anche se una determinata attività è stata eliminata, la definizione di flusso di lavoro è ancora disponibile.Dopo la modifica della logica della definizione di flusso di lavoro, in modo da non usare l'attività eliminata, le nuove istanze verranno eseguite correttamente.Se si decide di terminare le istanze esistenti al momento dell'eliminazione di un'attività, è possibile chiamare Delete e impostare terminateDependentInstances su true.In questo modo anche le istanze esistenti dei flussi di lavoro che fanno riferimento all'attività verranno terminate.

public void Delete(string activityName, bool terminateDependentInstances)
Mostra: