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.
Aplicación HelloWorldWorkflowAsync
En ocasiones es preferible que un flujo de trabajo realice determinadas tareas localmente en lugar de usar una actividad. No obstante, las tareas de flujo de trabajo con frecuencia conllevan procesar valores representados por objetos Promise<T>
. Si pasa un objeto Promise<T>
a un método de flujo de trabajo asíncrono, el método se ejecuta inmediatamente pero no puede obtener acceso al valor del objeto Promise<T>
hasta que el objeto esté listo. Podría sondear Promise<T>.isReady
hasta que devuelva true
, pero eso, además de no ser eficaz, haría que el método pudiera quedar bloqueado durante un largo periodo. Es mejor utilizar un método asíncrono.
Un método asíncrono se implementa de forma muy parecida a un método estándar, con frecuencia como miembro de la clase de implementación de flujo de trabajo, y se ejecuta en el contexto de la implementación de flujo de trabajo. Usted lo designa como método asíncrono aplicando una anotación @Asynchronous
, la cual indica al marco de trabajo que debe tratarlo de forma muy parecida a una actividad.
-
Cuando una implementación de flujo de trabajo llama a un método asíncrono, se devuelve de inmediato. Los métodos asíncronos habitualmente devuelven un objeto
Promise<T>
, el cual queda listo una vez que el método termina. -
Si pasa uno o más objetos
Promise<T>
a un método asíncrono, difiere la ejecución hasta que todos los objetos de entrada estén listos. Un método asíncrono puede por tanto obtener acceso a su valoresPromise<T>
de entrada sin arriesgar a que se produzca una excepción.
nota
Dada la manera en que AWS Flow Framework para Java ejecuta el flujo de trabajo, los métodos asíncronos se suelen ejecutar varias veces, por lo que debería utilizarlos solo para tareas rápidas de baja sobrecarga. Debería utilizar actividades para realizar tareas prolongadas, como grandes cálculos. Para obtener más información, consulte Conceptos básicos de AWS Flow Framework: ejecución distribuida.
Este tema es un tutorial de HelloWorldWorkflowAsync, una versión modificada de HelloWorldWorkflow que sustituye una de las actividades por un método asíncrono. Para implementar la aplicación, cree una copia del paquete helloWorld.HelloWorldWorkflow en el directorio de proyectos y asígnele el nombre helloWorld.HelloWorldWorkflowAsync.
nota
En este tema se basa en los conceptos y los archivos que se presentan en los temas Aplicación HelloWorld y HelloWorldWorkflow Solicitud. Familiarizarse con los archivos y conceptos que se presentan en estos temas antes de continuar.
Las siguientes secciones describen cómo modificar el código HelloWorldWorkflow original para utilizar un método asíncrono.
Implementación de actividades de HelloWorldWorkflowAsync
HelloWorldWorkflowAsync implementa su interfaz del proceso de trabajo de actividades en GreeterActivities
, de la siguiente manera:
import com.amazonaws.services.simpleworkflow.flow.annotations.Activities; import com.amazonaws.services.simpleworkflow.flow.annotations.ActivityRegistrationOptions; @Activities(version="2.0") @ActivityRegistrationOptions(defaultTaskScheduleToStartTimeoutSeconds = 300, defaultTaskStartToCloseTimeoutSeconds = 10) public interface GreeterActivities { public String getName(); public void say(String what); }
Esta interfaz es similar a la que utiliza HelloWorldWorkflow, con las siguientes excepciones:
-
Omite la actividad
getGreeting
; esa tarea la realiza ahora un método asíncrono. -
El número de versión se establece en 2.0. Una vez que haya registrado una interfaz de actividades con Amazon SWF, no podrá modificarla a menos que cambie el número de versión.
Las implementaciones de métodos de actividades restantes son idénticas a las de HelloWorldWorkflow. Simplemente elimine getGreeting
de GreeterActivitiesImpl
.
Implementación de flujos de trabajo de HelloWorldWorkflowAsync
HelloWorldWorkflowAsync define la interfaz de flujo de trabajo de 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 = "2.0") public void greet(); }
La interfaz es idéntica a HelloWorldWorkflow salvo por un número de versión nuevo. Al igual que ocurre con las actividades, si desea cambiar un flujo de trabajo registrado, tiene que cambiar su versión.
HelloWorldWorkflowAsync implementa el flujo de trabajo de la siguiente manera:
import com.amazonaws.services.simpleworkflow.flow.annotations.Asynchronous; import com.amazonaws.services.simpleworkflow.flow.core.Promise; public class GreeterWorkflowImpl implements GreeterWorkflow { private GreeterActivitiesClient operations = new GreeterActivitiesClientImpl(); @Override public void greet() { Promise<String> name = operations.getName(); Promise<String> greeting = getGreeting(name); operations.say(greeting); } @Asynchronous private Promise<String> getGreeting(Promise<String> name) { String returnString = "Hello " + name.get() + "!"; return Promise.asPromise(returnString); } }
HelloWorldWorkflowAsync sustituye la actividad getGreeting
por un método asíncrono getGreeting
, pero el método greet
funciona de manera muy similar:
-
Ejecute la actividad
getName
, lo cual devuelve inmediatamente un objetoPromise<String>
,name
, que representa el nombre. -
Llame al método asíncrono
getGreeting
y pásele el objetoname
.getGreeting
devuelve inmediatamente un objetoPromise<String>
,greeting
, que representa el saludo. -
Ejecute la actividad
say
y pásele el objetogreeting
. -
Una vez que se completa
getName
,name
pasa a estar listo ygetGreeting
utiliza su valor para construir el saludo. -
Una vez que
getGreeting
finaliza,greeting
está listo ysay
imprime la cadena en la consola.
La diferencia está en que, en lugar de llamar al cliente de actividades para ejecutar una actividad getGreeting
, el saludo llama al método asíncrono getGreeting
. El resultado final es el mismo, pero el método getGreeting
funciona de manera algo diferente a la actividad getGreeting
.
-
El proceso de trabajo de flujo de trabajo utiliza la semántica de llamada de función estándar para ejecutar
getGreeting
. No obstante, Amazon SWF actúa como intermediario en la ejecución asíncrona de la actividad. -
getGreeting
ejecuta el proceso de implementación del flujo de trabajo. -
getGreeting
devuelve un objetoPromise<String>
en lugar de un objetoString
. Para obtener el valor de la cadena contenido enPromise
, usted tendrá que llamar a su métodoget()
. No obstante, dado que la actividad se ejecuta de manera asíncrona, su valor de retorno podría no estar listo inmediatamente;get()
producirá una excepción hasta que el valor de retorno del método asíncrono esté disponible.Para obtener más información sobre cómo funciona
Promise
, consulte Conceptos básicos de AWS Flow Framework: intercambio de datos entre actividades y flujos de trabajo.
getGreeting
crea un valor de retorno pasando la cadena del saludo al método estático Promise.asPromise
. Este método crea un objeto Promise<T>
del tipo apropiado, establece el valor y lo pone en el estado listo.
Flujo de trabajo de HelloWorldWorkflowAsync e iniciador y host de actividades
HelloWorldWorkflowAsync implementa GreeterWorker
como la clase de host para implementaciones de flujo de trabajo y de actividad. Es idéntica a la implementación de HelloWorldWorkflow salvo por el nombre taskListToPoll
, que se establece en "HelloWorldAsyncList
".
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 = "HelloWorldAsyncList"; 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(); } }
HelloWorldWorkflowAsync implementa el iniciador del flujo de trabajo en GreeterMain
; es idéntica a la implementación de HelloWorldWorkflow.
Para ejecutar el flujo de trabajo, ejecute GreeterWorker
y GreeterMain
, de la misma manera que con HelloWorldWorkflow.