

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

# Implementação de atividades
<a name="activityimpl"></a>

As atividades são implementadas fornecendo uma implementação da interface `@Activities`. O AWS Flow Framework for Java usa as instâncias de implementação de atividades configuradas no trabalhador para processar tarefas de atividade em tempo de execução. O operador procura automaticamente a implementação de atividade do tipo apropriado. 

Você pode usar propriedades e campos para passar recursos para instâncias de atividades, como conexões de banco de dados. Como o objeto de implementação da atividade pode ser acessado de vários encadeamentos, os recursos compartilhados devem ser seguros para encadeamentos. 

Observe que a implementação de atividade não usa parâmetros do tipo `Promise<>` ou retorna objetos desse tipo. Porque a implementação da atividade não deve depender de como foi invocada (de forma síncrona ou assíncrona). 

A interface de atividades mostrada antes pode ser implementada da seguinte forma: 

```
public class MyActivitiesImpl implements MyActivities {

   @Override
   @ManualActivityCompletion
   public int activity1(){
      //implementation
   }

   @Override
   public void activity2(int foo){
     //implementation
   }
}
```

Um contexto local de thread está disponível para a implementação de atividade que pode ser usada para recuperar o objeto da tarefa, o objeto do conversor de dados que está sendo usado etc. O contexto atual pode ser acessado por meio do `ActivityExecutionContextProvider.getActivityExecutionContext()`. Para obter mais detalhes, consulte a AWS SDK para Java documentação `ActivityExecutionContext` e a seção[Contexto de execução](executioncontext.md). 

## Conclusão manual de atividades
<a name="activityimpl.complete"></a>

A anotação `@ManualActivityCompletion` no exemplo acima é uma anotação opcional. É permitida somente em métodos que implementam uma atividade e é usada para configurar a atividade para não ser concluída automaticamente quando o método de atividade é retornado. Isso pode ser útil quando você deseja concluir a atividade de forma assíncrona; por exemplo, manualmente após a conclusão de uma ação humana.

Por padrão, a estrutura considera a atividade concluída quando o método da atividade é retornado. Isso significa que o operador de atividade informa a conclusão da tarefa da atividade ao Amazon SWF e fornece os resultados (se houver). Contudo, há casos de uso em que você não deseja que a tarefa de atividade seja marcada como concluída quando o método da atividade é retornado. Isso é especialmente útil quando você está modelando tarefas humanas. Por exemplo, o método de atividade pode enviar um e-mail para uma pessoa que deve concluir um trabalho antes que a tarefa de atividade seja concluída. Nesses casos, você pode anotar o método de atividade com a anotação `@ManualActivityCompletion` para informar ao operador de atividades de que não deve concluir a atividade automaticamente. Para concluir a atividade manualmente, você pode usar o `ManualActivityCompletionClient` fornecido na estrutura ou usar o método `RespondActivityTaskCompleted` no cliente Java do Amazon SWF fornecido no SDK do Amazon SWF. Para obter mais detalhes, consulte a AWS SDK para Java documentação. 

Para concluir a tarefa de atividade, você precisa fornecer um token de tarefa. O token de tarefa é usado pelo Amazon SWF para identificar tarefas de forma exclusiva. Você pode acessar esse token no `ActivityExecutionContext` na implementação da atividade. Você deve passar esse token para a parte responsável por concluir a tarefa. Esse token pode ser recuperado do `ActivityExecutionContext` chamando `ActivityExecutionContextProvider.getActivityExecutionContext().getTaskToken()`.

A atividade `getName` do exemplo Hello World pode ser implementada para enviar um e-mail solicitando que alguém forneça uma mensagem de saudação:

```
@ManualActivityCompletion
@Override
public String getName() throws InterruptedException {
    ActivityExecutionContext executionContext
         = contextProvider.getActivityExecutionContext();
    String taskToken = executionContext.getTaskToken();
    sendEmail("abc@xyz.com",
         "Please provide a name for the greeting message and close task with token: " + taskToken);
    return "This will not be returned to the caller";
}
```

O trecho de código a seguir pode ser usado para fornecer a saudação e fechar a tarefa usando o `ManualActivityCompletionClient`. Como alternativa, você também pode reprovar a tarefa:

```
public class CompleteActivityTask {

    public void completeGetNameActivity(String taskToken) {

        AmazonSimpleWorkflow swfClient
           = new AmazonSimpleWorkflowClient(...); // use AWS access keys
        ManualActivityCompletionClientFactory manualCompletionClientFactory
           = new ManualActivityCompletionClientFactoryImpl(swfClient);
        ManualActivityCompletionClient manualCompletionClient
           = manualCompletionClientFactory.getClient(taskToken);
        String result = "Hello World!";
        manualCompletionClient.complete(result);
    }

    public void failGetNameActivity(String taskToken, Throwable failure) {
        AmazonSimpleWorkflow swfClient
           = new AmazonSimpleWorkflowClient(...); // use AWS access keys
        ManualActivityCompletionClientFactory manualCompletionClientFactory
           = new ManualActivityCompletionClientFactoryImpl(swfClient);
        ManualActivityCompletionClient manualCompletionClient
           = manualCompletionClientFactory.getClient(taskToken);
        manualCompletionClient.fail(failure);
    }
}
```