2014-03-31 7 views

Antwort

12

Ich suchte nach einem Tutorial und konnte keins finden. Schließlich ging ich mit Ruby und der Web-API durch die Dokumente und Beispiele und stellte die Grundlagen der Arbeit mit dem PHP SDK zusammen.

Das erste, was Sie tun müssen, ist Ihre Domäne, Workflow und Aktivitäten zu registrieren. Dies kann entweder über die AWS-Konsole oder über das PHP SDK erfolgen. Verwenden Sie das SDK folgendermaßen:

<?php 

require_once "path/to/aws.phar"; 

use Aws\Swf\SwfClient; 

// Create an instance of the SWF class 
$client = SwfClient::factory(array(
    "key" => "your_aws_key", 
    "secret" => "your_aws_secret_key", 
    "region" => "your_aws_region" 
)); 

// Register your domain 
$client->registerDomain(array(
    "name" => "domain name you want", 
    "description" => "this is a test domain", 
    "workflowExecutionRetentionPeriodInDays" => "7" 
)); 

// Register your workflow 
$client->registerWorkflowType(array(
    "domain" => "domain name you registered in previous call", 
    "name" => "workflow name you want", 
    "version" => "1.0", 
    "description" => "this is a sample", 
    "defaultTaskList" => array(
     "name" => "mainTaskList" 
    ), 
    "defaultChildPolicy" => "TERMINATE" 
)); 

// Register an activity 
$client->registerActivityType(array(
    "domain" => "domain name you registered above", 
    "name" => "activity name you want", 
    "version" => "1.0", 
    "description" => "first activity in our workflow", 
    "defaultTaskList" => array(
     "name" => "mainTaskList" 
    ) 
)); 

// Follow activity registration example above and register 
// more activities as you wish 

Der nächste Schritt besteht darin, einen Entscheider zu erstellen. Dies ist das Skript, das als koordinierender Knoten für Ihre Aktivitäts- (Arbeits-) Knoten fungiert.

// Ask SWF for things the decider needs to know 
$result = $client->pollForDecisionTask(array(
    "domain" => "your domain name", 
    "taskList" => array(
     "name" => "mainTaskList" 
    ), 
    "identify" => "default", 
    "maximumPageSize" => 50, 
    "reverseOrder" => true 
)); 

// Current version of activity types we are using 
$activity_type_version = "1.0"; 

// Parse info we need returned from the pollForDecisionTask call 
$task_token = $result["taskToken"]; 
$workflow_id = $result["workflowExecution"]["workflowId"]; 
$run_id = $result["workflowExecution"]["runId"]; 
$last_event = $result["events"][0]["eventId"]; 

// Our logic that decides what happens next 
if($last_event == "3"){ 
    $activity_type_name = "activity to start if last event ID was 3"; 
    $task_list = "mainTaskList"; 
    $activity_id = "1"; 
    $continue_workflow = true; 
} 
elseif($last_event == "8"){ 
    $activity_type_name = "activity to start if last event ID was 8"; 
    $task_list = "mainTaskList"; 
    $activity_id = "2"; 
    $continue_workflow = false; 
} 

// Now that we populated our variables based on what we received 
// from SWF, we need to tell SWF what we want to do next 
if($continue_workflow === true){ 
    $client->respondDecisionTaskCompleted(array(
     "taskToken" => $task_token, 
     "decisions" => array(
      array(
       "decisionType" => "ScheduleActivityTask", 
       "scheduleActivityTaskDecisionAttributes" => array(
        "activityType" => array(
         "name" => $activity_type_name, 
         "version" => $activity_type_version 
        ), 
        "activityId" => $activity_id, 
        "control" => "this is a sample message", 
        // Customize timeout values 
        "scheduleToCloseTimeout" => "360", 
        "scheduleToStartTimeout" => "300", 
        "startToCloseTimeout" => "60", 
        "heartbeatTimeout" => "60", 
        "taskList" => array(
         "name" => $task_list 
        ), 
        "input" => "this is a sample message" 
       ) 
      ) 
     ) 
    )); 
} 
// End workflow if last event ID was 8 
else if($continue_workflow === false){ 
    $client->respondDecisionTaskCompleted(array(
     "taskToken" => $task_token, 
     "decisions" => array(
      array(
       "decisionType" => "CompleteWorkflowExecution" 
      ) 
     ) 
    )); 
} 

Der letzte Schritt ist Ihre Aktivität Arbeiter zu schaffen. Sie können sie drehen Sie das folgende Format auf mit:

// Check with SWF for activities 
$result = $client->pollForActivityTask(array(
    "domain" => "domain name you registered", 
    "taskList" => array(
     "name" => "mainTaskList" 
    ) 
)); 

// Take out task token from the response above 
$task_token = $result["taskToken"]; 

// Do things on the computer that this script is saved on 
exec("my program i want to execute"); 

// Tell SWF that we finished what we need to do on this node 
$client->respondActivityTaskCompleted(array(
    "taskToken" => $task_token, 
    "result" => "I've finished!" 
)); 

Die Skripte für Ihre Aktivität Arbeiter und Entscheider auf einem beliebigen Server gestellt werden können. Diese Skripte rufen alle SWF auf, um miteinander zu kommunizieren.

Schließlich, um den Workflow zu starten Sie gerade erstellt haben, verwenden Sie:

// Generate a random workflow ID 
$workflowId = mt_rand(1000, 9999); 

// Starts a new instance of our workflow 
$client->startWorkflowExecution(array(
    "domain" => "your domain name", 
    "workflowId" => $workflowId, 
    "workflowType" => array(
     "name" => "your workflow name", 
     "version" => "1.0" 
    ), 
    "taskList" => array(
     "name" => "mainTaskList" 
    ), 
    "input" => "a message goes here", 
    "executionStartToCloseTimeout" => "300", 
    'taskStartToCloseTimeout' => "300", 
    "childPolicy" => "TERMINATE" 
)); 
+0

So wie für Sie swf funktioniert hat insgesamt? Empfehlen? Sehen Sie, wo ich von hier her komme https://devops.stackexchange.com/a/3034/4997 – abbood

Verwandte Themen