Contexto de ejecución - 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.

Contexto de ejecución

El marco de trabajo proporciona un contexto de ambiente para las implementaciones de flujo de trabajo y de actividad. Este contexto es específico de la tarea que se está procesando y proporciona algunas utilidades que puede utilizar en su implementación. Cada vez que un proceso de trabajo procesa una tarea nueva se crea un objeto de contexto.

Contexto de la decisión

Cuando se ejecuta una tarea de decisión, el marco de trabajo proporciona el contexto para la implementación de flujo de trabajo a través de la clase DecisionContext. DecisionContext proporciona información contextual como el ID de ejecución de la ejecución del flujo de trabajo y funcionalidad de reloj y de temporizador.

Acceso a DecisionContext en la implementación de flujos de trabajo

Puede obtener acceso a DecisionContext en la implementación de flujos de trabajo mediante la clase DecisionContextProviderImpl. Además, puede inyectar el contexto en un campo o propiedad de la implementación de flujo de trabajo utilizando Spring como se muestra en la sección correspondiente a capacidad de prueba e inyección de dependencia.

DecisionContextProvider contextProvider = new DecisionContextProviderImpl(); DecisionContext context = contextProvider.getDecisionContext();

Creación de un reloj y un temporizador

El DecisionContext contiene una propiedad del tipo WorkflowClock que proporciona funcionalidad de reloj y temporizador. Dado que la lógica de flujo de trabajo tiene que ser determinista, no deberá utilizar directamente el reloj del sistema en su implementación de flujo de trabajo. El método currentTimeMills en el WorkflowClock devuelve la hora del evento de inicio de la decisión que se está procesando. Esto garantiza que obtiene el mismo valor de hora durante la reproducción, haciendo de esta manera que su lógica de flujo de trabajo sea determinista.

WorkflowClock también tiene un método de createTimer que devuelve un objeto Promise que estará listo después del intervalo especificado. Puede utilizar este valor como parámetro para otros métodos asíncronos para retrasar su ejecución el periodo de tiempo especificado. De esta manera, puede programar de manera efectiva un método asíncrono o una actividad para su ejecución posterior.

El ejemplo de la siguiente lista muestra cómo llamar periódicamente a una actividad.

@Workflow @WorkflowRegistrationOptions(defaultExecutionStartToCloseTimeoutSeconds = 60, defaultTaskStartToCloseTimeoutSeconds = 10) public interface PeriodicWorkflow { @Execute(version = "1.0") void periodicWorkflow(); } @Activities(version = "1.0") @ActivityRegistrationOptions(defaultTaskScheduleToStartTimeoutSeconds = 300, defaultTaskStartToCloseTimeoutSeconds = 3600) public interface PeriodicActivity { void activity1(); } public class PeriodicWorkflowImpl implements PeriodicWorkflow { private DecisionContextProvider contextProvider = new DecisionContextProviderImpl(); private WorkflowClock clock = contextProvider.getDecisionContext().getWorkflowClock(); @Override public void periodicWorkflow() { callPeriodicActivity(0); } @Asynchronous private void callPeriodicActivity(int count, Promise<?>... waitFor) { if (count == 100) { return; } PeriodicActivityClient client = new PeriodicActivityClientImpl(); // call activity Promise<Void> activityCompletion = client.activity1(); Promise<Void> timer = clock.createTimer(3600); // Repeat the activity either after 1 hour or after previous activity run // if it takes longer than 1 hour callPeriodicActivity(count + 1, timer, activityCompletion); } } public class PeriodicActivityImpl implements PeriodicActivity { @Override public void activity1() { ... } }

En la lista de más arriba, el método asíncrono callPeriodicActivity llama a activity1 y crea, a continuación, un temporizador utilizando el actual AsyncDecisionContext. Pasa la Promise devuelta como argumento a una llamada a sí mismo de manera recurrente. Esta llamada recurrente espera hasta que el temporizador se activa (1 hora en este ejemplo) antes de la ejecución.

Contexto de ejecución de actividad

Al igual que DecisionContext proporciona información contextual cuando se está procesando una tarea de decisión, ActivityExecutionContext proporciona información contextual similar cuando se está procesando una tarea de actividad. Este contexto está disponible para su código de actividad a través de la clase ActivityExecutionContextProviderImpl.

ActivityExecutionContextProvider provider = new ActivityExecutionContextProviderImpl(); ActivityExecutionContext aec = provider.getActivityExecutionContext();

Utilizando ActivityExecutionContext, puede hacer lo siguiente:

Latido de una actividad de ejecución prolongada

Si la actividad es de ejecución prolongada, esta debe informar periódicamente de su progreso a Amazon SWF para dejar constancia de que la tarea sigue en curso. En ausencia de un latido de este tipo, podría agotarse el tiempo de espera de la tarea si se estableció el tiempo de espera del latido de una tarea en el registro del tipo de actividad o durante la programación de la actividad. Para enviar un latido, puede usar el método recordActivityHeartbeat en ActivityExecutionContext. El latido también proporciona un mecanismo de cancelación de las actividades en curso. Consulte la sección Control de errores para obtener más información y un ejemplo.

Obtenga detalles de la tarea de la actividad

Si lo desea, puede obtener todos los detalles de la tarea de actividad que pasó Amazon SWF cuando el ejecutor recibió la tarea. Esto incluye información sobre las entradas a la tarea, el tipo de tarea, el token de la tarea, etc. Si desea implementar una actividad que se completa manualmente, por ejemplo, mediante la acción de una persona, debe utilizar ActivityExecutionContext para recuperar el token de la tarea y pasarlo al proceso que acabará completando la tarea de actividad. Consulte la sección en Finalización manual de actividades para obtener más información.

Obtención del objeto de cliente de Amazon SWF que está utilizando el ejecutor

El objeto de cliente de Amazon SWF que está utilizando el ejecutor puede recuperarse llamando al método getService en ActivityExecutionContext. Esto es útil si se desea hacer una llamada directa al servicio de Amazon SWF.