Abonnement-Workflow, Anleitung Teil 4: Implementieren des Pollers Aktivitätsaufgaben - Amazon Simple Workflow Service

Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.

Abonnement-Workflow, Anleitung Teil 4: Implementieren des Pollers Aktivitätsaufgaben

In Amazon SWF werden Aktivitätsaufgaben für eine laufende Workflow-Ausführung auf demAktivitätsaufgabenliste, die bereitgestellt wird, sobald Sie eine Aktivität im Workflow planen.

Wir werden einen einfachen Aktivitäten-Poller implementieren, der diese Aufgaben für unseren Workflow handhabt und mit dem unsere Aktivitäten gestartet werden, sobald Amazon SWF eine Aufgabe auf die Aktivitätsaufgabenliste setzt.

Erstellen Sie zu Beginn eine neue Datei mit dem Namen swf_sns_activities.rb. Anhand dieser Datei können Sie folgende Aktivitäten ausführen:

  • Instanziieren der von uns erstellten Aktivitätenklassen.

  • Registrieren der einzelnen Aktivitäten bei Amazon SWF.

  • Abfragen zu Aktivitäten und Aufrufen von do_activity für die einzelnen Aktivitäten, wenn deren Name auf der Aktivitätsaufgabenliste erscheint.

Fügen Sie unter swf_sns_activities.rb die folgenden Anweisungen hinzu, um die einzelnen Aktivitätsklassen anzufordern, die von uns festgelegt wurden.

require_relative 'get_contact_activity.rb' require_relative 'subscribe_topic_activity.rb' require_relative 'wait_for_confirmation_activity.rb' require_relative 'send_result_activity.rb'

Jetzt erstellen wir die Klasse und stellen den Initialisierungscode bereit.

class ActivitiesPoller def initialize(domain, workflowId) @domain = domain @workflowId = workflowId @activities = {} # These are the activities we'll run activity_list = [ GetContactActivity, SubscribeTopicActivity, WaitForConfirmationActivity, SendResultActivity ] activity_list.each do | activity_class | activity_obj = activity_class.new puts "** initialized and registered activity: #{activity_obj.name}" # add it to the hash @activities[activity_obj.name.to_sym] = activity_obj end end

Zusätzlich zum Speichern der vergangenen Aktivitäten in der Domäne und Aufgabenliste, instanziiert dieser Code alle der von uns erstellten Aktivitätsklassen. Weil jede Klasse ihre zugehörige Aktivität registriert (siehebasic_activity.rbWenn Sie diesen Code überprüfen müssen), reicht dies aus, um Amazon SWF über alle Aktivitäten zu informieren, die wir ausführen werden.

Jede instanziierte Aktivität wird anhand des Aktivitätsnamens (beispielsweise get_contact_activity) als Schlüssel auf einer Map gespeichert, damit sie problemlos im Aktivitäten-Poller-Code, den wir als Nächstes definieren werden, nachgeschlagen werden kann.

Erstellen Sie eine neue Methode mit dem Namen poll_for_activities und rufen Sie die Abfrage https://docs.aws.amazon.com/AWSRubySDK/latest/AWS/SimpleWorkflow/ActivityTaskCollection.html#poll-instance_method für die auf der Domäne befindlichen activity_tasks auf, um die Aktivitätsaufgaben zu erhalten.

def poll_for_activities @domain.activity_tasks.poll(@workflowId) do | task | activity_name = task.activity_type.name

Der Aktivitätsname kann vom activity_type-Element der Aufgabe abgerufen werden. Als Nächstes verwenden wir den Aktivitätsnamen, der dieser Aufgabe zugeordnet ist, um die Klasse nachzuschlagen, auf der do_activity ausgeführt wird, und um die Aufgabe weiterzuleiten (dabei sind auch die Eingabedaten eingeschlossen, die an diese Aktivität weitergeleitet werden sollen).

# find the task on the activities list, and run it. if @activities.key?(activity_name.to_sym) activity = @activities[activity_name.to_sym] puts "** Starting activity task: #{activity_name}" if activity.do_activity(task) puts "++ Activity task completed: #{activity_name}" task.complete!({ :result => activity.results }) # if this is the final activity, stop polling. if activity_name == 'send_result_activity' return true end else puts "-- Activity task failed: #{activity_name}" task.fail!( { :reason => activity.results[:reason], :details => activity.results[:detail] } ) end else puts "couldn't find key in @activities list: #{activity_name}" puts "contents: #{@activities.keys}" end end end end

Der Code wartet darauf, dass do_activity abgeschlossen wird und markiert die Aufgabe entweder als abgeschlossen! oder fehlschlagen!. Dies ist hängt vom Rückgabecode ab.

Anmerkung

Dieser Code wird vom Poller nach dem Start der letzten Aktivität beendet, da seine Aufgabe abgeschlossen ist und alle Aktivitäten gestartet wurden. Wenn in Ihrem eigenen Amazon SWF SWF-Code Ihre Aktivitäten erneut ausgeführt werden, sollten Sie den Aktivitäten-Poller möglicherweise unbegrenzt laufen lassen.

Damit ist der Code für unsere ActivitiesPoller-Klasse fast abgeschlossen. Wir werden noch ein wenig mehr Code am Ende der Datei hinzufügen, um dem Benutzer die Möglichkeit zu bieten, sie von der Befehlszeile aus auszuführen.

if __FILE__ == $0 if ARGV.count < 1 puts "You must supply a task-list name to use!" exit end poller = ActivitiesPoller.new(init_domain, ARGV[0]) poller.poll_for_activities puts "All done!" end

Wenn der Benutzer die Datei von der Befehlszeile aus ausführt (und ihr eine Aktivitätsaufgabenliste als erstes Argument weiterleitet), instanziiert dieser Code die Poller-Klasse und startet diese durch die Abfrage nach Aktivitäten. Nachdem der Poller seine Aufgabe abgeschlossen hat (nach dem Start der letzten Aktivität), drucken wir einfach eine Nachricht aus und beenden ihn.

Das ist alles zum Aktivitäten-Poller. Jetzt müssen Sie nur noch den Code ausführen und in Abonnement-Workflow Tutorial: Ausführen des Workflows sehen, wie er funktioniert.