Contratos de atividades e de fluxo de trabalho - 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á.

Contratos de atividades e de fluxo de trabalho

As interfaces Java são usadas para declarar as assinaturas de fluxos de trabalho e de atividades. A interface forma o contrato entre a implementação do fluxo de trabalho (ou da atividade) e o cliente do fluxo de trabalho (ou da atividade). Por exemplo, um tipo de fluxo de trabalho MyWorkflow é definido usando uma interface anotada com a anotação @Workflow:

@Workflow @WorkflowRegistrationOptions( defaultExecutionStartToCloseTimeoutSeconds = 60, defaultTaskStartToCloseTimeoutSeconds = 10) public interface MyWorkflow { @Execute(version = "1.0") void startMyWF(int a, String b); @Signal void signal1(int a, int b, String c); @GetState MyWorkflowState getState(); }

O contrato não tem nenhuma configuração específica à implementação. O uso de contratos com neutralidade de implementação permite que os clientes sejam separados da implementação e, portanto, fornece a flexibilidade de alterar os detalhes da implementação sem interromper o cliente. Por outro lado, você também pode alterar o cliente sem precisar alterar o fluxo de trabalho ou a atividade que está sendo consumida. Por exemplo, o cliente pode ser modificado para chamar uma atividade de forma assíncrona usando promessas (Promise<T>) sem exigir uma alteração na implementação da atividade. Da mesma forma, a implementação da atividade pode ser alterada para que seja concluída de forma assíncrona, por exemplo, por uma pessoa que envia um e-mail, sem exigir que os clientes da atividade sejam alterados.

No exemplo acima, a interface do fluxo de trabalho MyWorkflow contém um método, startMyWF, para iniciar uma nova execução. O método é anotado com a anotação @Execute e deve ter um tipo de retorno de void ou Promise<>. Em uma determinada interface de fluxo de trabalho, no máximo um método poder ser anotado com essa anotação. O método é o ponto de entrada da lógica do fluxo de trabalho, e a estrutura chama esse método para executar a lógica do fluxo de trabalho quando uma tarefa de decisão é recebida.

A interface de fluxo de trabalho também define os sinais que podem ser enviados ao fluxo de trabalho. O método de sinal é invocado quando um sinal com um nome correspondente é recebido pela execução do fluxo de trabalho. Por exemplo, a interface de MyWorkflow declara um método de sinal, signal1, anotado com a anotação @Signal.

A anotação @Signal é necessária em métodos de sinal. O tipo de retorno de um método de sinal deve ser void. Uma interface de fluxo de trabalho pode ter zero ou mais métodos de sinal definidos nela. Você pode declarar uma interface de fluxo de trabalho sem um método @Execute e alguns métodos @Signal para gerar clientes que não podem iniciar sua execução, mas podem enviar sinais a execuções em execução.

Os métodos anotados com as anotações @Execute e @Signal podem ter qualquer número de parâmetros de qualquer tipo além de Promise<T> ou de seus derivados. Isso permite que você passe entradas fortemente tipadas para uma execução de fluxo de trabalho no início e durante sua execução. O tipo de retorno do método @Execute deve ser void ou Promise<>.

Além disso, também é possível declarar um método na interface de fluxo de trabalho para relatar o estado mais recente de uma execução de fluxo de trabalho, por exemplo, o método getState do exemplo anterior. Esse estado não é o estado inteiro do aplicativo de fluxo de trabalho. O uso pretendido desse recurso é permitir que você armazene até 32 KB de dados para indicar o status mais recente da execução. Por exemplo, em um fluxo de trabalho de processamento de pedido, você pode armazenar uma sequência que indique que o pedido foi recebido, processado ou cancelado. O método é chamado pela estrutura sempre que uma tarefa de decisão é concluída para obter o estado mais recente. O estado é armazenado no Amazon Simple Workflow Service (Amazon SWF) e pode ser recuperado usando o cliente externo gerado. Isso permite que você verifique o estado mais recente de uma execução de fluxo de trabalho. Os métodos anotados com @GetState não devem usar nenhum argumento e não devem ter um tipo de retorno void. Você pode retornar qualquer tipo que atenda às suas necessidades desse método. No exemplo acima, um objeto de MyWorkflowState (consulte a definição a seguir) é retornado pelo método que é usado para armazenar um estado de sequência e uma porcentagem numérica completos. Espera-se que o método execute o acesso de somente leitura do objeto de implementação de fluxo de trabalho e seja invocado de forma síncrona, o que não permite o uso de qualquer operação assíncrona, como a chamada de métodos anotados com @Asynchronous. No máximo um método em uma interface de fluxo de trabalho pode ser anotado com a anotação @GetState.

public class MyWorkflowState { public String status; public int percentComplete; }

Da mesma forma, um conjunto de atividades é definido usando uma interface anotada com a anotação @Activities. Cada método na interface corresponde a uma atividade - por exemplo:

@Activities(version = "1.0") @ActivityRegistrationOptions( defaultTaskScheduleToStartTimeoutSeconds = 300, defaultTaskStartToCloseTimeoutSeconds = 3600) public interface MyActivities { // Overrides values from annotation found on the interface @ActivityRegistrationOptions(description = "This is a sample activity", defaultTaskScheduleToStartTimeoutSeconds = 100, defaultTaskStartToCloseTimeoutSeconds = 60) int activity1(); void activity2(int a); }

A interface permite que você agrupe um conjunto de atividades relacionadas. Você pode definir qualquer número de atividades em uma interface de atividades e definir quantas interfaces de atividades desejar. Semelhante aos métodos @Execute e @Signal, os métodos de atividades podem usar qualquer número de argumentos de qualquer tipo diferente de Promise<T> ou de seus derivados. O tipo de retorno de uma atividade não deve ser Promise<T> ou seus derivados.