如何使用Amazon SWF

sdo*_*lgy 14 amazon-web-services amazon-swf

亚马逊SWF今天推出.如何最好地使用Java/PHP /等?

当前的SDK支持似乎不包含它.我知道它是新的,但有没有人有任何关于如何使用它的好资源,或者我需要在以下任何SDK中实现哪些更改才能立即开始使用?

就个人而言,我对Java和PHP SDK的兴趣是......

更新的版本可在以下网址查看:http: //aws.amazon.com/releasenotes 感谢Bjorn!

小智 73

我正在使用Amazon Simple Workflow Service(SWF)来使用AWS Flow Framework实现异步业务处理.使用Maven进行我的开发构建设置非常重要,这样我就可以轻松地从我选择的IDE(IntelliJ IDEA)构建,并自动化我的测试版本,以便进行持续集成和生成版本以进行发布和部署.

我的大部分时间都花在尝试使用AspectJ创建自动生成的代理类上.这对我来说最初是一个问题,因为我使用的是3.7版(Indigo),甚至在设置开发环境文档中遵循加载时和编译时编织指令后,我无法成功地将类烧掉出.在预感中,我记得文档说他们使用了Eclipse 3.6(Helios),所以我下载了这个特定版本的Eclipse并使用加载时编织方法重试,它就像一个冠军.看着这两个版本我能看到的Eclipse 3.7缺少的依赖之间的Eclipse的日志log4jfreemarker.因为我更像是一个IntelliJ IDEA用户,所以我没有太多关心用Eclipse进一步解决这个问题,但我确信最有可能让Eclipse正常工作.

我的下一步工作是使用我的最少量信息启动并运行IntelliJ IDEA Maven项目,pom.xml以启用代理类的自动生成.线索是设置开发环境文档中的加载时编织指令的最后一段,其中指出:

如果要从命令行构建项目,请确保aws-java-sdk-flow-build-tools-1.3.3.jar位于类路径中.此jar文件包含必须运行以生成代码的AWS Flow Framework批注处理器.有关示例,请参阅samples文件夹中包含的build.xml文件.

除非我弄错了,我迄今为止所做的研究表明,目前aspectj-maven-plugin还没有支持加载时间编织.打破了加载时织入和利用aop.xml文件以及aspectjweaver作为Java代理运行的问题,我转向了这个插件支持的编译时编织.我不禁想到,当我直接在Eclipse中安装AWS SDK for Java支持时,它又aws-java-sdk-flow-build-tools-1.3.3.jar依赖于依赖项中的支持.通过上面提到的线索,我终于能够通过aws-java-sdk-flow-build-tools-1.3.3.jar在我pom.xml将本JAR安装到我的本地Maven存储库之后包含依赖项来解决代理类问题.本条目的其余部分概述了实现这一切的步骤.

IntelliJ IDEA项目创建

  1. 启动IntelliJ IDEA应用程序.
  2. 创建一个新项目.
  3. 输入项目名称项目文件位置.
  4. 选择类型应该是Maven模块.
  5. 如果适当,在下一个屏幕上调整任何Maven属性,然后单击完成.
  6. 按照下面的Maven说明进行设置pom.xml.

AWS SDK for Java

为了引用开发工作流和活动所需的类型,您需要下载AWS SDK for Java.建议您使用Mavendependency为您的项目和构建包含此库,但您仍应下载此库以获取aws-java-sdk-flow-build-tools可在lib目录下找到的库.

SWF流程构建工具

AWS SDK的Java下载包含一个aws-java-sdk-flow-build-tools-<version>.jar下JAR lib目录.为了允许在dependency此库中包含Maven ,您需要将JAR安装到本地Maven存储库中.您可以通过从libAWS SDK下载目录运行以下命令来实现此目的:

mvn install:install-file 
    -Dfile=aws-java-sdk-flow-build-tools-<version>.jar 
    -DgroupId=com.amazonaws 
    -DartifactId=aws-java-sdk-flow-build-tools 
    -Dversion=<version> 
    -Dpackaging=jar 
Run Code Online (Sandbox Code Playgroud)

注意:请务必使用AWS SDK下载中的相应版本替换上述命令中的标记.

Maven的

您的pom.xml文件应包含以下内容dependencies.我已经包含了我正在使用的版本号,以防您遇到使用不同版本的更改:

<dependencies>
    <dependency>
        <groupId>org.aspectj</groupId>
        <artifactId>aspectjrt</artifactId>
        <version>1.6.11</version>
    </dependency>
    <dependency>
        <groupId>com.amazonaws</groupId>
        <artifactId>aws-java-sdk-flow-build-tools</artifactId>
        <version>1.3.3</version>
    </dependency>
    <dependency>
        <groupId>com.amazonaws</groupId>
        <artifactId>aws-java-sdk</artifactId>
        <version>1.3.3</version>
    </dependency>
    <dependency>
        <groupId>org.freemarker</groupId>
        <artifactId>freemarker</artifactId>
        <version>2.3.18</version>
    </dependency>
</dependencies>
Run Code Online (Sandbox Code Playgroud)

您的pom.xml文件还应包括以下内容plugin.我正在使用源包含模式,遵循我在代码中使用的打包和接口命名约定,尽管您不一定需要以这种方式执行操作:

<plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>aspectj-maven-plugin</artifactId>
    <version>1.4</version>
    <configuration>
        <complianceLevel>1.5</complianceLevel>
        <showWeaveInfo>true</showWeaveInfo>
        <verbose>true</verbose>
        <sources>
            <source>
                <basedir>src/main/java</basedir>
                <includes>
                    <include>*/**/workflow/*Workflow.java</include>
                    <include>*/**/workflow/activities/*Activities.java</include>
                </includes>
            </source>
        </sources>
    </configuration>
    <executions>
        <execution>
            <goals>
                <goal>compile</goal>
                <goal>test-compile</goal>
            </goals>
        </execution>
    </executions>
</plugin>
Run Code Online (Sandbox Code Playgroud)

一旦包含plugin上面列出的并且至少运行了Maven compile,您应该注意到一个aspectj节点出现在IntelliJ IDEA PluginsMaven Projects工具窗口中的节点下.如果需要,您还可以选择添加或调整插件configuration部分的元素aspectj-maven-plugin.可以在此处找到的aspectj:compile目标文档中找到各种支持的设置.我还没有调整我的插件配置,以确保文件生成在我的源目录下的适当位置,但我确信这是非常可行的..java

外部图书馆

一旦包含dependencies上面列出的集合并且至少运行了Maven compile,您应该至少注意到IntelliJ IDEA中" 项目"工具窗口中" 外部库"节点下列出的以下依赖项集:

  • com.amazonaws:AWS-Java的SDK-流构建工具
  • com.amazonaws:AWS-Java的SDK
  • 公地编解码器:公地编解码器
  • 共享记录:共享记录
  • org.apache.httpcomponents:HttpClient的
  • org.apache.httpcomponents:的HttpCore
  • org.aspectj:aspectjrt
  • org.codehaus.jackson:杰克逊核心-ASL
  • org.codehaus.jackson:杰克逊映射器,ASL
  • org.freemarker:freemarker的

示例pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>swf_example</groupId>
    <artifactId>swf_example</artifactId>
    <version>1.0</version>

    <dependencies>
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjrt</artifactId>
            <version>1.6.11</version>
        </dependency>
        <dependency>
            <groupId>com.amazonaws</groupId>
            <artifactId>aws-java-sdk-flow-build-tools</artifactId>
            <version>1.3.3</version>
        </dependency>
        <dependency>
            <groupId>com.amazonaws</groupId>
            <artifactId>aws-java-sdk</artifactId>
            <version>1.3.3</version>
        </dependency>
        <dependency>
            <groupId>org.freemarker</groupId>
            <artifactId>freemarker</artifactId>
            <version>2.3.18</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>aspectj-maven-plugin</artifactId>
                <version>1.4</version>
                <configuration>
                    <complianceLevel>1.5</complianceLevel>
                    <showWeaveInfo>true</showWeaveInfo>
                    <verbose>true</verbose>
                    <sources>
                        <source>
                            <basedir>src/main/java</basedir>
                            <includes>
                                <include>*/**/workflow/*Workflow.java</include>
                                <include>*/**/workflow/activities/*Activities.java</include>
                            </includes>
                        </source>
                    </sources>
                </configuration>
                <executions>
                    <execution>
                        <goals>
                            <goal>compile</goal>
                            <goal>test-compile</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

</project>
Run Code Online (Sandbox Code Playgroud)

定义工作流程

要定义工作流,您必须创建符合以下条件的Java接口:

  1. 该界面使用@Workflow进行注释.
  2. 为使用@Execute注释并具有版本属性集的接口定义单个方法.
  3. 该接口的名称以字符串Workflow结尾.
  4. 界面位于以工作流结束的包下.

以下是一个名为的示例工作流接口MyWorkflow,它将包含一个名为的文件MyWorkflow.java,位于源目录下src/main/java,并位于包目录结构下com/some/package/workflow.我没有包含@WorkflowRegistrationOptions注释或其他花里胡哨,因为这些不是必需的,取决于您的特殊需求:

package com.some.package.workflow;

import com.amazonaws.services.simpleworkflow.flow.annotations.Execute;
import com.amazonaws.services.simpleworkflow.flow.annotations.Workflow;

@Workflow
public interface MyWorkflow {

    @Execute(version="1.0")
    void doWorkflow();

}
Run Code Online (Sandbox Code Playgroud)

定义活动

要定义活动,您必须创建满足以下条件的Java接口:

  1. 该接口使用@Activities注释,并具有版本属性集.
  2. 该接口的名称以字符串Activities结尾.
  3. 界面位于以工作流/活动结束的包下.

以下是一个名为的示例活动接口MyActivities,它将包含在名为的文件中MyActivities.java,位于源目录下src/main/java,并位于包目录结构下com/some/package/workflow/activities.我没有包含@ActivityRegistrationOptions注释或其他花里胡哨,因为这些不是必需的,取决于您的特殊需求:

package com.some.package.workflow.activities;

import com.amazonaws.services.simpleworkflow.flow.annotations.Activities;

@Activities(version="1.0")
public interface MyActivities {

    void doActivity1();
    void doActivity2();
    void doActivity3();

}
Run Code Online (Sandbox Code Playgroud)

建造

为了确保在日常开发以及非开发环境(例如测试,生产等)中构建过程相同,您应该通过Maven在您选择的开发工具中运行构建.各个方面都被列入aws-java-sdkaws-java-sdk-flow-build-tools被编织到您的工作流程和活动,以及JAR文件aws-java-sdk-flow-build-toolsJAR包括必要的机制来自动生成所需的代理类,执行工作流程和活动.为了确保您使用最新生成的代理类,您应该在构建之前清理生成的工件,以便丢弃不需要的和/或旧的类.这可以通过在您选择的开发工具中运行以下命令或等效命令来实现:

mvn clean install
Run Code Online (Sandbox Code Playgroud)

如果您showWeaveInfoaspectj-maven-plugin插件中启用配置选项,您应该在构建输出中看到类似下面的代码段,尽管此处只有几行输出,因为此操作只有一个工作流和单个活动:

Mar 12, 2012 5:21:22 PM com.amazonaws.eclipse.simpleworkflow.asynchrony.annotationprocessor.AsynchronyDeciderAnnotationProcessor process
INFO: AsynchronyDeciderAnnotationProcessor.process() invoked.
Mar 12, 2012 5:21:22 PM com.amazonaws.eclipse.simpleworkflow.asynchrony.annotationprocessor.AsynchronyDeciderAnnotationProcessor process
INFO: Processing @Activities for MyActivities
Mar 12, 2012 5:21:22 PM com.amazonaws.eclipse.simpleworkflow.asynchrony.annotationprocessor.AsynchronyDeciderAnnotationProcessor process
INFO: Processing @Workflow for MyWorkflow
Mar 12, 2012 5:21:22 PM com.amazonaws.eclipse.simpleworkflow.asynchrony.annotationprocessor.AsynchronyDeciderAnnotationProcessor process
INFO: AsynchronyDeciderAnnotationProcessor.process() invoked.
Run Code Online (Sandbox Code Playgroud)

自动生成的代理

编译完工作流和活动后,您应该会发现已创建以下自动生成的代理类集.这些代理将在您的工作流程中用于调用您的各种活动,在其他工作流程中执行子工作流程,以及在顶级执行工作流程. 注意:以下项目符号中的"工作流"和"活动"字符串实际上分别是实际工作流和活动接口的名称,您应该看到为每个已定义的工作流和活动接口创建了以下一组类:

  • 工作流Client.java
  • 工作流ClientExternal.java
  • 工作流ClientExternalFactory.java
  • 工作流ClientExternalFactoryImpl.java
  • 工作流ClientExternalImpl.java
  • 工作流ClientFactory.java
  • 工作流ClientFactoryImpl.java
  • 工作流ClientImpl.java
  • 工作流程SelfClient.java
  • 工作流程SelfClientImpl $ 1.java
  • 工作流程SelfClientImpl.java
  • 活动Client.java
  • 活动ClientImpl.java

我还提供了一些背景信息,以帮助澄清我正在开发的开发环境的类型以及我用于日常编码的工具.

OS

Mac OS X version 10.7.3
Run Code Online (Sandbox Code Playgroud)

Java的

java version "1.6.0_29"
Java(TM) SE Runtime Environment (build 1.6.0_29-b11-402-11D50b)
Java HotSpot(TM) 64-Bit Server VM (build 20.4-b02-402, mixed mode)
Run Code Online (Sandbox Code Playgroud)

Maven的

Apache Maven 3.0.3 (r1075438; 2011-02-28 12:31:09-0500)
Maven home: /usr/share/maven
Java version: 1.6.0_29, vendor: Apple Inc.
Java home: /System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home
Default locale: en_US, platform encoding: MacRoman
OS name: "mac os x", version: "10.7.3", arch: "x86_64", family: "mac"
Run Code Online (Sandbox Code Playgroud)

IntelliJ IDEA(社区版)

IntelliJ IDEA 11.0.2
Build #IC111.277
Built on February 1, 2012
Run Code Online (Sandbox Code Playgroud)

  • 我希望我能多次赞成这件事.非常有用和有帮助.感谢您的详细回复! (3认同)
  • @KenjiMatsuoka你可以发布你的pom.xml,或者你能详细说明进行异步和指数重试注释工作的步骤. (3认同)
  • 如果您想在活动中使用AWS方面(例如@ExponentialRetry注释及其关联方面ExponentialRetryAspect),那么"aspectj-maven-plugin"配置不应包含"aws-java-sdk"作为aspectLibrary (2认同)