Ejecución de programas escritos con el AWS Flow Framework para Java - 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.

Ejecución de programas escritos con el AWS Flow Framework para Java

El marco de trabajo proporciona clases de procesos de trabajo para inicializar el tiempo de ejecución de AWS Flow Framework para Java y comunicarse con Amazon SWF. Para implementar un proceso de trabajo de flujo de trabajo o de actividad, tiene que crear e comenzar una instancia de una clase de proceso de trabajo. Estas clases de procesos de trabajo son responsables de la administración de las operaciones asíncronas en curso, de invocar métodos asíncronos que se desbloquean y de la comunicación con Amazon SWF. Pueden configurarse con implementaciones de flujo de trabajo y de actividad, el número de subprocesos, la lista de tareas para sondear, etc.

El marco de trabajo incluye dos clases de procesos de trabajo, una para actividades y otra para flujos de trabajo. Para ejecutar la lógica de flujo de trabajo, usted utiliza la clase WorkflowWorker. Del mismo modo, para actividades se usa la clase ActivityWorker. Estas clases sondean automáticamente Amazon SWF para detectar tareas de actividad e invocan los métodos apropiados en la implementación.

El siguiente ejemplo muestra cómo crear instancias de WorkflowWorker y comenzar a sondear tareas:

AmazonSimpleWorkflow swfClient = new AmazonSimpleWorkflowClient(awsCredentials); WorkflowWorker worker = new WorkflowWorker(swfClient, "domain1", "tasklist1"); // Add workflow implementation types worker.addWorkflowImplementationType(MyWorkflowImpl.class); // Start worker worker.start();

Los pasos básicos para crear una instancia del ActivityWorker y comenzar a sondear tareas son los siguientes:

AmazonSimpleWorkflow swfClient = new AmazonSimpleWorkflowClient(awsCredentials); ActivityWorker worker = new ActivityWorker(swfClient, "domain1", "tasklist1"); worker.addActivitiesImplementation(new MyActivitiesImpl()); // Start worker worker.start();

Cuando quiera cerrar una actividad o decisor, la aplicación debería cerrar las instancias de las clases de procesos de trabajo que se estén utilizando, así como la instancia de cliente de Java de Amazon SWF. Esto garantizará que todos los recursos utilizados por las clases de procesos de trabajo se publican correctamente.

worker.shutdown(); worker.awaitTermination(1, TimeUnit.MINUTES);

Para comenzar una ejecución, simplemente cree una instancia del cliente externo generado y llame al método @Execute.

MyWorkflowClientExternalFactory factory = new MyWorkflowClientExternalFactoryImpl(); MyWorkflowClientExternal client = factory.getClient(); client.start();

WorkflowWorker

Tal y como sugiere el nombre, el uso previsto de esta clase de proceso de trabajo es la implementación de flujo de trabajo. Se configura con una lista de tareas y el tipo de implementación de flujo de trabajo. La clase del proceso de trabajo ejecuta un bucle para sondear tareas de decisión en la lista de tareas especificadas. Cuando se recibe una tarea de decisión, crea una instancia de la implementación de flujo de trabajo y llama al método @Execute para procesar la tarea.

ActivityWorker

Para la implementación de procesos de trabajo de actividad, puede usar la clase ActivityWorker para sondear cómodamente una lista de tareas para tareas de actividad. Usted configura el proceso de trabajo de actividad con objetos de implementación de actividad. Esta clase de proceso de trabajo ejecuta un bucle para sondear tareas de actividad en la lista de tareas especificadas. Cuando se recibe una tarea de actividad, busca la implementación apropiada que proporcionó y llama al método de actividad para procesar la tarea. A diferencia de WorkflowWorker, que llama a la fábrica para crear una instancia nueva para cada tarea de decisión, el ActivityWorker simplemente utiliza el objeto que proporcionó.

La clase ActivityWorker utiliza las anotaciones del AWS Flow Framework para Java para determinar las opciones de registro y ejecución.

Modelo de subprocesos de proceso de trabajo

En el AWS Flow Framework para Java, la encarnación de una actividad o decisor es una instancia de la clase de proceso de trabajo. Su aplicación es responsable de configurar y crear instancias del objeto del proceso de trabajo en cada máquina y proceso que deba actual como proceso de trabajo. A continuación, el objeto de proceso de trabajo recibe automáticamente tareas de Amazon SWF, las envía a la implementación de la actividad o del flujo de trabajo e informa sobre los resultados a Amazon SWF. Es posible que una sola instancia de flujo de trabajo incluya a muchos procesos de trabajo. Cuando Amazon SWF tiene una o más tareas de actividad pendientes, asigna una tarea al primer proceso de trabajo disponible, luego al siguiente y así sucesivamente. Esto permite que las tareas que pertenecen a la misma instancia de flujo de trabajo se procesen en diferentes procesos de trabajo simultáneamente.

Topología de aplicaciones basadas en AWS Flow Framework para Java

Es más, es posible configurar cada proceso de trabajo para que procese tareas en múltiples subprocesos. Esto significa que las tareas de actividad de una instancia de flujo de trabajo pueden ejecutarse simultáneamente incluso si solo hay un proceso de trabajo.

Las tareas de decisión actúan de manera similar, con la excepción de que Amazon SWF garantiza que para una ejecución de flujo de trabajo dada solo es posible ejecutar las decisiones de una en una. Una sola ejecución de flujo de trabajo exigirá habitualmente múltiples tareas de decisión; por tanto, también podría acabar ejecutando múltiples procesos y subprocesos. El decisor se configura con el tipo de implementación de flujo de trabajo. Cuando el decisor recibe una tarea de decisión, crea una instancia (objeto) de la implementación de flujo de trabajo. El marco de trabajo proporciona un patrón de fábrica extensible para la creación de estas instancias. La fábrica de flujo de trabajo predeterminada crear un objeto nuevo en cada ocasión. Puede proporcionar fábricas personalizadas para anular este comportamiento.

Al contrario de lo que ocurre con los decisores, que se configuran con tipos de implementación de flujo de trabajo, los procesos de trabajo de actividad se configuran con instancias (objetos) de implementaciones de actividad. Cuando un proceso de trabajo de actividad recibe una tarea de actividad, se envía al objeto de implementación de actividad apropiado.

Modelo de subprocesos de clases de procesos de trabajo

El proceso de trabajo del flujo de trabajo mantiene un solo grupo de subprocesos y ejecuta el flujo de trabajo en el mismo subproceso que se utilizó para sondear la tarea en Amazon SWF. Dado que las actividades son de ejecución prolongada (al menos cuando se comparan con la lógica de flujo de trabajo), la clase de proceso de trabajo de actividad mantiene dos grupos de subprocesos separados; uno para el sondeo de tareas de actividad en Amazon SWF y el otro para el procesamiento de tareas ejecutando la implementación de actividad. Esto le permite configurar el número de subprocesos para el sondeo de tareas por separado del número de subprocesos para ejecutarlos. Por ejemplo, puede tener un número pequeño de subprocesos para el sondeo y un número elevado de subprocesos para la ejecución de tareas. La clase de proceso de trabajo de actividad sondea Amazon SWF en busca de una tarea solamente cuando tiene un subproceso de sondeo libre y un subproceso libre para procesar la tarea.

Este comportamiento de subprocesos y creación de instancias implica lo siguiente:

  1. Las implementaciones de actividad no tienen que tener estado. No deberá usar variables de instancia para almacenar el estado de la aplicación en objetos de actividad. Puede, no obstante, utilizar campos para almacenar recursos como por ejemplo conexiones de bases de datos.

  2. Las implementaciones de actividad tienen que ser seguras para subprocesos. Dado que es posible utilizar la misma instancia para procesar tareas de diferentes subprocesos al mismo tiempo, el acceso a recursos compartidos del código de actividad debe sincronizarse.

  3. La implementación de flujo de trabajo puede ser con estado y es posible utilizar variables de instancia para almacenar el estado. Aunque se crea una instancia nueva de la implementación de flujo de trabajo para procesar cada tarea de decisión, el marco de trabajo se asegurará de que el estado se recrea correctamente. No obstante, la implementación de flujo de trabajo tiene que ser determinista. Consulte la sección Entre bastidores para obtener más información.

  4. Las implementaciones de flujo de trabajo no tienen que ser seguras para subprocesos cuando se utiliza la fábrica predeterminada. La implementación predeterminada garantiza que solo un subproceso utiliza una instancia de la implementación de flujo de trabajo a cada vez.

Extensibilidad de proceso de trabajo

El AWS Flow Framework para Java también contiene un par de clases de proceso de trabajo de bajo nivel que proporcionan un control muy preciso y extensibilidad. Al usarlas, puede personalizar por completo el registro de tipos de flujos de trabajo y de actividades, y establecer fábricas para la creación de objetos de implementación. Estos procesos de trabajo son GenericWorkflowWorker y GenericActivityWorker.

El GenericWorkflowWorker puede configurarse con una fábrica para la creación de fábricas de definición de flujo de trabajo. La fábrica de definición de flujo de trabajo es responsable de la creación de instancias de la implementación de flujo de trabajo y de proporcionar los ajustes de la configuración como las opciones de registro. Bajo circunstancias normales, debería utilizar la clase WorkflowWorker directamente. Creará y configurará automáticamente la implementación de las fábricas que se proporcionan en el marco de trabajo, POJOWorkflowDefinitionFactoryFactory y POJOWorkflowDefinitionFactory. La fábrica requiere que la clase de implementación de flujo de trabajo tenga un constructor sin ningún argumento. Este constructor se utiliza para crear instancias del objeto de flujo de trabajo en el tiempo de ejecución. La fábrica mira las anotaciones que ha utilizado en la interfaz de flujo de trabajo y la implementación para crear opciones de ejecución y registro apropiadas.

Podría proporcionar su propia implementación de las fábricas implementando WorkflowDefinitionFactory, WorkflowDefinitionFactoryFactory y WorkflowDefinition. La clase de proceso de trabajo utiliza la clase WorkflowDefinition para enviar tareas de decisión y señales. Al implementar estas clases de base, puede personalizar por completo la fábrica y el envío de solicitudes a la implementación de flujo de trabajo. Por ejemplo, puede usar estos puntos de extensibilidad para proporcionar un modelo de programación personalizado para la redacción de flujos de trabajo, por ejemplo, basado en sus propias anotaciones o generándolo a partir de WSDL en lugar del primer enfoque del código utilizado por el marco de trabajo. Para utilizar las fábricas personalizadas, tendrá que usar la clase GenericWorkflowWorker. Para obtener más información sobre estas clases, consulte la documentación del AWS SDK for Java.

Del mismo modo, GenericActivityWorker le permite proporcionar una fábrica de implementación de actividad personalizada. Al implementar las clases ActivityImplementationFactory y ActivityImplementation puede controlar por completo la creación de instancias de actividad así como personalizar las opciones de registro y ejecución. Para obtener más información sobre estas clases, consulte la documentación del AWS SDK for Java.