Aplicativo HelloWorldWorkflowAsync - AWS Flow Framework para Java

As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.

Aplicativo HelloWorldWorkflowAsync

Às vezes, é preferível que um fluxo de trabalho execute certas tarefas localmente em vez de usar uma atividade. No entanto, as tarefas do fluxo de trabalho geralmente envolvem o processamento dos valores representados pelos objetos Promise<T>. Se enviar um objeto Promise<T> para um método do fluxo de trabalho síncrono, o método executa imediatamente mas não é capaz de acessar o valor do objeto Promise<T> até que ele esteja pronto. Você pode consultar Promise<T>.isReady até ele retornar true, mas isso é ineficiente e o método pode ser bloqueado por um longo período. Uma abordagem melhor é usar um método assíncrono.

Um método assíncrono é implementado de forma muito semelhante a um método padrão, geralmente como membro da classe de implementação do fluxo de trabalho, e é executado no contexto da implementação do fluxo de trabalho. Designe-o como um método assíncrono aplicando uma anotação @Asynchronous, que direciona a estrutura para tratá-lo como uma atividade.

  • Quando uma implementação do fluxo de trabalho chama um método assíncrono, ele retorna imediatamente. Os métodos assíncronos geralmente retornam um objeto Promise<T>, o qual se torna pronto quando o método for concluído.

  • Se enviar um ou mais objetos Promise<T> para um método assíncrono, ele adia a execução até que todos os objetos de entrada estejam prontos. Um método assíncrono pode, portanto, acessar os valores Promise<T> da sua entrada sem risco de uma exceção.

nota

Devido à forma como o AWS Flow Framework para Java executa o fluxo de trabalho, os métodos assíncronos normalmente são executados várias vezes, portanto, você deve usá-los somente para tarefas rápidas e de baixo custo. Use atividades para executar tarefas longas como computações grandes. Para obter mais detalhes, consulte Conceitos básicos do AWS Flow Framework: Execução distribuída.

Este tópico é uma demonstração do HelloWorldWorkflowAsync, uma versão modificada do HelloWorldWorkflow que substitui uma das atividades por um método assíncrono. Para implementar o aplicativo, crie uma cópia do pacote helloWorld.HelloWorldWorkflow em seu diretório de projetos e chame-a de helloWorld.HelloWorldWorkflowAsync.

nota

Este tópico aprofunda os conceitos e arquivos apresentados nós tópicos Aplicativo HelloWorld e HelloWorldWorkflow Aplicação. Familiarize-se com os arquivos e os conceitos apresentados nesses tópicos antes de prosseguir.

As seções a seguir descrevem como modificar o código original do HelloWorldWorkflow para usar um método assíncrono.

Implementação das atividades do HelloWorldWorkflowAsync

O HelloWorldWorkflowAsync implementa sua interface do operador de atividades no GreeterActivities, da seguinte forma:

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); }

Essa interface é semelhante àquela usada pelo HelloWorldWorkflow, com as seguintes exceções:

  • Ela omite a atividade getGreeting. Essa tarefa agora é realizada por um método assíncrono.

  • O número da versão está definido como 2.0. Depois de registrar uma interface de atividades com o Amazon SWF, você não poderá modificá-la, a menos que altere o número da versão.

As implementações do método de atividade restantes são idênticas ao HelloWorldWorkflow. Apenas exclua getGreeting de GreeterActivitiesImpl.

Implementação do fluxo de trabalho do HelloWorldWorkflowAsync

O HelloWorldWorkflowAsync define a interface do fluxo de trabalho da seguinte forma:

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(); }

A interface é idêntica ao HelloWorldWorkflow, fora um novo número da versão. Como com as atividades, se desejar alterar um fluxo de trabalho registrado, é necessário alterar a sua versão.

O HelloWorldWorkflowAsync implementa o fluxo de trabalho da seguinte forma:

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); } }

O HelloWorldWorkflowAsync substitui a atividade getGreeting por um método assíncrono getGreeting mas o método greet funciona de forma semelhante:

  1. Execute a atividade getName, que retorna imediatamente um objeto Promise<String>, name, que representa o nome.

  2. Chame o método assíncrono getGreeting e envie-lhe o objeto name. getGreeting retorna imediatamente um objeto Promise<String>, greeting, que representa a saudação.

  3. Execute a atividade say e envie-lhe o objeto greeting.

  4. Quando getName concluir, name se torna pronto e getGreeting usa o seu valor para construir a saudação.

  5. Quando getGreeting concluir, greeting se torna pronto e say imprime a string no console.

A diferença é que, em vez de chamar o cliente de atividades para executar uma atividade getGreeting, a saudação chama o método assíncrono getGreeting. O resultado final é o mesmo, mas o método getGreeting funciona de forma um tanto diferente em relação à atividade getGreeting.

  • O operador do fluxo de trabalho utiliza a semântica de chamada de função padrão para executar o getGreeting. No entanto, a execução assíncrona da atividade é mediada pelo Amazon SWF.

  • getGreeting é executado no processo de implementação do fluxo de trabalho.

  • getGreeting retorna um objeto Promise<String> em vez de um objeto String. Para obter o valor da String mantida pelo Promise, chame o seu método get(). Contudo, como a atividade está sendo executada de forma assíncrona, seu valor de retorno pode não estar pronto imediatamente. O get() levantará uma exceção até que o valor de retorno do método assíncrono esteja disponível.

    Para obter mais informações sobre como o Promise funciona, consulte Conceitos básicos AWS Flow Framework: Intercâmbio de dados entre atividades e fluxos de trabalho.

O getGreeting cria um valor de retorno enviando a string de saudação para o método Promise.asPromise estático. Esse método cria um objeto Promise<T> do tipo apropriado, define o valor e coloca-o no estado pronto.

Host e acionador do fluxo de trabalho e das atividades do HelloWorldWorkflowAsync

O HelloWorldWorkflowAsync implementa GreeterWorker como a classe host para as implementações do fluxo de trabalho e das atividades. A implementação é idêntica à do HelloWorldWorkflow, exceto pelo nome taskListToPoll, que é definido como "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(); } }

O HelloWorldWorkflowAsync implementa o acionador do fluxo de trabalho em GreeterMain e é idêntico à implementação do HelloWorldWorkflow.

Para executar o fluxo de trabalho, execute GreeterWorker e GreeterMain, da mesma forma como no HelloWorldWorkflow.