

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á.

# Como criar uma máquina de estado de Atividade usando o Step Functions
<a name="tutorial-creating-activity-state-machine"></a>

Este tutorial mostra como criar uma máquina de estado baseada em atividade que usa Java e o AWS Step Functions. As atividades permitem que você controle o código de operador que é executado em outro lugar em sua máquina de estado. Para obter uma visão geral, consulte [Saiba mais sobre atividades no Step Functions.](concepts-activities.md) em [Saiba mais sobre máquinas de estado no Step Functions.](concepts-statemachines.md). 

Para concluir este tutorial, você precisará do seguinte:
+ O [SDK para Java](https://aws.amazon.com/sdk-for-java/). O exemplo de atividade neste tutorial é um aplicativo Java que usa o AWS SDK para Java para se comunicar com AWS.
+ AWS credenciais no ambiente ou no arquivo de AWS configuração padrão. Para obter mais informações, consulte [Configurar suas AWS credenciais](https://docs.aws.amazon.com/AWSSdkDocsJava/latest/DeveloperGuide/set-up-creds.html) no *Guia do AWS SDK para Java desenvolvedor*.

## Etapa 1: Criar uma atividade
<a name="create-activity-state-machine-step-1"></a>

Você deve informar o Step Functions sobre a *atividade* cujo *operador* (um programa) que você deseja criar. O Step Functions responde com um nome do recurso da Amazon (ARN) que estabelece uma identidade para a atividade. Use essa identidade para coordenar as informações passadas entre sua máquina de estado e o operador.

**Importante**  
Certifique-se de que sua tarefa de atividade esteja na mesma AWS conta da sua máquina de estado.

1. No [console do Step Functions](https://console.aws.amazon.com/states/home), no painel de navegação à esquerda, escolha **Atividades**.

1. Escolha **Create activity** (Criar atividade).

1. Insira um **Nome** para a atividade, como `get-greeting` por exemplo, e escolha **Criar atividade**.

1. Quando sua tarefa de atividade for criada, anote seu ARN, conforme mostrado no exemplo a seguir.

   ```
   arn:aws:states:region:123456789012:activity:get-greeting
   ```

## Etapa 2: Criar uma máquina de estado
<a name="create-activity-state-machine-step-2"></a>

Crie uma máquina de estado que determine quando sua atividade é invocada e quando o operador deve executar seu trabalho principal, coletar os respectivos resultados e retorná-los. Para criar a máquina de estado, você vai usar o [Editor de código](workflow-studio.md#wfs-interface-code-editor) do Workflow Studio.

1. No [console do Step Functions](https://console.aws.amazon.com/states/home), no painel de navegação à esquerda, escolha **Máquinas de estado**.

1. Na página **Máquinas de estado**, selecione **Criar máquina de estado**.

1. Selecione **Criar do zero**.

1. Nomeie sua máquina de estado e clique em **Continuar** para editá-la no Workflow Studio.

1. Neste tutorial, você vai escrever a definição da [Amazon States Language](concepts-amazon-states-language.md) (ASL) da máquina de estado no editor de código. Para isso, clique em **Código**.

1. Remova o código clichê existente e cole o código a seguir. Substitua o ARN de exemplo no campo `Resource` pelo ARN da tarefa de atividade criada anteriormente em [Etapa 1: Criar uma atividade](#create-activity-state-machine-step-1).

   ```
   {
     "Comment": "An example using a Task state.",
     "StartAt": "getGreeting",
     "Version": "1.0",
     "TimeoutSeconds": 300,
     "States":
     {
       "getGreeting": {
         "Type": "Task",
         "Resource": "arn:aws:states:region:123456789012:activity:get-greeting",
         "End": true
       }
     }
   }
   ```

   Essa é a descrição de sua máquina de estado usando o [Amazon States Language](concepts-amazon-states-language.md) (ASL). Ela define um estado `Task` específico denominado `getGreeting`. Para obter mais informações, consulte [Estrutura da máquina de estado](statemachine-structure.md).

1. No [Visualização de grafos](workflow-studio.md#wfs-interface-code-graph-viz), o gráfico do fluxo de trabalho para a definição de ASL que você adicionou deve ser semelhante ao gráfico a seguir.  
![\[Visualização gráfica da máquina de estado com o estado da RunActivity tarefa.\]](http://docs.aws.amazon.com/pt_br/step-functions/latest/dg/images/tutorial-create-state-machine-custom-preview.png)

1. Especifique um nome para a máquina de estado. Para fazer isso, escolha o ícone de edição ao lado do nome padrão da máquina de estado de **MyStateMachine**. Em seguida, em **Configuração da máquina de estado**, insira um nome na caixa **Nome da máquina de estado**.

   Para este tutorial, insira o nome **ActivityStateMachine**.

1. (Opcional) Em **Configuração da máquina de estado**, especifique outras configurações do fluxo de trabalho, como o tipo de máquina de estado e a função de execução.

   Para este tutorial, mantenha todas as seleções padrão nas **Configurações da máquina de estado**.

   Se você [já criou um perfil do IAM](procedure-create-iam-role.md) com as permissões corretas para a máquina de estado e deseja usá-lo, em **Permissões**, clique em **Escolher um perfil existente** e selecione uma função na lista. Ou selecione **Inserir um ARN de função** e forneça o ARN para esse perfil do IAM.

1. Na caixa de diálogo **Confirmar criação do perfil**, selecione **Confirmar** para continuar.

   Você também pode escolher **Exibir configurações do perfil** para voltar às **Configurações da máquina de estado**.
**nota**  
Se você excluir o perfil do IAM criado pelo Step Functions, não será possível recriá-lo posteriormente. Da mesma forma, se você modificar a função (por exemplo, removendo o Step Functions das entidades principais na política do IAM), o Step Functions não poderá restaurar as configurações originais dela posteriormente. 

## Etapa 3: Implementar um operador
<a name="create-activity-state-machine-step-3"></a>

Crie um *operador*. Um operador é um programa que é responsável por:
+ Sonde o Step Functions para atividades usando a ação da API `GetActivityTask`.
+ Executar o trabalho da atividade usando seu código (por exemplo, o método `getGreeting()` no código a seguir).
+ Retornar os resultados usando as ações de API `SendTaskSuccess`, `SendTaskFailure`e `SendTaskHeartbeat`.

**nota**  
Para um exemplo mais completo de um operador de atividade, consulte [Exemplo: operador de atividade em Ruby](concepts-activities.md#example-ruby-activity-worker). Esse exemplo fornece uma implementação baseada em melhores práticas, que você pode usar como referência para seu operador de atividade. O código implementa um padrão de produtor-consumidor com um número configurável de threads para agentes de sondagem e operadores de atividade. 

### Para implementar o operador
<a name="create-activity-state-machine-implement-worker"></a>

1. Crie um arquivo chamado `GreeterActivities.java`.

1. Adicione a ele o código a seguir.

   ```
   import com.amazonaws.ClientConfiguration;
   import com.amazonaws.auth.EnvironmentVariableCredentialsProvider;
   import com.amazonaws.regions.Regions;
   import com.amazonaws.services.stepfunctions.AWSStepFunctions;
   import com.amazonaws.services.stepfunctions.AWSStepFunctionsClientBuilder;
   import com.amazonaws.services.stepfunctions.model.GetActivityTaskRequest;
   import com.amazonaws.services.stepfunctions.model.GetActivityTaskResult;
   import com.amazonaws.services.stepfunctions.model.SendTaskFailureRequest;
   import com.amazonaws.services.stepfunctions.model.SendTaskSuccessRequest;
   import com.amazonaws.util.json.Jackson;
   import com.fasterxml.jackson.databind.JsonNode;
   import java.util.concurrent.TimeUnit;
   
   
   public class GreeterActivities {
   
       public String getGreeting(String who) throws Exception {
           return "{\"Hello\": \"" + who + "\"}";
       }
   
       public static void main(final String[] args) throws Exception {
           GreeterActivities greeterActivities = new GreeterActivities();
           ClientConfiguration clientConfiguration = new ClientConfiguration();
           clientConfiguration.setSocketTimeout((int)TimeUnit.SECONDS.toMillis(70));
   
           AWSStepFunctions client = AWSStepFunctionsClientBuilder.standard()
                   .withRegion(Regions.US_EAST_1)
                   .withCredentials(new EnvironmentVariableCredentialsProvider())
                   .withClientConfiguration(clientConfiguration)
                   .build();
   
           while (true) {
               GetActivityTaskResult getActivityTaskResult =
                       client.getActivityTask(
                               new GetActivityTaskRequest().withActivityArn(ACTIVITY_ARN));
   
               if (getActivityTaskResult.getTaskToken() != null) {
                   try {
                       JsonNode json = Jackson.jsonNodeOf(getActivityTaskResult.getInput());
                       String greetingResult =
                               greeterActivities.getGreeting(json.get("who").textValue());
                       client.sendTaskSuccess(
                               new SendTaskSuccessRequest().withOutput(
                                       greetingResult).withTaskToken(getActivityTaskResult.getTaskToken()));
                   } catch (Exception e) {
                       client.sendTaskFailure(new SendTaskFailureRequest().withTaskToken(
                               getActivityTaskResult.getTaskToken()));
                   }
               } else {
                   Thread.sleep(1000);
               }
           }
       }
   }
   ```
**nota**  
Nesse exemplo, a classe `EnvironmentVariableCredentialsProvider` assume as variáveis de ambiente `AWS_ACCESS_KEY_ID` (ou `AWS_ACCESS_KEY`) e `AWS_SECRET_KEY` (ou `AWS_SECRET_ACCESS_KEY`). Para obter mais informações sobre como fornecer as credenciais necessárias para a fábrica, consulte [AWSCredentialsProvedor](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/auth/AWSCredentialsProvider.html) na *Referência da AWS SDK para Java API* e [Configurar AWS credenciais e região para desenvolvimento no Guia](https://docs.aws.amazon.com/sdk-for-java/v1/developer-guide/setup-credentials.html) do *AWS SDK para Java desenvolvedor*.  
Por padrão, o AWS SDK aguardará até 50 segundos para receber dados do servidor para qualquer operação. A operação `GetActivityTask` é uma operação de sondagem longa que aguardará até 60 segundos para a próxima tarefa disponível. Para evitar o recebimento de um `SocketTimeoutException` erro, SocketTimeout defina para 70 segundos.

1. Na lista de parâmetros do construtor `GetActivityTaskRequest().withActivityArn()`, substitua o valor `ACTIVITY_ARN` pelo ARN da tarefa de atividade criada anteriormente em [Etapa 1: Criar uma atividade](#create-activity-state-machine-step-1).

## Etapa 4: Executar a máquina de estado
<a name="create-activity-state-machine-step-4"></a>

Ao iniciar a execução da máquina de estado, o operador examina atividades no Step Functions, executa seu trabalho (usando a entrada que você fornece) e retorna os devidos resultados.

1. Na ***ActivityStateMachine***página, escolha **Iniciar execução**.

   A caixa de diálogo **Iniciar execução** é exibida.

1. Na caixa de diálogo **Iniciar execução**, faça o seguinte:

   1. (Opcional) Insira um nome de execução personalizado para substituir o padrão gerado.
**Nomes e registro em log não ASCII**  
O Step Functions aceita nomes de máquina de estado, execuções, atividades e rótulos que contenham caracteres não ASCII. Como esses caracteres impedirão que a Amazon CloudWatch registre dados, recomendamos usar somente caracteres ASCII para que você possa acompanhar as métricas do Step Functions.

   1. Na caixa **Entrada**, insira a seguinte entrada JSON para executar seu fluxo de trabalho.

      ```
      {
        "who": "AWS Step Functions"
      }
      ```

   1. Selecione **Iniciar execução**.

   1. O console do Step Functions direciona você para uma página em que o título é o ID da execução. Essa página é conhecida como página de *Detalhes da execução*. Nesta página, você pode revisar os resultados da execução à medida que a execução avança ou após a conclusão.

      Para revisar os resultados da execução, escolha estados individuais na **Exibição em gráfico** e, em seguida, escolha as guias individuais no painel [Detalhes da etapa](concepts-view-execution-details.md#exec-details-intf-step-details) para visualizar os detalhes de cada estado, incluindo entrada, saída e definição, respectivamente. Para obter detalhes sobre as informações de execução que você pode visualizar na página *Detalhes da execução*, consulte [Visão geral dos detalhes da execução](concepts-view-execution-details.md#exec-details-interface-overview).

## Etapa 5: Executar e interromper o operador
<a name="create-activity-state-machine-step-5"></a>

Para que o operador examine atividades em sua máquina de estado, você precisa executá-lo.

1. Na linha de comando, vá até o diretório em que você criou `GreeterActivities.java`.

1. Para usar o AWS SDK, adicione o caminho completo dos `third-party` diretórios `lib` e às dependências do seu arquivo de compilação e ao seu Java. `CLASSPATH` Para obter mais informações, consulte [Como fazer download e extrair o SDK](https://docs.aws.amazon.com/sdk-for-java/v1/developer-guide/setup-install.html#download-and-extract-sdk) no *Guia do desenvolvedor de AWS SDK para Java *.

1. Compile o arquivo.

   ```
   $ javac GreeterActivities.java
   ```

1. Execute o arquivo.

   ```
   $ java GreeterActivities
   ```

1. No [console do Step Functions](https://console.aws.amazon.com/states/home?region=us-east-1#/), vá até a página *Detalhes da execução*.

1. Quando a execução for concluída, examine os resultados da execução.

1. Interrompa o operador.