Contratos de flujo de trabajo y de actividad - AWS Flow Framework para Java

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

Contratos de flujo de trabajo y de actividad

Las interfaces de Java se usan para declarar las firmas de flujos de trabajo y de actividades. La interfaz forma el contrato entre la implementación de flujo de trabajo (o actividad) y el cliente de ese flujo de trabajo (o actividad). Por ejemplo, un tipo de flujo de trabajo MyWorkflow se define mediante el uso de una interfaz con la anotación @Workflow:

@Workflow @WorkflowRegistrationOptions( defaultExecutionStartToCloseTimeoutSeconds = 60, defaultTaskStartToCloseTimeoutSeconds = 10) public interface MyWorkflow { @Execute(version = "1.0") void startMyWF(int a, String b); @Signal void signal1(int a, int b, String c); @GetState MyWorkflowState getState(); }

El contrato no tiene ajustes específicos de la implementación. Este uso de contratos neutros de implementación permite desacoplar a los clientes de la implementación y proporciona, por tanto, la flexibilidad para cambiar los detalles de la implementación sin que afecte al cliente. Y viceversa, también puede cambiar el cliente si tener que hacer cambios en el flujo de trabajo o en la actividad que se está consumiendo. Por ejemplo, el cliente puede modificarse para llamar a una actividad de manera asíncrona utilizando promesas (Promise<T>) sin que haya que cambiar la implementación de la actividad. Del mismo modo, la implementación de la actividad puede cambiarse para que la complete de manera asíncrona, por ejemplo, una persona que envía un correo, sin que haya que cambiar los clientes de la actividad.

En el ejemplo de arriba, la interfaz de flujo de trabajo MyWorkflow contiene un método, startMyWF, para comenzar una ejecución nueva. Este método se anota con la anotación @Execute y tiene que tener un tipo de retorno de void o Promise<>. En una interfaz de flujo de trabajo dada, es posible anotar como mucho un método con esta anotación. Este método es el punto de entrada de la lógica del flujo de trabajo y el marco de trabajo llama a este método para ejecutar la lógica del flujo de trabajo cuando se recibe una tarea de decisión.

La interfaz de flujo de trabajo también define las señales que pueden enviarse al flujo de trabajo. El método de la señal se invoca cuando la ejecución del flujo de trabajo recibe una señal con un nombre que coincide. Por ejemplo, la interfaz MyWorkflow declara un método de señal, signal1, anotado con la anotación @Signal.

La anotación @Signal es obligatoria en los métodos de señal. El tipo de retorno de un método de señal debe ser void. Una interfaz de flujo de trabajo puede tener cero o más métodos de señal definidos en ella. Puede declarar una interfaz de flujo de trabajo si un método @Execute y algunos métodos @Signal para generar clientes que no pueden comenzar su ejecución pero pueden enviar señales a ejecuciones en curso.

Los métodos con anotaciones @Execute y @Signal pueden tener cualquier número de parámetros de cualquier tipo distintos de Promise<T> o sus derivados. Esto le permite pasar entradas con establecimiento inflexible a una ejecución de flujo de trabajo al principio y durante su ejecución. El tipo de retorno del método @Execute debe ser void o Promise<>.

Además, también puede declarar un método en la interfaz de flujo de trabajo para informar el último estado de una ejecución de flujo de trabajo, por ejemplo, el método getState en el ejemplo anterior. Este estado no es el estado completo de la aplicación del flujo de trabajo. El uso previsto de esta característica es permitirle que almacene hasta 32 KB de datos para indicar el último estado de la ejecución. Por ejemplo, en un flujo de trabajo de procesamiento de pedidos, puede almacenar una cadena que indica que se ha recibido, procesado o cancelado el pedido. El marco de trabajo llama a este método siempre que se completa una tarea de decisión para obtener el último estado. El estado se almacena en Amazon Simple Workflow Service (Amazon SWF) y puede recuperarse mediante el cliente externo generado. Esto le permite comprobar el último estado de una ejecución de flujo de trabajo. Los métodos anotados con @GetState no deben usar ningún argumento y no deben tener un tipo de retorno de void. Puede devolver cualquier tipo, que se ajuste a sus necesidades, de este método. En el ejemplo anterior, un objeto de MyWorkflowState (consulte la definición a continuación) es devuelto por el método utilizado para almacenar un estado de cadena y un porcentaje numérico completo. Se espera que este método realice acceso de solo lectura del objeto de implementación de flujo de trabajo y se invoque de manera síncrona, lo que no permite el uso de cualquier operación asíncrona como la llamada de métodos anotados con @Asynchronous. Como máximo, puede anotarse un método en una interfaz de flujo de trabajo con la anotación @GetState.

public class MyWorkflowState { public String status; public int percentComplete; }

Del mismo modo, se define un conjunto de actividades mediante una interfaz con la anotación @Activities. Cada método de la interfaz se corresponde con una actividad, por ejemplo:

@Activities(version = "1.0") @ActivityRegistrationOptions( defaultTaskScheduleToStartTimeoutSeconds = 300, defaultTaskStartToCloseTimeoutSeconds = 3600) public interface MyActivities { // Overrides values from annotation found on the interface @ActivityRegistrationOptions(description = "This is a sample activity", defaultTaskScheduleToStartTimeoutSeconds = 100, defaultTaskStartToCloseTimeoutSeconds = 60) int activity1(); void activity2(int a); }

La interfaz le permite agrupar un conjunto de actividades relacionadas. Puede definir cualquier número de actividades dentro de una interfaz de actividades y puede definir tantas interfaces de actividades como quiera. De manera parecida a los métodos @Execute y @Signal, los métodos de actividad pueden aceptar cualquier número de argumentos de cualquier tipo distintos de Promise<T> o sus derivados. El tipo de retorno de una actividad no debe ser Promise<T> o sus derivados.