HelloWorldWorkflow Solicitud - 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.

HelloWorldWorkflow Solicitud

Aunque el HelloWorldejemplo básico está estructurado como un flujo de trabajo, se diferencia de un flujo de trabajo de Amazon SWF en varios aspectos clave:

Aplicaciones de flujo de trabajo convencionales y de Amazon SWF
HelloWorld Flujo de trabajo de Amazon SWF
Se ejecuta de manera local como un solo proceso. Se ejecuta como varios procesos que pueden distribuirse entre varios sistemas, entre los que se incluyen instancias de Amazon EC2, centros de datos privados, equipos cliente, etc. Ni siquiera tienen que ejecutar el mismo sistema operativo.
Las actividades son métodos síncronos, que bloquean hasta que terminan. Las actividades están representadas mediante métodos asíncronos, que se devuelven inmediatamente y permiten que el flujo de trabajo realice otras tareas mientras esperan a que finalice la actividad.
El proceso de trabajo del flujo de trabajo interactúa con el proceso de trabajo de las actividades llamando al método adecuado. Los procesos de trabajo del flujo de trabajo interactúan con los procesos de trabajo de las actividades mediante solicitudes HTTP, donde Amazon SWF actúa de intermediario.
El iniciador del flujo de trabajo interactúa con el proceso de trabajo del flujo de trabajo llamando al método adecuado. Los iniciadores de flujos de trabajo interactúan con los procesos de trabajo de los flujos de trabajo mediante solicitudes HTTP, donde Amazon SWF actúa de intermediario.

Podría implementar una aplicación de flujo de trabajo asíncrono distribuida a partir de cero haciendo, por ejemplo, que el proceso de trabajo del flujo de trabajo interactúe con el proceso de trabajo de actividad directamente a través de llamadas a servicios web. Sin embargo, luego tendrá que implementar todo el código tan complicado que es necesario para administrar la ejecución asíncrona de varias actividades, controlar el flujo de datos, etc. Los SWF AWS Flow Framework para Java y Amazon se ocupan de todos esos detalles, lo que le permite centrarse en la implementación de la lógica empresarial.

HelloWorldWorkflow es una versión modificada HelloWorld que se ejecuta como un flujo de trabajo de Amazon SWF. La siguiente figura resume cómo funcionan las dos aplicaciones.

Versiones convencionales y de Amazon SWF de “Hello World!”

HelloWorld se ejecuta como un proceso único y el iniciador, el trabajador del flujo de trabajo y el trabajador de actividades interactúan mediante llamadas a métodos convencionales. Con HelloWorldWorkflow, el iniciador, el proceso de trabajo del flujo de trabajo y el proceso de trabajo de las actividades son componentes distribuidos que interactúan a través de Amazon SWF mediante solicitudes HTTP. Para gestionar la interacción, Amazon SWF mantiene listas de tareas de actividad y de flujos de trabajo, que envía a los componentes correspondientes. En esta sección se describe cómo funciona el marco para HelloWorldWorkflow.

HelloWorldWorkflow se implementa mediante la API AWS Flow Framework para Java, que gestiona los detalles, a veces complicados, de la interacción con Amazon SWF en segundo plano y simplifica considerablemente el proceso de desarrollo. Puede utilizar el mismo proyecto para el que utilizó HelloWorld, que ya está configurado AWS Flow Framework para las aplicaciones Java. Sin embargo, para ejecutar la aplicación, debe configurar una cuenta de Amazon SWF de la siguiente forma:

  • Crea una AWS cuenta, si aún no la tienes, en Amazon Web Services.

  • Asigne a su cuenta el identificador de acceso y el identificador secreto para las variables de entorno AWS_ACCESS_KEY_ID y AWS_SECRET_KEY, respectivamente. Es recomendable no exponer los valores de las claves literales en el código. Para solucionar este problema, lo más práctico es guardarlas en variables de entorno.

  • Cree una cuenta de Amazon SWF en Amazon Simple Workflow Service.

  • Inicie sesión AWS Management Console y seleccione el servicio Amazon SWF.

  • Elija Administrar dominios en la esquina superior derecha y registre un dominio nuevo de Amazon SWF. Un dominio es un contenedor lógico para los recursos de la aplicación, como tipos de flujo de trabajo y actividad, además de para ejecuciones de flujo de trabajo. Puede usar cualquier nombre de dominio conveniente, pero los tutoriales usan "». helloWorldWalkthrough

Para implementar el HelloWorldWorkflow, cree una copia de HelloWorld. HelloWorld empaquete en el directorio de su proyecto y asígnele el nombre HelloWorld. HelloWorldWorkflow. En las siguientes secciones se describe cómo modificar el HelloWorld código original para usarlo AWS Flow Framework para Java y ejecutarlo como una aplicación de flujo de trabajo de Amazon SWF.

HelloWorldWorkflow Trabajador de actividades

HelloWorld implementó sus actividades como trabajador como una sola clase. Un trabajador de actividades AWS Flow Framework para Java tiene tres componentes básicos:

  • Los métodos de actividad, que realizan las tareas propiamente dichas, se definen en una interfaz y se implementan en una clase relacionada.

  • Una ActivityWorkerclase gestiona la interacción entre los métodos de actividad y Amazon SWF.

  • Una aplicación host de actividades registra e inicia el proceso de trabajo de actividades y se encarga de la limpieza.

En esta sección, se explican los métodos de actividades; las otras dos clases se explicarán más adelante.

HelloWorldWorkflow define la interfaz de actividades de GreeterActivities la siguiente manera:

import com.amazonaws.services.simpleworkflow.flow.annotations.Activities; import com.amazonaws.services.simpleworkflow.flow.annotations.ActivityRegistrationOptions; @ActivityRegistrationOptions(defaultTaskScheduleToStartTimeoutSeconds = 300, defaultTaskStartToCloseTimeoutSeconds = 10) @Activities(version="1.0") public interface GreeterActivities { public String getName(); public String getGreeting(String name); public void say(String what); }

Esta interfaz no era estrictamente necesaria para una aplicación Java HelloWorld, pero sí lo es AWS Flow Framework para una aplicación Java. Fíjese en que la definición de la interfaz en sí no ha cambiado. Sin embargo, debe aplicar dos AWS Flow Framework para las anotaciones de Java @ActivityRegistrationOptions y@Tareas, a la definición de la interfaz. Las anotaciones proporcionan información de configuración e indican al AWS Flow Framework procesador de anotaciones de Java que utilice la definición de la interfaz para generar una clase de cliente de actividades, como se explica más adelante.

@ActivityRegistrationOptionstiene varios valores con nombre que se utilizan para configurar el comportamiento de las actividades. HelloWorldWorkflow especifica dos tiempos de espera:

  • defaultTaskScheduleToStartTimeoutSeconds especifica durante cuánto tiempo pueden estar en cola las tareas en la lista de tareas de actividad y se establece en 300 segundos (5 minutos).

  • defaultTaskStartToCloseTimeoutSeconds especifica el tiempo máximo que puede tardar la actividad en realizar la tarea y se establece en 10 segundos.

Estos tiempos de espera garantizan que la actividad complete su tarea en un tiempo razonable. Si se supera cualquiera de estos tiempos de espera, el marco de trabajo genera un error y el proceso de trabajo de flujo de trabajo debe decidir cómo tratar el problema. Para leer un debate sobre cómo tratar estos errores, consulte Control de errores.

@Activities tiene varios valores, pero normalmente tan solo especifica el número de versión de las actividades, lo que le permite realizar un seguimiento de diferentes generaciones de implementaciones de las actividades. Si cambia una interfaz de actividad después de registrarla con Amazon SWF, lo que incluye cambiar los valores de @ActivityRegistrationOptions, debe utilizar un número de versión nuevo.

HelloWorldWorkflow implementa los métodos de actividad de GreeterActivitiesImpl la siguiente manera:

public class GreeterActivitiesImpl implements GreeterActivities { @Override public String getName() { return "World"; } @Override public String getGreeting(String name) { return "Hello " + name; } @Override public void say(String what) { System.out.println(what); } }

Observe que el código es idéntico a la HelloWorld implementación. En esencia, una AWS Flow Framework actividad es solo un método que ejecuta algún código y, tal vez, devuelve un resultado. La diferencia entre una aplicación estándar y una aplicación de flujo de trabajo de Amazon SWF radica en la forma en que el flujo de trabajo ejecuta las actividades, dónde se ejecutan estas y cómo se devuelven los resultados al proceso de trabajo de flujo de trabajo.

HelloWorldWorkflow Trabajador de Workflow

Un proceso de trabajo de flujo de trabajo de Amazon SWF posee tres componentes básicos:

  • Una implementación de flujo de trabajo, que es una clase que realiza las tareas relacionadas con el flujo de trabajo.

  • Una clase de cliente de actividades, que básicamente es un proxy para la clase de actividades y se utiliza en una implementación de flujo de trabajo para ejecutar métodos de actividades de manera asíncrona.

  • Una WorkflowWorkerclase que gestiona la interacción entre el flujo de trabajo y Amazon SWF.

En esta sección, se explica la implementación del flujo de trabajo y el cliente de actividades; la clase WorkflowWorker se explicará más adelante.

HelloWorldWorkflow define la interfaz del flujo de trabajo de GreeterWorkflow la siguiente manera:

import com.amazonaws.services.simpleworkflow.flow.annotations.Execute; import com.amazonaws.services.simpleworkflow.flow.annotations.Workflow; import com.amazonaws.services.simpleworkflow.flow.annotations.WorkflowRegistrationOptions; @Workflow @WorkflowRegistrationOptions(defaultExecutionStartToCloseTimeoutSeconds = 3600) public interface GreeterWorkflow { @Execute(version = "1.0") public void greet(); }

Esta interfaz tampoco es estrictamente necesaria HelloWorld , pero es esencial para una aplicación AWS Flow Framework para Java. Debe aplicar dos AWS Flow Framework para las anotaciones de Java @Flujo de trabajo y@WorkflowRegistrationOptions, a la definición de la interfaz de flujo de trabajo. Las anotaciones proporcionan información de configuración y también indican al procesador de anotaciones AWS Flow Framework para Java que genere una clase de cliente de flujo de trabajo basada en la interfaz, como se explica más adelante.

@Workflowtiene un parámetro opcional, DataConverter, que suele utilizarse con su valor predeterminado, NullDataConverter, que indica que JsonDataConverter debe utilizarse.

@WorkflowRegistrationOptions también posee una serie de parámetros opcionales que se pueden utilizar para configurar el proceso de trabajo de flujo de trabajo. Aquí, hay que establecer defaultExecutionStartToCloseTimeoutSeconds, que especifica el tiempo durante el que puede ejecutarse el flujo de trabajo: hasta 3600 segundos (1 hora).

La definición de la GreeterWorkflow interfaz difiere de HelloWorld la @Execute anotación en un aspecto importante. Las interfaces de flujo de trabajo especifican los métodos a los que pueden llamar las aplicaciones como el iniciador de flujo de trabajo y se limitan a un puñado de métodos, cada uno con un rol particular. El marco de trabajo no especifica una lista de parámetros o de nombres para los métodos de la interfaz del flujo de trabajo; se utiliza una lista de parámetros y nombres que sea adecuada para el flujo de trabajo y se aplica una anotación de AWS Flow Framework para Java con el fin de identificar el rol del método.

@Execute tiene dos fines:

  • Identifica greet como el punto de entrada del flujo de trabajo; es decir, el método al que llama el iniciador del flujo de trabajo para iniciar el flujo de trabajo. En general, un punto de entrada puede tomar uno o más parámetros, lo que permite al iniciador inicializar el flujo de trabajo, pero en este ejemplo no es necesario realizar la inicialización.

  • Especifica el número de versión del flujo de trabajo, lo que le permite realizar un seguimiento de diferentes generaciones de implementaciones del flujo de trabajo. Para cambiar una interfaz de flujo de trabajo después de registrarla con Amazon SWF, lo que incluye cambiar los valores de tiempo de espera, debe utilizar un número de versión nuevo.

Para obtener información acerca de otros métodos que se pueden incluir en una interfaz de flujo de trabajo, consulte Contratos de flujo de trabajo y de actividad.

HelloWorldWorkflow implementa el flujo de trabajo de GreeterWorkflowImpl la siguiente manera:

import com.amazonaws.services.simpleworkflow.flow.core.Promise; public class GreeterWorkflowImpl implements GreeterWorkflow { private GreeterActivitiesClient operations = new GreeterActivitiesClientImpl(); public void greet() { Promise<String> name = operations.getName(); Promise<String> greeting = operations.getGreeting(name); operations.say(greeting); } }

El código es similar a HelloWorld, pero con dos diferencias importantes.

  • GreeterWorkflowImpl crea una instancia de GreeterActivitiesClientImpl, el cliente de actividades, en lugar de GreeterActivitiesImpl, y ejecuta las actividades llamando a los métodos en el objeto de cliente.

  • Las actividades name y greeting devuelven objetos Promise<String> en lugar de objetos String.

HelloWorld es una aplicación Java estándar que se ejecuta localmente como un proceso único, por lo que GreeterWorkflowImpl puede implementar la topología del flujo de trabajo simplemente creando una instancia deGreeterActivitiesImpl, llamando a los métodos en orden y pasando los valores devueltos de una actividad a la siguiente. Con un flujo de trabajo de Amazon SWF, un método de actividad sigue realizando una tarea de actividad desde GreeterActivitiesImpl. Sin embargo, el método no se ejecuta necesariamente en el mismo proceso que el flujo de trabajo (es posible que ni siquiera se ejecute en el mismo sistema) y el flujo de trabajo tiene que ejecutar la actividad de manera asíncrona. Estos requisitos plantean los siguientes problemas:

  • Cómo ejecutar un método de actividad que podría estar ejecutándose en un proceso diferente, quizá en otro sistema.

  • Cómo ejecutar un método de actividad de manera asíncrona.

  • Cómo administrar los valores de entrada y retorno de las actividades. Por ejemplo, si el valor de retorno de la Actividad A es una entrada en la Actividad B, debe asegurarse de que la Actividad B no se ejecute hasta que la Actividad A haya terminado.

Puede implementar una gran variedad de topologías de flujos de trabajo a través del flujo de control de la aplicación utilizando un control de flujo de Java conocido combinado con el cliente de actividades y Promise<T>.

Cliente de actividades

GreeterActivitiesClientImpl básicamente es un proxy para GreeterActivitiesImpl que permite que una implementación de flujo de trabajo ejecute los métodos GreeterActivitiesImpl de manera asíncrona.

Las clases GreeterActivitiesClient y GreeterActivitiesClientImpl se generan automáticamente utilizando la información que se proporciona en las anotaciones que se aplican a la clase GreeterActivities. No es necesario que las implemente personalmente.

nota

Eclipse genera estas clases al guardar el proyecto. Puede ver el código generado en el subdirectorio .apt_generated del directorio del proyecto.

Para evitar errores de compilación en la clase GreeterWorkflowImpl, es recomendable mover el directorio .apt_generated a la parte superior de la pestaña Order and Export (Pedido y exportación) del cuadro de diálogo Java Build Path (Ruta de compilación Java).

El proceso de trabajo del flujo de trabajo ejecuta una actividad llamando al método de cliente correspondiente. El método es asíncrono y devuelve inmediatamente un objeto Promise<T>, donde T es el tipo de retorno de la actividad. El objeto Promise<T> devuelto es básicamente un marcador de posición del valor que devolverá al final el método de la actividad.

  • Cuando se devuelve el método del cliente de las actividades, el objeto Promise<T> se encuentra inicialmente en estado no preparado, lo que indica que el objeto no representa aún un valor de retorno válido.

  • Cuando el método de actividad correspondiente termina su tarea y se devuelve, el marco de trabajo asigna el valor de retorno al objeto Promise<T> y lo establece en estado preparado.

Promise <T> Type

La principal finalidad de los objetos Promise<T> es administrar el flujo de datos entre los componentes asíncronos y el control cuando se ejecutan. De esta forma, la aplicación ya no tiene que administrar la sincronización de forma explícita ni depender de mecanismos, como temporizadores, para asegurarse de que los componentes asíncronos no se ejecutan de forma prematura. Cuando se llama a un método del cliente de actividades, este se devuelve inmediatamente, pero el marco de trabajo aplaza la ejecución del método de actividad correspondiente hasta que haya preparado algún objeto Promise<T> de entrada que represente datos válidos.

Desde la perspectiva de GreeterWorkflowImpl, los tres métodos de cliente de las actividades se devuelven inmediatamente. Desde la perspectiva de GreeterActivitiesImpl, el marco de trabajo no llama a getGreeting hasta que name termina y no llama a say hasta que getGreeting termina.

Si utilizamos Promise<T> para pasar datos de una actividad a la siguiente, HelloWorldWorkflow no solo se asegura de que los métodos de actividad no intentan utilizar datos no válidos, sino que también controla cuándo se ejecutan las actividades y define de manera implícita la topología del flujo de trabajo. Para pasar el valor de retorno de Promise<T> de cada actividad a la siguiente, es necesario que las actividades se ejecuten en secuencia, definiendo la topología lineal que se ha explicado anteriormente. En el caso AWS Flow Framework de Java, no es necesario utilizar ningún código de modelado especial para definir incluso topologías complejas, solo el control de flujo estándar de Java y. Promise<T> Para ver un ejemplo detallado de cómo implementar una topología en paralelo sencilla, consulte Proceso de trabajo de actividades de HelloWorldWorkflowParallel.

nota

Cuando un método de actividad como say no devuelve un valor, el método de cliente correspondiente devuelve un objeto Promise<Void>. El objeto no representa datos, pero al principio no está preparado y lo está cuando termina la actividad. Por lo tanto, se puede pasar un objeto Promise<Void> a otros métodos de cliente de actividades para asegurarse de que aplazan su ejecución hasta que termina la actividad original.

Promise<T> permite que en una implementación de flujo de trabajo se utilicen métodos de cliente de actividades y sus valores de retorno de una forma muy parecida a los métodos síncronos. Sin embargo, debe tener cuidado al obtener acceso al valor de un objeto Promise<T>. A diferencia del tipo Future<T> de Java, el marco de trabajo se encarga de la sincronización para Promise<T>, no la aplicación. Si llama a Promise<T>.get y el objeto no está preparado, get genera una excepción. Fíjese en que HelloWorldWorkflow nunca obtiene acceso directamente al objeto Promise<T>; simplemente pasa los objetos de una actividad a la siguiente. Cuando un objeto está preparado, el marco de trabajo extrae el valor y lo pasa al método de actividad como un tipo estándar.

Solo se debería obtener acceso a los objetos Promise<T> por medio de código asíncrono, donde el marco de trabajo garantiza que el objeto está preparado y representa un valor válido. Para solucionar este problema, HelloWorldWorkflow pasa objetos Promise<T> solo a métodos de cliente de actividades. Para obtener acceso al valor de un objeto Promise<T> en la implementación del flujo de trabajo, pase el objeto a un método de flujo de trabajo asíncrono, que se comporta de una forma muy parecida a una actividad. Para ver un ejemplo, consulte Aplicación HelloWorldWorkflowAsync.

HelloWorldWorkflow Implementación de flujos de trabajo y actividades

Las implementaciones del flujo de trabajo y las actividades tienen clases de trabajadores asociadas, ActivityWorkery WorkflowWorker. Estas clases se encargan de la comunicación entre Amazon SWF y las implementaciones de actividades y flujos de trabajo al sondear la lista de tareas de Amazon SWF apropiada para buscar tareas, a la vez que ejecutan el método adecuado para cada tarea y administran el flujo de datos. Para obtener más información, consulte Conceptos básicos de AWS Flow Framework: estructura de la aplicación

Para asociar las implementaciones de actividades y flujos de trabajo con los objetos de proceso de trabajo correspondientes, tiene que implementar una o varias aplicaciones de proceso de trabajo que:

  • Registren flujos de trabajo o actividades en Amazon SWF.

  • Creen objetos de procesos de trabajo y los asocien con las implementaciones del proceso de trabajo del flujo de trabajo o la actividad.

  • Indiquen a los objetos del proceso de trabajo que comiencen a comunicarse con Amazon SWF.

Si desea ejecutar el flujo de trabajo y las actividades como procesos independientes, debe implementar distintos hosts de procesos de trabajo de flujos de trabajo y actividades. Para ver un ejemplo, consulte Aplicación HelloWorldWorkflowDistributed. Para simplificar, HelloWorldWorkflow implementa un único servidor de trabajo que ejecuta las actividades y los trabajadores del flujo de trabajo en el mismo proceso, de la siguiente manera:

import com.amazonaws.ClientConfiguration; import com.amazonaws.auth.AWSCredentials; import com.amazonaws.auth.BasicAWSCredentials; import com.amazonaws.services.simpleworkflow.AmazonSimpleWorkflow; import com.amazonaws.services.simpleworkflow.AmazonSimpleWorkflowClient; import com.amazonaws.services.simpleworkflow.flow.ActivityWorker; import com.amazonaws.services.simpleworkflow.flow.WorkflowWorker; public class GreeterWorker { public static void main(String[] args) throws Exception { ClientConfiguration config = new ClientConfiguration().withSocketTimeout(70*1000); String swfAccessId = System.getenv("AWS_ACCESS_KEY_ID"); String swfSecretKey = System.getenv("AWS_SECRET_KEY"); AWSCredentials awsCredentials = new BasicAWSCredentials(swfAccessId, swfSecretKey); AmazonSimpleWorkflow service = new AmazonSimpleWorkflowClient(awsCredentials, config); service.setEndpoint("https://swf.us-east-1.amazonaws.com"); String domain = "helloWorldWalkthrough"; String taskListToPoll = "HelloWorldList"; ActivityWorker aw = new ActivityWorker(service, domain, taskListToPoll); aw.addActivitiesImplementation(new GreeterActivitiesImpl()); aw.start(); WorkflowWorker wfw = new WorkflowWorker(service, domain, taskListToPoll); wfw.addWorkflowImplementationType(GreeterWorkflowImpl.class); wfw.start(); } }

GreeterWorkerno tiene HelloWorld contrapartida, por lo que debe añadir una clase Java denominada GreeterWorker al proyecto y copiar el código de ejemplo en ese archivo.

El primer paso consiste en crear y configurar un AmazonSimpleWorkflowClientobjeto que invoque los métodos de servicio de Amazon SWF subyacentes. Para ello, GreeterWorker:

  1. Crea un ClientConfigurationobjeto y especifica un tiempo de espera del socket de 70 segundos. Este valor especifica cuánto hay que esperar a que se transfieran los datos en una conexión abierta establecida antes de cerrar el conector.

  2. Crea un AWSCredentials objeto básico para identificar la AWS cuenta y pasa las claves de la cuenta al constructor. Por comodidad, y para evitar que queden expuestas en texto sin formato en el código, las claves se almacenan en variables de entorno.

  3. Crea un AmazonSimpleWorkflowClientobjeto para representar el flujo de trabajo y pasa los ClientConfiguration objetos BasicAWSCredentials y al constructor.

  4. Establece la dirección URL del punto de conexión del servicio del objeto del cliente. Amazon SWF está disponible actualmente en todas las AWS regiones.

Por comodidad, GreeterWorker define dos constantes de cadena.

  • domaines el nombre de dominio Amazon SWF del flujo de trabajo, que creó al configurar su cuenta de Amazon SWF. HelloWorldWorkflowasume que está ejecutando el flujo de trabajo en el dominio helloWorldWalkthrough "».

  • taskListToPoll es el nombre de las listas de tareas que utiliza Amazon SWF para administrar la comunicación entre los procesos de trabajo de flujos de trabajo y de actividades. Puede establecer el nombre en cualquier cadena que le convenga. HelloWorldWorkflow usa HelloWorldList "» tanto para las listas de tareas del flujo de trabajo como para las de actividades. Internamente, los nombres terminan en diferentes espacios de nombres, por lo que las dos listas de tareas están diferenciadas.

GreeterWorkerutiliza las constantes de cadena y el AmazonSimpleWorkflowClientobjeto para crear objetos de trabajo, que gestionan la interacción entre las actividades y las implementaciones de los trabajadores y Amazon SWF. En particular, los objetos del proceso de trabajo se encargan de la tarea de sondeo de la lista de tareas correspondiente para buscar tareas.

GreeterWorker crea un objeto ActivityWorker y lo configura para que se encargue de GreeterActivitiesImpl añadiendo una nueva instancia de clase. Luego, GreeterWorker llama al método start del objeto ActivityWorker, que le indica al objeto que comience a sondear la lista de tareas de actividad especificada.

GreeterWorker crea un objeto WorkflowWorker y lo configura para que se encargue de GreeterWorkflowImpl añadiendo el nombre de archivo de clase, GreeterWorkflowImpl.class. Luego, llama al método start del objeto WorkflowWorker, que le indica al objeto que comience a sondear la lista de tareas del flujo de trabajo especificada.

En este momento, puede ejecutar GreeterWorker correctamente. Registra el flujo de trabajo y las actividades con Amazon SWF y hace que los objetos del proceso de trabajo comiencen a sondear sus correspondientes listas de tareas. Para verificar esto, ejecute GreeterWorker, vaya a la consola de Amazon SWF y seleccione helloWorldWalkthrough en la lista de dominios. Si elige Workflow Types (Tipos de flujo de trabajo) en el panel Navigation (Navegación), debería ver GreeterWorkflow.greet:

HelloWorldWorkflow tipo de flujo de trabajo

Si elige Activity Types (Tipos de actividad), se muestran los métodos GreeterActivities:

HelloWorldWorkflow tipos de actividad

Sin embargo, si elige Workflow Executions (Ejecuciones de flujo de trabajo), verá las ejecuciones activas. Aunque los procesos de trabajo de flujos de trabajo y actividades sondean tareas, aún no hemos iniciado una ejecución de flujo de trabajo.

HelloWorldWorkflow Motor de arranque

La última pieza del puzle es la implementación de un iniciador de flujo de trabajo, que es una aplicación que inicia la ejecución del flujo de trabajo. Amazon SWF almacena el estado de la ejecución para que pueda consultar su historial y su estado de ejecución. HelloWorldWorkflow implementa un iniciador de flujo de trabajo modificando la GreeterMain clase de la siguiente manera:

import com.amazonaws.ClientConfiguration; import com.amazonaws.auth.AWSCredentials; import com.amazonaws.auth.BasicAWSCredentials; import com.amazonaws.services.simpleworkflow.AmazonSimpleWorkflow; import com.amazonaws.services.simpleworkflow.AmazonSimpleWorkflowClient; public class GreeterMain { public static void main(String[] args) throws Exception { ClientConfiguration config = new ClientConfiguration().withSocketTimeout(70*1000); String swfAccessId = System.getenv("AWS_ACCESS_KEY_ID"); String swfSecretKey = System.getenv("AWS_SECRET_KEY"); AWSCredentials awsCredentials = new BasicAWSCredentials(swfAccessId, swfSecretKey); AmazonSimpleWorkflow service = new AmazonSimpleWorkflowClient(awsCredentials, config); service.setEndpoint("https://swf.us-east-1.amazonaws.com"); String domain = "helloWorldWalkthrough"; GreeterWorkflowClientExternalFactory factory = new GreeterWorkflowClientExternalFactoryImpl(service, domain); GreeterWorkflowClientExternal greeter = factory.getClient("someID"); greeter.greet(); } }

GreeterMain crea un objeto AmazonSimpleWorkflowClient utilizando el mismo código que GreeterWorker. Luego, crea un objeto GreeterWorkflowClientExternal, que sirve de proxy para el flujo de trabajo, de una forma muy parecida al cliente de actividades creado en GreeterWorkflowClientImpl, que sirve de proxy para los métodos de actividades. En lugar de crear un objeto de cliente de flujo de trabajo mediante new, debe:

  1. Crear un objeto de fábrica de clientes externo y pasar el objeto AmazonSimpleWorkflowClient y el nombre de dominio de Amazon SWF al constructor. El objeto de fábrica del cliente lo crea el procesador de anotaciones del marco, que crea el nombre del objeto simplemente añadiendo «ClientExternalFactoryImpl» al nombre de la interfaz de flujo de trabajo.

  2. Cree un objeto cliente externo llamando al getClient método del objeto de fábrica, que crea el nombre del objeto añadiendo "ClientExternal" al nombre de la interfaz de flujo de trabajo. Opcionalmente, puede pasar a getClient una cadena que utilizará Amazon SWF para identificar esta instancia del flujo de trabajo. De lo contrario, Amazon SWF utiliza un GUID generado para representar una instancia de flujo de trabajo.

El cliente que se devuelve de la fábrica solo crea flujos de trabajo con el nombre de la cadena que se haya pasado al método getClient (el cliente que se ha devuelto de la fábrica ya tiene un estado en Amazon SWF). Para ejecutar un flujo de trabajo con un identificador diferente, hay que volver a la fábrica y crear un cliente nuevo especificando el identificador diferente.

El cliente de flujo de trabajo expone un método greet al que llama GreeterMain para comenzar el flujo de trabajo, ya que greet() es el método que se ha especificado con la anotación @Execute.

nota

El procesador de anotaciones también crea un objeto de fábrica de clientes interno que se utiliza para crear flujos de trabajo secundarios. Para obtener más detalles, consulte Ejecuciones de flujo de trabajo secundario.

Cierre GreeterWorker por ahora, si aún se está ejecutando, y ejecute GreeterMain. Ahora debería ver someID en la lista de ejecuciones de flujos de trabajo activas de la consola de Amazon SWF:

HelloWorldWorkflow ejecuciones de flujos de trabajo

Si elige someID y luego la pestaña Events (Eventos), se muestran los eventos:

HelloWorldWorkflow eventos iniciales del flujo de trabajo
nota

Si ha iniciado GreeterWorker anteriormente y sigue ejecutándose, verá una lista de eventos más larga por los motivos que vamos a explicar en breve. Detenga GreeterWorker e intente ejecutar de nuevo GreaterMain.

En la pestaña Events (Eventos) solo aparecen dos eventos:

  • WorkflowExecutionStarted indica que el flujo de trabajo ha comenzado a ejecutarse.

  • DecisionTaskScheduled indica que Amazon SWF ha puesto en cola la primera tarea de decisión.

El motivo de que el flujo de trabajo se bloquee en la primera tarea de decisión es porque está distribuido en dos aplicaciones: GreeterMain y GreeterWorker. GreeterMain ha comenzado la ejecución del flujo de trabajo, pero GreeterWorker no se está ejecutando, por lo que los procesos de trabajo no sondean las listas ni ejecutan tareas. Puede ejecutar cualquiera de las aplicaciones de forma independiente, pero necesita ambas para que la ejecución del flujo de trabajo continúe después de la primera tarea de decisión. Si ahora ejecuta GreeterWorker, los procesos de trabajo de flujo de trabajo y actividad comenzarán a realizar el sondeo y las diversas tareas se realizarán rápidamente. Si comprueba ahora la pestaña Events (Eventos), verá el primer lote de eventos.

HelloWorldWorkflow eventos de flujo de trabajo completos

Puede elegir eventos individuales para obtener más información. Cuando haya terminado de consultarlos, el flujo de trabajo debería haber imprimido las palabras “Hello World!” en la consola.

Una vez completado el flujo de trabajo, desaparece de la lista de ejecuciones activas. Sin embargo, si desea revisarlo, elija el botón de estado de ejecución Closed (Cerrado) y luego elija List Executions (Lista de ejecuciones). Aquí se muestran todas las instancias de flujo de trabajo completadas en el dominio especificado (helloWorldWalkthrough) que no han superado su tiempo de retención, que especificó en el momento de crear el dominio.

HelloWorldWorkflow flujos de trabajo completados

Fíjese en que cada instancia de flujo de trabajo tiene un valor de Run ID (Identificador de ejecución) único. Puede utilizar el mismo identificador de ejecución para diferentes instancias de flujo de trabajo, pero solo para una ejecución activa al mismo tiempo.