Esecuzione di programmi scritti conAWS Flow Frameworkper Java - AWS Flow Framework per Java

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

Esecuzione di programmi scritti conAWS Flow Frameworkper Java

Il framework fornisceclassi di lavoratoreinizializzare ilAWS Flow Frameworkper il runtime Java e comunica con Amazon SWF. Per implementare un lavoratore di attività o di flusso di lavoro, devi creare e avviare un'istanza di una classe di lavoratore. Queste classi di lavoratore devono gestire le operazioni asincrone in corso, richiamare i metodi asincroni sbloccati e comunicare con Amazon SWF. Possono essere configurate con implementazioni di flusso di lavoro e attività, il numero di thread, l'elenco di task da sottoporre a polling e così via.

Il framework include due classi di lavoratore, una per le attività e l'altra per i flussi di lavoro. Per eseguire la logica di flusso di lavoro, devi utilizzare la classe WorkflowWorker. Per le attività, viene invece utilizzata la classe ActivityWorker. Queste classi eseguono automaticamente il poll di Amazon SWF per i task di attività in e richiamano i metodi appropriati nell'implementazione.

L'esempio seguente mostra come creare un'istanza di WorkflowWorker e avviare il polling dei task:

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

La procedura di base per creare un'istanza di ActivityWorker e avviare il polling dei task è la seguente:

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

Se intendi chiudere un'attività o un decisore, l'applicazione deve chiudere le istanze delle classi di lavoratore utilizzate nonché l'istanza del client Java di Amazon SWF Java. In questo modo, tutte le risorse utilizzate dalle classi di lavoratore vengono rilasciate correttamente.

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

Per avviare un'esecuzione, crea semplicemente un'istanza del client esterno generato e chiama il metodo @Execute.

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

WorkflowWorker

Come suggerisce il nome, questa classe di lavoratore è utilizzata dall'implementazione di flusso di lavoro. È configurata con un elenco di task e con il tipo di implementazione di flusso di lavoro. La classe di lavoratore esegue un ciclo per il polling dei task di decisione nell'elenco di task specificato. Quando un task di decisione viene ricevuto, crea un'istanza dell'implementazione di flusso di lavoro e chiama il metodo @Execute per elaborare il task.

Lavoratore di attività

Per implementare dei lavoratori di attività, puoi utilizzare la classe ActivityWorker per eseguire efficacemente il polling dei task di attività in un elenco di task. Configura quindi il lavoratore di attività con oggetti di implementazione di attività. Questa classe di lavoratore esegue un ciclo per il polling dei task di attività nell'elenco di task specificato. Quando si riceve un task di attività, cerca l'implementazione appropriata che hai fornito e chiama il metodo di attività per elaborare il task. A differenza di WorkflowWorker, che chiama la factory per creare una nuova istanza per ogni task di decisione, ActivityWorker utilizza semplicemente l'oggetto che hai fornito.

LaActivityWorkerclass usa ilAWS Flow Frameworkper le annotazioni di Java per determinare le opzioni di registrazione ed esecuzione.

Modello di threading di lavoratore

NellaAWS Flow FrameworkJava, un'attività o un decisore è rappresentato da un'istanza della classe di lavoratore. La tua applicazione è responsabile della configurazione e della creazione di un'istanza dell'oggetto lavoratore su ogni macchina nonché del processo che agisce come lavoratore. L'oggetto lavoratore riceve quindi automaticamente i task da Amazon SWF, li invia all'implementazione di attività o flusso di lavoro e restituisce i risultati ad Amazon SWF. Una singola istanza di flusso di lavoro può interessare molti lavoratori. Quando Amazon SWF ha uno o più task di attività in attesa, assegna un task al primo lavoratore disponibile, quindi a quello successivo e così via. In questo modo, i task che appartengono alla stessa istanza di flusso di lavoro possono essere elaborati su differenti lavoratori contemporaneamente.

Topologia diAWS Flow Frameworkper applicazioni basate su Java

Inoltre, ogni lavoratore può essere configurato per elaborare task su più thread. Ciò significa che i task di attività di un'istanza di flusso di lavoro possono essere eseguiti simultaneamente anche se vi è un solo lavoratore.

I task di decisione funzionano in modo simile, con la differenza che Amazon SWF garantisce l'esecuzione di più decisioni contemporaneamente per una determinata esecuzione di flusso di lavoro. Una singola esecuzione di flusso di lavoro richiede in genere più task di decisione ed è quindi possibile che venga eseguita su più processi e thread. Il decisore è configurato con il tipo di implementazione di flusso di lavoro. Quando riceve un task di decisione, crea un'istanza (oggetto) dell'implementazione di flusso di lavoro. Il framework fornisce un modello factory estensibile per la creazione di queste istanze. La factory di flusso di lavoro di default crea un nuovo oggetto ogni volta. Puoi fornire factory personalizzate per annullare questo comportamento.

Contrariamente ai decisori, che sono configurati con tipi di implementazione di flusso di lavoro, i lavoratori di attività sono configurati con istanze (oggetti) delle implementazioni di attività. Quando un lavoratore di attività riceve un task di attività, questo è inviato all'oggetto di implementazione di attività appropriato.

Modello di threading delle classi di lavoratore

Il lavoratore di flusso di lavoro gestisce un singolo pool di thread ed esegue il flusso di lavoro sullo stesso thread utilizzato per eseguire il polling di Amazon SWF del task in. Poiché le attività sono a esecuzione prolungata (almeno rispetto alla logica di flusso di lavoro), la classe di lavoratore di attività gestisce due pool di thread distinti: uno per il polling di Amazon SWF di task di attività in e l'altro per l'elaborazione di task mediante l'esecuzione dell'implementazione di attività. Ciò ti consente di configurare il numero di thread per il polling dei task indipendentemente dal numero di thread per eseguirli. Ad esempio, puoi avere un numero ridotto di thread per il polling e un numero elevato di thread per l'esecuzione dei task. La classe di lavoratore di attività esegue il polling di Amazon SWF in un task in solo quando dispone di un thread di polling libero e un thread libero per elaborare il task.

Questo comportamento di threading e creazione di istanze implica quanto segue:

  1. Le implementazioni di attività devono essere stateless. Non devi utilizzare variabili di istanza per archiviare lo stato dell'applicazione in oggetti attività. Puoi comunque utilizzare dei campi per archiviare risorse come le connessioni di database.

  2. Le implementazioni di attività devono essere thread-safe. Poiché la stessa istanza può essere utilizzata per elaborare task di differenti thread contemporaneamente, l'accesso alle risorse condivise dal codice delle attività deve essere sincronizzato.

  3. L'implementazione di flusso di lavoro può essere stateful e le variabili di istanza possono essere utilizzate per archiviare lo stato. Anche se viene creata una nuova istanza dell'implementazione di flusso di lavoro per elaborare ogni task di decisione, il framework assicurerà la corretta ricreazione dello stato. Tuttavia, l'implementazione di flusso di lavoro deve essere deterministica. Per ulteriori informazioni, consulta la sezione Come si presenta.

  4. Le implementazioni di flusso di lavoro non devono essere thread-safe quando si utilizza la factory di default. L'implementazione di default garantisce che un'istanza dell'implementazione di flusso di lavoro è utilizzata da un solo thread alla volta.

Estensibilità dei lavoratori

LaAWS Flow Frameworkper Java contiene anche un paio di classi di lavoratore di basso livello che forniscono estensibilità e un controllo più specifico. Mediante tali classi, puoi personalizzare completamente la registrazione dei tipi di flusso di lavoro e di attività e impostare factory per la creazione di oggetti di implementazione. Questi lavoratori sono GenericWorkflowWorker e GenericActivityWorker.

Il lavoratore GenericWorkflowWorker può essere configurato con una factory per creare factory di definizione di flusso di lavoro. Il ruolo di una factory di definizione di flusso di lavoro è di creare istanze dell'implementazione di flusso di lavoro e di fornire impostazioni di configurazione come le opzioni di registrazione. In circostanze normali, devi utilizzare la classe WorkflowWorker direttamente. Questa creerà e configurerà automaticamente l'implementazione delle factory fornite nel framework, ovvero POJOWorkflowDefinitionFactoryFactory e POJOWorkflowDefinitionFactory. La factory richiede che la classe di implementazione di flusso di lavoro abbia un costruttore senza argomenti. Questo costruttore è utilizzato per creare istanze dell'oggetto di flusso di lavoro al runtime. La factory analizza le annotazioni utilizzate nell'interfaccia e nell'implementazione di flusso di lavoro per creare opzioni di registrazione ed esecuzione appropriate.

Puoi fornire una tua implementazione delle factory mediante WorkflowDefinitionFactory, WorkflowDefinitionFactoryFactory e WorkflowDefinition. La classe WorkflowDefinition è utilizzata dalla classe di lavoratore per inviare task di decisione e segnali. Implementando queste classi di base, puoi personalizzare completamente la factory e l'invio di richieste all'implementazione di flusso di lavoro. Ad esempio, puoi utilizzare questi punti di estensibilità per fornire un modello di programmazione personalizzato per la scrittura di flussi di lavoro, ad esempio, basato sulle tue annotazioni o generato a partire da WSDL anziché mediante l'approccio Code First utilizzato dal framework. Per utilizzare le tue factory personalizzate, dovrai servirti della classe GenericWorkflowWorker. Per ulteriori dettagli su queste classi, consulta la documentazione del kit AWS SDK for Java.

Allo stesso modo, GenericActivityWorker ti consente di fornire una factory di implementazione di attività personalizzata. Implementando le classi ActivityImplementationFactory e ActivityImplementation, puoi controllare completamente la creazione di istanze di attività nonché personalizzare opzioni di registrazione ed esecuzione. Per ulteriori dettagli relativi a queste classi, consulta la documentazione del kit AWS SDK for Java.