Share via


Agregar una nueva versión de un flujo de trabajo o actividad personalizada en Workflow Manager 1.0

 

A la hora de desarrollar sus flujos de trabajo, puede que, en ciertas ocasiones, tenga que cambiar la definición de una actividad debido a un error que debe solucionarse o debido a un cambio en los requisitos del negocio.En cualquiera de los dos casos, igual quiere crear una nueva revisión de la definición de la actividad o de la definición del flujo de trabajo que había publicado.En este tema se ofrece información general sobre las capacidades de control de versiones de Workflow Manager 1.0 y sobre cómo se aplican dichas capacidades en los escenarios.

Información general sobre el control de versiones de los flujos de trabajo

Workflow Manager 1.0 permite actualizar las definiciones de actividades y flujos de trabajo.Una sencilla actualización de la definición de una actividad o flujo de trabajo puede activar un mecanismo de control de versiones interno.Por ejemplo, si cuenta con el fujo de trabajo LoanProcessing que usa una actividad EligibilityCheck y quiere solucionar un error de la actividad EligibilityCheck, solo tiene que actualizar la actividad con la nueva definición.¿Pero, qué ocurre con los flujos de trabajo existentes que hacen referencia a esa actividad?¿Qué definición deben usar? ¿La nueva o la anterior?¿Qué implementación deben usar las instancias existentes?¿Qué implementación deben usar las nuevas instancias?

Del mismo modo, igual quiere actualizar el flujo de trabajo LoanProcessing para incluir otro paso para la aprobación de préstamos superiores a 500.000 $.Incluso en este caso, tendría preguntas como estas: ¿qué ocurriría con las instancias existentes?¿Usarán la nueva definición o la antigua?¿Qué versión usarán las nuevas instancias?

En las diferentes secciones de este tema se explica cómo implementar los escenarios y se proporciona información general sobre las funciones de control de versiones de Workflow Manager 1.0.

Revisiones del flujo de trabajo

Echemos un vistazo a un escenario de revisión de un flujo de trabajo.Usted tiene un flujo de trabajo llamado LoanProcessing.LoanProcessing contiene una actividad EligibilityCheck.Ya ha publicado la actividad EligibilityCheck y el flujo de trabajo LoanProcessing en Workflow Manager 1.0.Ahora, tiene que hacer una revisión del flujo de trabajo LoanProcessing para arreglar un error en su lógica.Después de realizar los cambios necesarios, puede llamar al método PublishWorkflow de clase WorkflowResourceManager (o, si está llamando a la API de REST directamente, usar HTTP PUT en el recurso del flujo de trabajo).Como parte de esta operación, Workflow Manager 1.0 crea de manera interna una nueva versión del flujo de trabajo y pasa la definición como parte de la llamada.Dependiendo de la naturaleza de la solución de errores, tiene la opción de terminar con las instancias existentes (que usan la definición antigua) o de permitir que sigan ejecutándose con la definición antigua, con la cual se iniciaron.Para publicar un flujo de trabajo, puede usar el método PublishWorkflow.En el siguiente ejemplo, se publica el flujo de trabajo LoanProcessing que usa la actividad EligibilityCheck como implementación.

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

Si decide terminar con las instancias existentes, puede llamar al método PublishWorkflow con terminateActiveInstances establecido en la llamada true.Si establece false o llama a una sobrecarga del método PublishWorkflow que no tenga un parámetro terminateActiveInstances que especifique internamente el valor false, las instancias existentes seguirán ejecutándose con la definición con la que se iniciaron.Esto es recomendable en los escenarios en los que la resolución de errores es incremental por naturaleza.Por ejemplo, si se realiza un cambio en el flujo de trabajo LoanProcessingWorkflow, pero el cambio solo debe afectar a las nuevas solicitudes de préstamos y las solicitudes existentes están bien como están (ya que eso es lo que se les ha comunicado a los clientes de préstamos existentes), puede establecer terminateActiveInstances como false.En el ejemplo anterior, se llamaba a la sobrecarga del método PublishWorkflow que no contenía ningún parámetro terminateActiveInstances, de tal manera que no se terminaba con las instancias existentes.

Si la resolución de errores es crítica y desea terminar con las instancias existentes (por ejemplo, si el flujo de trabajo de procesamiento de préstamos aprueba todas las solicitudes accidentalmente), puede actualizar la definición con el método terminateActiveInstances establecido en true.El proceso de terminar con las instancias activas es asincrónico, es decir, no se garantiza que sea instantáneo. Por lo tanto, existe la posibilidad de que ciertas instancias sigan ejecutándose hasta que terminen definitivamente.Tenga en cuenta que, aunque tenga varias revisiones del flujo de trabajo, solo se usará la última versión para crear instancias.Del mismo modo, cuando realiza una llamada GetWorkflow a este flujo de trabajo, solo verá la última definición del flujo de trabajo.

Revisiones de las actividades

Siguiendo con el mismo ejemplo del proceso de aprobación del préstamo mencionado anteriormente, supongamos que tiene que hacer una revisión de la actividad EligibilityCheck para que refleje el cambio de un requisito del negocio.Ha realizado los cambios necesarios en la actividad y ahora quiere publicar la nueva definición de EligibilityCheck.Para ello, puede llamar al método PublishActivity del cliente (o al HTTP PUT con la URI del Recurso de la actividad).Como resultado de esta llamada, todas las actividades y flujos de trabajo que usan esta actividad (directa o indirectamente) se actualizarán de manera interna y empezarán a usar la nueva versión, y las instancias nuevas de los flujos de trabajo que usan esta definición (directa o indirectamente) también empezarán a usar la nueva definición.

Del mismo modo que puede actualizar un flujo de trabajo y terminar con las instancias activas existentes, puede hacer algo similar mientras actualiza una actividad.Sin embargo, esta opción puede tener un mayor impacto en el sistema.En otras palabras, tenemos que asegurar que los flujos de trabajo pueden hacer referencia a actividades (por lo menos a una) y que las actividades, en cambio, pueden hacer referencia a cero o más actividades.Así, una actividad puede estar referenciada por ninguna o alguna actividad y esta última puede estar referenciada por ningún o algún flujo de trabajo.Esto quiere decir que una actividad puede estar referenciada por diversas definiciones de flujos de trabajo, directa o indirectamente.

Cuando actualiza una actividad, tiene que tomar la misma decisión que cuando actualiza un flujo de trabajo:¿debe terminarse con todas las instancias de flujos de trabajo (que dependen de la actividad) como parte de la operación de actualización o deben seguir ejecutándose con la antigua definición de la actividad?Este comportamiento lo determina el parámetro terminateDependentInstances.Si llama a una sobrecarga que contiene un parámetro terminateDependentInstances, no se terminará con las instancias dependientes y estas usarán una versión antigua de la actividad.En el siguiente ejemplo, se publica un TestActivity y no se termina con las instancias dependientes.

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);

Cuando se actualiza la definición de una actividad existente, Workflow Manager 1.0:

  1. Crea otra versión de la actividad con la información proporcionada.

  2. Actualiza todas las definiciones de flujo de trabajo que hacen referencia a esta actividad para que usen la nueva versión.

  3. Si la llamada se realizó con terminateDependentInstances establecido en true, todas las instancias de los flujos de trabajo que hacen referencia a esta actividad terminarán.

Nota

En la lista anterior, el primer paso se realiza en sincronía como parte de la llamada para actualizar la definición de la actividad y el resto de los pasos se realizan asincrónicamente.Esto quiere decir que, a pesar de que haya actualizado una actividad correctamente, los cambios pueden tardar un poco (unos pocos minutos) en aplicarse a todos los flujos de trabajo que hacen referencia a esta actividad.Así que, mientras tanto, existe la posibilidad de que estos flujos de trabajo usen la definición antigua.No obstante, una vez completado dicho proceso asincrónico, todos los flujos de trabajo que hacen referencia a esta actividad usarán la última definición de la actividad.

Nota

Aunque haya realizado diversas revisiones a la actividad, solo hay una versión activa en cada momento.El resto de revisiones se guardan internamente para apoyar a las instancias de flujos de trabajo existentes que hacen referencia a esta actividad.Por lo tanto, cuando realiza una llamada Get a esta actividad, solo verá la última definición de la actividad.

Eliminar flujos de trabajo

Puede que en algún momento quiera eliminar un flujo de trabajo, puesto que no lo necesita más.Supongamos que su organización ha dejado de procesar el tipo de préstamo que se mostraba en el flujo de trabajo LoanProcessing.Puede que quiera eliminar este flujo de trabajo para asegurarse de que no se desencadena ninguna instancia accidentalmente.Para eliminar un flujo de trabajo, puede llamar al método DeleteWorkflow por medio de la API de cliente o llamar a DELETE en el extremo REST con la URI de Recursos del flujo de trabajo.Cuando elimina un flujo de trabajo, existen dos opciones con respecto a las instacias existentes.Si su empresa ha decidido mantener el procesamiento de los préstamos existentes pero no permitir nuevas instancias, puede llamar al método Delete de WorkflowManager.

public void Delete(string workflowName)

Esta sobrecarga no termina con las instancias existentes.Las instancias existentes se seguirán procesando hasta que se completen.No obstante, no se crearán más instancias ya que el flujo de trabajo en sí no existe.Así, los mensajes que envíe para activar instancias del flujo de trabajo, no activarán ninguna instancia.Pero, si su empresa ha decidido terminar también con la aplicación de los préstamos existentes, puede usar la sobrecarga Delete que tiene un parámetro terminateActiveInstances establecido en true.

public void Delete(string workflowName, bool terminateActiveInstances)

Esto evita que se inicien nuevas instancias y termina con las que ya se están ejecutando.

Eliminar actividades

No es muy habitual tener que eliminar también las actividades.Tal y como pasa a la hora de actualizar actividades, muchos flujos de trabajo hacen referencia directa o indirectamente a la actividad y pueden verse afectados si se elimina.Puede eliminar una actividad con el método Delete en la API de Client, o puede llamar a DELETE en el extremo REST con la URI del recurso de la actividad.Aquí, una vez más, tiene dos opciones en lo que se refiere a las instancias de flujos de trabajo existentes que hacen referencia a esta actividad.Si desea permitir que las instancias existentes que hacen referencia directa o indirectamente a esta actividad sigan ejecutándose, puede llamar al método de sobrecarga Delete de ActivityManager que no contiene un parámetro terminateDependentInstances, o puede llamar a la sobrecarga que contiene dicho parámetro establecido en false.

public void Delete(string activityName)

Esta sobrecarga no termina con las instancias de flujos de trabajo existentes que hacen referencia a esta actividad.Sin embargo, no se crearán instancias de flujos de trabajo que hagan referencia a la actividad, puesto que no existe para nuevas instancias.Por lo tanto, el tiempo de ejecución provocará una excepción en el registro, donde se indica que el XAML del flujo de trabajo no pudo computarse completamente puesto que faltaba una actividad.

Tenga en cuenta las diferencias entre eliminar una actividad y eliminar un flujo de trabajo.Cuando se elimina la definición de un flujo de trabajo, los mensajes para activar una instancia del flujo de trabajo sencillamente se ignoran.No obstante, cuando se elimina una actividad no se eliminan las definiciones de flujos de trabajo que hacen referencia a esa actividad.Las definiciones siguen existiendo, por lo que intentarán procesar cualquier mensaje que les pertenezca.Sin embargo, no serán capaces de ubicar la actividad para ejecutarla y, como consecuencia, provocarán una excepción y se terminará la instancia.Esto quiere decir que, a pesar de haber eliminado una actividad, su definición del flujo de trabajo todavía está disponible.Si cambia la lógica de la definición del flujo de trabajo para que no use esta actividad eliminada, las instancias nuevas empezarán a ejecutarse correctamente.Si desea termina con las instancias existentes cuando elimine una actividad, llame al método Delete y establezca terminateDependentInstances en true.Esto garantiza que las instancias de flujos de trabajo existentes que hacen referencia a esta actividad también se terminen.

public void Delete(string activityName, bool terminateDependentInstances)