Implementación de actividades - 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.

Implementación de actividades

Las actividades se implementan proporcionando una implementación de la interfaz @Activities. El AWS Flow Framework para Java utiliza las instancias de implementación de actividades configuradas en el proceso de trabajo para procesar tareas de actividad en el tiempo de ejecución. El proceso de trabajo busca automáticamente la implementación de la actividad del tipo apropiado.

Puede utilizar propiedades y campos para pasar recursos a instancias de actividad, como por ejemplo conexiones de bases de datos. Dado que es posible obtener acceso al objeto de implementación de actividades desde varios subprocesos, los recursos compartidos deben ser seguros para subprocesos.

Tenga en cuenta que la implementación de la actividad no toma parámetros del tipo Promise<> ni devuelve objetos de ese tipo. Esto es así porque la implementación de la actividad no debería depender de cómo se invocó (de manera síncrona o asíncrona).

La interfaz de actividades mostrada con anterioridad puede implementarse de esta manera:

public class MyActivitiesImpl implements MyActivities { @Override @ManualActivityCompletion public int activity1(){ //implementation } @Override public void activity2(int foo){ //implementation } }

Hay un contexto local de subproceso disponible para la implementación de la actividad que puede usarse para recuperar el objeto de la tarea, el objeto del convertidor de datos que se está usando, etc. Se puede obtener acceso al contexto actual a través de ActivityExecutionContextProvider.getActivityExecutionContext(). Para obtener más información, consulte la documentación de AWS SDK for Java correspondiente a ActivityExecutionContext y la sección Contexto de ejecución.

Finalización manual de actividades

La anotación @ManualActivityCompletion en el ejemplo de arriba es una anotación opcional. Se permite solamente en métodos que implementan una actividad y se utiliza para configurar la actividad para que no se complete automáticamente cuando el método de la actividad devuelve resultados. Esto podría ser útil cuando desee completar la actividad de manera asíncrona, por ejemplo, manualmente una vez que se haya completado una acción realizada por una persona.

De manera predeterminada, el marco de trabajo considera que la actividad se ha completado cuando el método de la actividad devuelve resultados. Esto significa que el proceso de trabajo de actividad informa de la finalización de la tarea de actividad a Amazon SWF y le proporciona los resultados (si los hubiera). No obstante, hay casos de uso en los que no quiere que la tarea de la actividad se marque como completada cuando el método de la actividad devuelve resultados. Esto es útil especialmente cuando está modelando tareas humanas. Por ejemplo, el método de la actividad podría enviar un correo electrónico a una persona que debe completar un trabajo antes de que pueda completarse la tarea de la actividad. En estos casos, puede anotar el método de la actividad con la anotación @ManualActivityCompletion para indicar al proceso de trabajo de la actividad que no deberá completar la actividad automáticamente. Para completar la actividad manualmente, puede utilizar el ManualActivityCompletionClient que se proporciona en el marco de trabajo o utilizar el método RespondActivityTaskCompleted en el cliente de Java de Amazon SWF que se proporciona en el SDK de Amazon SWF. Para obtener más información, consulte la documentación de AWS SDK for Java.

Para completar la tarea de la actividad, tiene que proporcionar un token de tarea. Amazon SWF utiliza el token de tarea para identificar las tareas de forma única. Puede obtener acceso a este token desde ActivityExecutionContext en la implementación de la actividad. Debe pasar este token a la parte responsable de completar la tarea. Este token podrá recuperarse desde el ActivityExecutionContext llamando a ActivityExecutionContextProvider.getActivityExecutionContext().getTaskToken().

La actividad getName del ejemplo de Hello World puede implementarse para enviar un correo electrónico para pedirle a alguien que proporcione un mensaje de saludo:

@ManualActivityCompletion @Override public String getName() throws InterruptedException { ActivityExecutionContext executionContext = contextProvider.getActivityExecutionContext(); String taskToken = executionContext.getTaskToken(); sendEmail("abc@xyz.com", "Please provide a name for the greeting message and close task with token: " + taskToken); return "This will not be returned to the caller"; }

El siguiente objeto de código puede usarse para proporcionar el saludo y cerrar la tarea utilizando el ManualActivityCompletionClient. También puede producir un error en la tarea:

public class CompleteActivityTask { public void completeGetNameActivity(String taskToken) { AmazonSimpleWorkflow swfClient = new AmazonSimpleWorkflowClient(...); // use AWS access keys ManualActivityCompletionClientFactory manualCompletionClientFactory = new ManualActivityCompletionClientFactoryImpl(swfClient); ManualActivityCompletionClient manualCompletionClient = manualCompletionClientFactory.getClient(taskToken); String result = "Hello World!"; manualCompletionClient.complete(result); } public void failGetNameActivity(String taskToken, Throwable failure) { AmazonSimpleWorkflow swfClient = new AmazonSimpleWorkflowClient(...); // use AWS access keys ManualActivityCompletionClientFactory manualCompletionClientFactory = new ManualActivityCompletionClientFactoryImpl(swfClient); ManualActivityCompletionClient manualCompletionClient = manualCompletionClientFactory.getClient(taskToken); manualCompletionClient.fail(failure); } }