La AWS SDK for Java 1.x se alcanzó end-of-support el 31 de diciembre de 2025. Le recomendamos que migre a AWS SDK for Java 2.x para seguir recibiendo nuevas características, mejoras de disponibilidad y actualizaciones de seguridad.
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.
LambdaTareas de
Como alternativa a las actividades de Amazon SWF, o en combinación con ellas, puede utilizar funciones Lambda
Este tema se centra en cómo implementar tareas Amazon SWF Lambda mediante AWS SDK for Java. Para obtener más información acerca de las tareas de Lambda, consulte Tareas AWS Lambda en la Guía para desarrolladores de Amazon SWF.
Configuración de un rol de IAM de varios servicios para ejecutar su función Lambda
Para que Amazon SWF pueda ejecutar su función Lambda, debe configurar un rol de IAM para conceder a Amazon SWF permiso para ejecutar funciones Lambda en su nombre. Para obtener información completa al respecto, consulte AWS LambdaTareas de .
Necesitará el Nombre de recurso de Amazon (ARN) de este rol de IAM cuando registre un flujo de trabajo que utilice tareas de Lambda.
Crear una función de Lambda
Puede crear funciones Lambda en diferentes lenguajes, incluido Java. Para obtener información completa sobre cómo crear, implementar y utilizar funciones Lambda, consulte la AWS LambdaGuía para desarrolladores de .
nota
Independientemente del lenguaje que use para crear la función Lambda, puede programarla y ejecutarla mediante cualquier flujo de trabajo de Amazon SWF, sea cual sea el lenguaje en el que esté escrito el código del flujo de trabajo. Amazon SWF se encarga de los detalles de la ejecución de la función y de pasar los datos.
A continuación se incluye una función Lambda sencilla que se puede utilizar en lugar de la actividad que se indica en Creación de una aplicación de Amazon SWF sencilla.
-
Esta versión está escrita en JavaScript y se puede introducir directamente con la Consola de administración de AWS
: exports.handler = function(event, context) { context.succeed("Hello, " + event.who + "!"); }; -
Esta es la misma función escrita en Java, que también podría implementar y ejecutar en Lambda:
package example.swf.hellolambda; import com.amazonaws.services.lambda.runtime.Context; import com.amazonaws.services.lambda.runtime.RequestHandler; import com.amazonaws.util.json.JSONException; import com.amazonaws.util.json.JSONObject; public class SwfHelloLambdaFunction implements RequestHandler<Object, Object> { @Override public Object handleRequest(Object input, Context context) { String who = "{SWF}"; if (input != null) { JSONObject jso = null; try { jso = new JSONObject(input.toString()); who = jso.getString("who"); } catch (JSONException e) { e.printStackTrace(); } } return ("Hello, " + who + "!"); } }nota
Para obtener más información acerca de la implementación de funciones Java en Lambda, consulte Creación de un cómo crear un paquete de implementación (Java) en la Guía para desarrolladores de AWS Lambda. Puede consultar también la sección sobre cómo programar modelos de programación para crear funciones Lambda en Java.
Las funciones Lambda toman un evento u objeto de entrada como el primer parámetro y un objeto de contexto como el segundo, que proporciona información sobre la solicitud para ejecutar la función Lambda. Esta función en concreto espera que la entrada esté en formato JSON, con un campo who establecido en el nombre usado para crear el saludo.
Registrar un flujo de trabajo para su uso con Lambda
Para que un flujo de trabajo programe una función Lambda, debe proporcionar el nombre del rol de IAM que proporciona Amazon SWF con permiso para invocar funciones Lambda. Puede definir esto durante el registro del flujo de trabajo mediante los métodos withDefaultLambdaRole o setDefaultLambdaRole de RegisterWorkflowTypeRequest.
System.out.println("** Registering the workflow type '" + WORKFLOW + "-" + WORKFLOW_VERSION + "'."); try { swf.registerWorkflowType(new RegisterWorkflowTypeRequest() .withDomain(DOMAIN) .withName(WORKFLOW) .withDefaultLambdaRole(lambda_role_arn) .withVersion(WORKFLOW_VERSION) .withDefaultChildPolicy(ChildPolicy.TERMINATE) .withDefaultTaskList(new TaskList().withName(TASKLIST)) .withDefaultTaskStartToCloseTimeout("30")); } catch (TypeAlreadyExistsException e) {
Programación de una tarea de Lambda
Programar un tarea de Lambda es similar a programar una actividad. Usted proporciona una Decisión con un DecisionType `ScheduleLambdaFunction` y con ScheduleLambdaFunctionDecisionAttributes.
running_functions == 0 && scheduled_functions == 0) { AWSLambda lam = AWSLambdaClientBuilder.defaultClient(); GetFunctionConfigurationResult function_config = lam.getFunctionConfiguration( new GetFunctionConfigurationRequest() .withFunctionName("HelloFunction")); String function_arn = function_config.getFunctionArn(); ScheduleLambdaFunctionDecisionAttributes attrs = new ScheduleLambdaFunctionDecisionAttributes() .withId("HelloFunction (Lambda task example)") .withName(function_arn) .withInput(workflow_input); decisions.add(
En ScheduleLambdaFuntionDecisionAttributes debe proporcionar un nombre, que es el ARN de la función Lambda que se va a llamar, y un id, que es el nombre que Amazon SWF usará para identificar la función Lambda en los registros del historial.
También puede proporcionar una entrada opcional para la función Lambda y establecer su valor de tiempo de espera de inicio a cierre, que es el número de segundos que la función Lambda se puede ejecutar antes de generar un evento LambdaFunctionTimedOut.
nota
Este código utiliza AWSLambdaClient para recuperar el ARN de la función Lambda, dado el nombre de la función. Puede utilizar esta técnica para evitar codificar de forma rígida el ARN completo (que incluye el ID de Cuenta de AWS) en el código.
Controlar eventos de funciones de Lambda en su decisor
Las tareas de Lambda generarán una serie de eventos a partir de los cuales puede emprender acciones cuando se sondeen las tareas de decisión en el proceso de trabajo de flujo de trabajo, correspondientes al ciclo de vida de su tarea de Lambda, con valores de EventType como LambdaFunctionScheduled, LambdaFunctionStarted y LambdaFunctionCompleted. Si la función Lambda produce un error o tarda más tiempo en ejecutarse que el valor de tiempo de espera establecido, recibirá un tipo de evento LambdaFunctionFailed o LambdaFunctionTimedOut, respectivamente.
boolean function_completed = false; String result = null; System.out.println("Executing the decision task for the history events: ["); for (HistoryEvent event : events) { System.out.println(" " + event); EventType event_type = EventType.fromValue(event.getEventType()); switch(event_type) { case WorkflowExecutionStarted: workflow_input = event.getWorkflowExecutionStartedEventAttributes() .getInput(); break; case LambdaFunctionScheduled: scheduled_functions++; break; case ScheduleLambdaFunctionFailed: scheduled_functions--; break; case LambdaFunctionStarted: scheduled_functions--; running_functions++; break; case LambdaFunctionCompleted: running_functions--; function_completed = true; result = event.getLambdaFunctionCompletedEventAttributes() .getResult(); break; case LambdaFunctionFailed: running_functions--; break; case LambdaFunctionTimedOut: running_functions--; break;
Recibir la salida de su función Lambda
Cuando recibe un LambdaFunctionCompleted`EventType, you can retrieve your 0— function’s return value by first calling `getLambdaFunctionCompletedEventAttributes en el HistoryEvent para obtener un objeto LambdaFunctionCompletedEventAttributes, y luego llamar a su método getResult para recuperar la salida de la función Lambda:
LambdaFunctionCompleted: running_functions--;
Código fuente completo de este ejemplo
Puede buscar el código fuente completo :github:<awsdocs/aws-java-developer-guide/tree/master/doc_source/snippets/helloswf_lambda/> de este ejemplo en Github en el repositorio aws-java-developer-guide.