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 valoresPromise<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:
-
Execute a atividade
getName
, que retorna imediatamente um objetoPromise<String>
,name
, que representa o nome. -
Chame o método assíncrono
getGreeting
e envie-lhe o objetoname
.getGreeting
retorna imediatamente um objetoPromise<String>
,greeting
, que representa a saudação. -
Execute a atividade
say
e envie-lhe o objetogreeting
. -
Quando
getName
concluir,name
se torna pronto egetGreeting
usa o seu valor para construir a saudação. -
Quando
getGreeting
concluir,greeting
se torna pronto esay
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 objetoPromise<String>
em vez de um objetoString
. Para obter o valor da String mantida peloPromise
, chame o seu métodoget()
. Contudo, como a atividade está sendo executada de forma assíncrona, seu valor de retorno pode não estar pronto imediatamente. Oget()
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.