Execução de programas escritos com o AWS Flow Framework para Java - 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á.

Execução de programas escritos com o AWS Flow Framework para Java

A estrutura fornece classes de trabalho para inicializar o AWS Flow Framework para o tempo de execução do Java e se comunicar com o Amazon SWF. Para implementar um fluxo de trabalho ou um operador de atividade, você deve criar e iniciar uma instância de uma classe de operador. Essas classes de trabalho são responsáveis pelo gerenciamento de operações assíncronas em andamento, pela invocação de métodos assíncronos que se tornam desbloqueados e pela comunicação com o Amazon SWF. Elas podem ser configuradas com implementações de fluxo de trabalho e de atividades, o número de threads, a lista de tarefas para consulta etc.

A estrutura é fornecida com duas classes de operador, uma para atividades e uma para fluxos de trabalho. Para executar a lógica do fluxo de trabalho, use a classe WorkflowWorker. De modo semelhante, para atividades a classe ActivityWorker é usada. Essas classes pesquisam automaticamente o Amazon SWF em busca de tarefas de atividade e invocam os métodos apropriados em sua implementação.

O exemplo a seguir mostra como instanciar um WorkflowWorker e iniciar a pesquisa de tarefas:

AmazonSimpleWorkflow swfClient = new AmazonSimpleWorkflowClient(awsCredentials); WorkflowWorker worker = new WorkflowWorker(swfClient, "domain1", "tasklist1"); // Add workflow implementation types worker.addWorkflowImplementationType(MyWorkflowImpl.class); // Start worker worker.start();

As etapas básicas para criar uma instância do ActivityWorker e iniciar a pesquisa de tarefas são:

AmazonSimpleWorkflow swfClient = new AmazonSimpleWorkflowClient(awsCredentials); ActivityWorker worker = new ActivityWorker(swfClient, "domain1", "tasklist1"); worker.addActivitiesImplementation(new MyActivitiesImpl()); // Start worker worker.start();

Quando você quiser encerrar uma atividade ou um decodificador, seu aplicativo deverá encerrar as instâncias das classes de trabalho que estão sendo usadas, bem como a instância do cliente Java do Amazon SWF. Isso garante que todos os recursos usados pelas classes de operador sejam liberados corretamente.

worker.shutdown(); worker.awaitTermination(1, TimeUnit.MINUTES);

Para iniciar uma execução, simplesmente crie uma instância do cliente externo gerado e chame o método @Execute.

MyWorkflowClientExternalFactory factory = new MyWorkflowClientExternalFactoryImpl(); MyWorkflowClientExternal client = factory.getClient(); client.start();

WorkflowWorker

Como o nome sugere, essa classe de operador tem o objetivo de ser usada pela implementação do fluxo de trabalho. É configurada com uma lista de tarefas e o tipo de implementação de fluxo de trabalho. A classe de operador executa um loop para pesquisar tarefas de decisão na lista de tarefas especificada. Quando uma tarefa de decisão é recebida, ela cria uma instância da implementação do fluxo de trabalho e chama o método @Execute para processar a tarefa.

ActivityWorker

Para implementar operadores de atividades, você pode usar a classe ActivityWorker para pesquisar tarefas de atividades convenientemente em uma lista de tarefas. Você configura o operador de atividades com objetos da implementação da atividade. Essa classe de operador executa um loop para pesquisar tarefas de atividades na lista de tarefas especificada. Quando uma tarefa de atividade é recebida, ela procura a implementação apropriada que você forneceu e chama o método de atividade para processar a tarefa. Ao contrário de WorkflowWorker, que chama uma a fábrica para criar uma nova instância para cada tarefa de decisão, o ActivityWorker simplesmente usa o objeto que você forneceu.

A classe ActivityWorker usa o AWS Flow Framework para anotações Java para determinar as opções de registro e execução.

Modelo de threading de operador

No AWS Flow Framework para Java, a incorporação de uma atividade ou decisão é uma instância da classe worker. O aplicativo é responsável por configurar e instanciar o objeto de operador em cada máquina e processo que deve atuar como um operador. O objeto worker recebe automaticamente as tarefas do Amazon SWF, despacha-as para sua atividade ou implementação de fluxo de trabalho e informa os resultados ao Amazon SWF. É possível que uma única instância de fluxo de trabalho abranja vários operadores. Quando o Amazon SWF tem uma ou mais tarefas de atividade pendentes, ele atribui uma tarefa ao primeiro trabalhador disponível, depois ao próximo, e assim por diante. Isso possibilita que tarefas que pertencem à mesma instância de fluxo de trabalho sejam processadas simultaneamente em diferentes operadores.

Topologia do AWS Flow Framework para aplicativos baseados em Java

Além disso, cada operador pode ser configurado para processar tarefas em vários threads. Isso significa que as tarefas de atividades de uma instância de fluxo de trabalho podem ser executadas simultaneamente mesmo que haja apenas um operador.

As tarefas de decisão se comportam de forma semelhante, com a exceção de que o Amazon SWF garante que, para uma determinada execução de fluxo de trabalho, apenas uma decisão pode ser executada por vez. Normalmente, uma única execução de fluxo de trabalho exige várias tarefas de decisão, portanto, ela pode acabar executando em vários processos e threads também. O agente de decisão é configurado com o tipo da implementação do fluxo de trabalho. Quando uma tarefa de decisão é recebida pelo agente de decisão, ele cria uma instância (objeto) da implementação do fluxo de trabalho. A estrutura fornece um padrão de fábrica extensível para criar essas instâncias. A fábrica de fluxo de trabalho padrão cria um novo objeto todas as vezes. Você pode fornecer fábricas personalizadas para substituir esse comportamento.

Ao contrário dos agentes de decisão, que são pré-configurados com tipos de implementação de fluxo de trabalho, os operadores de atividades são configurados com instâncias (objetos) das implementações de atividade. Quando uma tarefa de atividade é recebida pelo operador de atividades, ela é despachada para o objeto adequado da implementação de atividade.

Modelo de threading de classes de operador

O trabalhador do fluxo de trabalho mantém um único pool de threads e executa o fluxo de trabalho no mesmo thread que foi usado para pesquisar o Amazon SWF para a tarefa. Como as atividades são de longa duração (pelo menos quando comparadas à lógica do fluxo de trabalho), a classe de trabalho de atividade mantém dois pools separados de threads; um para pesquisar o Amazon SWF para tarefas de atividade e o outro para processar tarefas executando a implementação da atividade. Isso permite que você configure o número de threads para pesquisa de tarefas separado do número de threads para execução de tarefas. Por exemplo, você pode ter um pequeno número de threads para pesquisar um grande número de threads para executar as tarefas. A classe activity worker pesquisa o Amazon SWF para uma tarefa somente quando tiver um thread de pesquisa livre, bem como um thread livre para processar a tarefa.

Esse comportamento de thread e de instância sugere que:

  1. As implementações de atividades devem ser stateless. Você não deve usar variáveis de instância para armazenar o estado do aplicativo em objetos de atividade. Você pode, porém, usar campos para armazenar recursos, como conexões de banco de dados.

  2. As implementações de atividades devem ser livres de thread. Como a mesma instância pode ser usada para processar tarefas em threads diferentes ao mesmo tempo, o acesso a recursos compartilhados do código de atividade deve ser sincronizado.

  3. A implementação de fluxo de trabalho pode ser stateful, e as variáveis de instância podem ser usadas para armazenar o estado. Embora uma nova instância da implementação de fluxo de trabalho seja criada para processar cada tarefa de decisão, a estrutura garantirá que o estado seja recriado adequadamente. No entanto, a implementação do fluxo de trabalho deve ser determinista. Consulte a seção Nos bastidores para obter mais detalhes.

  4. As implementações de fluxo de trabalho não precisam estar livres de thread ao usar a fábrica padrão. A implementação padrão garante que apenas um thread usa uma instância da implementação de fluxo de trabalho de cada vez.

Extensibilidade de operadores

O AWS Flow Framework para Java também contém algumas classes de trabalho de baixo nível que oferecem controle refinado e extensibilidade. Usando-as, você pode personalizar totalmente o registro dos tipos de fluxo de trabalho e de atividades e definir fábricas criando objetos de implementação. Esses operadores são GenericWorkflowWorker e GenericActivityWorker.

O GenericWorkflowWorker pode ser configurado com uma fábrica para criar fábricas de definição de fluxo de trabalho. A fábrica de definição de fluxo de trabalho é responsável por criar instâncias da implementação de fluxo de trabalho e por fornecer definições de configuração, como opções de registro. Em condições normais, você deve usar a classe WorkflowWorker diretamente. Ela criará e configurará automaticamente a implementação das fábricas fornecidas na estrutura, POJOWorkflowDefinitionFactoryFactory e POJOWorkflowDefinitionFactory. A fábrica exige que a classe de implementação de fluxo de trabalho deve ter um construtor sem argumentos. Esse construtor é usado para criar instâncias do objeto de fluxo de trabalho em tempo de execução. A fábrica procura as anotações que você usou na interface e na implementação do fluxo de trabalho para criar opções adequadas de registro e de execução.

Você pode fornecer sua própria implementação das fábricas implementando WorkflowDefinitionFactoryFactory, WorkflowDefinitionFactory e WorkflowDefinition. A classe WorkflowDefinition é usada pela classe do operador para despachar tarefas de decisão e sinais. Com a implementação dessas classes base, você pode personalizar totalmente a fábrica e a expedição de solicitações para a implementação de fluxo de trabalho. Por exemplo, você pode usar esses pontos de extensibilidade para fornecer um modelo de programação personalizado para escrever fluxos de trabalho, por exemplo, com base em suas próprias anotações, ou em gerá-los no WSDL em vez da primeira abordagem de código usada pela estrutura. Para usar suas fábricas personalizadas, você precisará usar a classe GenericWorkflowWorker. Para obter mais detalhes sobre essas classes, consulte a documentação do AWS SDK for Java.

Da mesma forma, o GenericActivityWorker permite que você forneça uma fábrica personalizada de implementação de atividades. Com a implementação das classes ActivityImplementationFactory e ActivityImplementation você pode controlar completamente a instanciação de atividades bem como personalizar as opções de registro e de execução. Para obter mais detalhes dessas classes, consulte a documentação do AWS SDK for Java.