aws-swf/fluent

围绕 aws-sdk-php 的粘合代码,以允许流畅的工作流程定义

dev-master 2014-03-22 13:31 UTC

This package is not auto-updated.

Last update: 2024-09-24 05:28:47 UTC


README

围绕 aws-sdk-php 简单工作流 API (Aws\Swf) 的粘合代码,以允许流畅的工作流程定义。欢迎反馈。

功能

  • 流畅的工作流定义
  • 透明的基本注册:域 / 工作流类型 / 活动类型
  • 对活动、决策任务和子工作流的基本支持。

待实现/未完成

  • 定时器支持
  • 信号支持
  • 活动/工作流超时支持
  • ContinueAsNew 工作流支持
  • 工作流/活动取消支持
  • 改进的域/工作流/活动注册

AWS 简单工作流文档

入门

  1. 注册 AWS - http://docs.aws.amazon.com/aws-sdk-php-2/guide/latest/awssignup.html
  2. 安装 aws-swf/fluent - 使用 Composer 是安装此库的推荐方式。 aws-swf/fluent 通过 Packagist 提供的 aws-swf/fluent 包可获得。
  3. 按照下面 QuickSimpleDomain 的方式添加您的 workflows 定义
  4. 为决策和活动工作者创建长运行脚本
  5. 在您的 php 应用程序中添加 startWorkflowExecution 调用

快速示例

带有决策任务的三个步骤工作流

class QuickSimpleDomain extends Aws\Swf\Fluent\Domain {

    /**
     * Simple workflow domain configuration.
     *
     * Mandatory swf objects to be defined here:
     *  - swf domain name using setDomainName method
     *  - swf workflows using addWorkflow method
     *  - actions using workflow's 'to'/registerTask method
     */
    protected function configure() {
        // set swf client
        $domain->setSwfClient(Aws\Swf\SwfClient::factory(array(
            'key' => 'AWS key',
            'secret' => 'AWS secret key',
            'region' => 'us-east-1'
        )));

        // set domain name
        $this->setDomainName('threeStepsZenDomain');

        /**
         * threeStepsZen workflow :
         *  - on start, execute stepOne
         *  - if stepOne failed, execute stepFour. See evaluateStepOneResult method
         *  - if stepOne succeeded, execute stepTwo
         *  - if stepTwo succeeded, execute stepThree
         *
         * On any unhandled exception, workflow execution will terminate
         * with FAIL_WORKFLOW_EXECUTION decision.
         * Decision tasks can catch/handle previous activity fail/success.
         */
        $this->addWorkflow('threeStepsZen')
            ->to('activity://stepOne')
            ->to('decision://evaluateStepOneResult')
            ->to('activity://stepTwo')
            ->to('activity://stepThree')
            ->registerTask('activity://stepFour', array('comment' => 'Optional step 4'));

        $this->addWorkflow('secondWorkflow')
            ->to('activity://stepBeforeChildWorkflow')
            ->to('childWorkflow://threeStepsZen')
            ->to('activity://stepAfterChildWorkflow');

    }

    public function stepOne($context)   { /* do something on activity workers.*/ }

    public function evaluateStepOneResult($context, $decisionHint) {
        $lastEvent = $decisionHint->getLastEvent();
        if ($lastEvent['eventType'] == Aws\Swf\Enum\EventType::ACTIVITY_TASK_FAILED) {
            $decisionHint->setItem($this->getActivity('stepFour'));
            $decisionHint->setDecisionType(Aws\Swf\Enum\DecisionType::SCHEDULE_ACTIVITY_TASK);
        }
    }

    public function stepTwo($context)   { /* do something on activity workers.*/ }

    public function stepThree($context) { /* do something on activity workers.*/ }

    public function stepFour($context)  { /* do something on activity workers.*/ }

    public function stepBeforeChildWorkflow($context)  { /* do something on activity workers.*/ }

    public function stepAfterChildWorkflow($context)  { /* do something on activity workers.*/ }
}

decision-worker.php

$domain = new QuickSimpleDomain();
$domain->pollForDecisionTask();

activity-worker.php

$domain = new QuickSimpleDomain();
$domain->pollForActivityTask();

启动工作流执行

$domain = new QuickSimpleDomain();
$domain->startWorkflowExecution('threeStepsZen', 5);

更多示例

请参阅示例文件夹以获取更多详细信息