如何使用Amazon SWF

14
今天推出了Amazon SWF。如何最好地使用Java / PHP /等语言进行开发呢?
目前的SDK支持似乎不包括它。我知道这很新,但是否有人有关于如何使用它的好资源,或者在以下任何一个SDK中需要实现哪些更改才能立即开始工作呢? 个人而言,我对Java和PHP SDK比较感兴趣...
更新的发布信息可见:http://aws.amazon.com/releasenotes,谢谢Bjorn!

如果您想使用Gradle完成此操作,请查看我的答案:https://dev59.com/bGbWa4cB1Zd3GeqPVEZB#41755384 - Ryan Shillington
6个回答

74

我正在使用亚马逊简单工作流服务(SWF)和AWS Flow Framework实现异步业务处理。对我而言,使用Maven进行开发构建设置非常重要,这样我就可以轻松地从我选择的IDE(IntelliJ IDEA)构建,并自动化我的测试构建以进行持续集成,以及生产构建以进行发布和部署。

我的大部分时间都花在尝试使用AspectJ创建自动生成的代理类上。在Eclipse中,这对我来说一开始是个问题,因为我使用的是3.7(Indigo)版本,即使按照设置开发环境文档中的编译时和加载时织入指示进行操作,我也无法成功生成类。凭直觉,我记得文档中说他们使用的是Eclipse 3.6(Helios),因此我下载了这个特定版本的Eclipse,并尝试使用加载时织入方法,结果非常成功。通过比较这两个版本之间的Eclipse日志,我发现Eclipse 3.7缺少log4jfreemarker的依赖项。我没有太深入地去解决这个问题,因为我更多地使用的是IntelliJ IDEA,但我相信可以让Eclipse正常工作。
我的下一步尝试是使用最少的信息在我的pom.xml中启用自动生成代理类,以便在IntelliJ IDEA Maven项目中运行。提示来自于《设置开发环境文档》中关于加载时编织的最后一段说明:

如果您正在通过命令行构建项目,请确保aws-java-sdk-flow-build-tools-1.3.3.jar在类路径中。该jar文件包含必须运行的AWS Flow Framework注释处理器以生成代码。有关示例,请参见样本文件夹中包含的build.xml文件。

除非我弄错了,到目前为止,我所做的研究表明aspectj-maven-plugin目前不支持加载时织入。放弃加载时织入并结合使用aop.xml文件和作为Java代理运行的aspectjweaver,我转而使用此插件支持的编译时织入。我不禁想到,当我直接在Eclipse中安装AWS Java支持SDK时,它反过来将aws-java-sdk-flow-build-tools-1.3.3.jar依赖项中发现的支持嵌入其中。根据上述线索,在将此JAR安装到我的本地Maven存储库后,在我的pom.xml中包含aws-java-sdk-flow-build-tools-1.3.3.jar的依赖项后,我最终能够获得代理类的输出。本条目的其余部分概述了实现所有这些的步骤。

IntelliJ IDEA项目创建

  1. 启动 IntelliJ IDEA 应用程序。
  2. 创建一个 New Project
  3. 输入 Project nameProject files location
  4. 选择类型应为 Maven Module
  5. 在下一个屏幕上适当调整任何 Maven 属性,然后单击 Finish
  6. 按照下面的 Maven 说明设置 pom.xml

AWS SDK for Java

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

SWF Flow Build Tools

AWS SDK for Java下载包含在lib目录下的aws-java-sdk-flow-build-tools-.jar。为了允许在Maven依赖中包含该库,您需要将JAR安装到本地Maven存储库中。您可以通过从AWS SDK下载的lib目录运行以下命令来实现此操作:
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 

请注意:确保用AWS SDK下载中找到的适当版本替换上述命令中的令牌。
Maven
您的pom.xml文件应包含以下依赖项。如果您使用不同版本可能会遇到破坏性更改,我已包含我使用的版本号:
<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>

您的pom.xml文件还应包括以下插件。我正在使用源包含模式,遵循我在代码中使用的打包和接口命名约定,但您不一定需要按照这种方式操作:
<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>

一旦您已经包含上述提到的插件,并至少运行了Maven编译,您应该会在IntelliJ IDEA的Maven项目工具窗口下的插件节点中看到一个aspectj节点出现。如果需要,您还可以选择添加或微调aspectj-maven-plugin插件的configuration部分的元素。各种支持的设置可以在此处找到aspectj:compile目标文档中。我还没有微调我的插件配置以确保.java文件在我的源目录下生成到正确的位置,尽管我相信这是完全可行的。

外部库

一旦您已经包含了上述依赖项集,并至少运行了Maven编译,您应该会在IntelliJ IDEA的项目工具窗口的外部库节点下至少看到以下一组依赖项。
  • com.amazonaws:aws-java-sdk-flow-build-tools
  • com.amazonaws:aws-java-sdk
  • commons-codec:commons-codec
  • commons-logging:commons-logging
  • org.apache.httpcomponents:httpclient
  • org.apache.httpcomponents:httpcore
  • org.aspectj:aspectjrt
  • org.codehaus.jackson:jackson-core-asl
  • org.codehaus.jackson:jackson-mapper-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>

定义工作流程

要定义工作流程,您必须创建一个满足以下标准的Java接口:

  1. 该接口带有@Workflow注释。
  2. 为接口定义了一个单独的方法,该方法带有@Execute注释并设置了version属性。
  3. 该接口的名称以Workflow字符串结尾。
  4. 该接口位于以workflow字符串结尾的包下。

以下是一个示例工作流接口,名为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();

}

定义活动

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

  1. 该接口带有@Activities注释,并设置了version属性。
  2. 该接口具有以字符串Activities结尾的名称。
  3. 该接口位于以workflow/activities结尾的包中。

以下是一个名为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();

}

构建

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

mvn clean install

如果在aspectj-maven-plugin插件中启用了showWeaveInfo配置选项,您应该在构建输出中看到类似于以下片段的内容,尽管由于只有一个工作流和单个活动运行,这里只有几行输出:
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.

自动生成的代理

一旦您编译了工作流和活动,您应该会发现以下一组自动生成的代理类已经被创建。这些代理用于在您的工作流中调用各种活动、在其他工作流中执行子工作流以及在顶层执行工作流。注意:以下项目中的字符串“Workflow”和“Activities”实际上将是您实际工作流和活动接口的名称,对于您定义的每个工作流和活动接口,您应该会看到以下一组类被创建:

  • WorkflowClient.java
  • WorkflowClientExternal.java
  • WorkflowClientExternalFactory.java
  • WorkflowClientExternalFactoryImpl.java
  • WorkflowClientExternalImpl.java
  • WorkflowClientFactory.java
  • WorkflowClientFactoryImpl.java
  • WorkflowClientImpl.java
  • WorkflowSelfClient.java
  • WorkflowSelfClientImpl$1.java
  • WorkflowSelfClientImpl.java
  • ActivitiesClient.java
  • ActivitiesClientImpl.java
我也会提供一些背景信息,以帮助澄清我正在使用的开发环境和日常编码工具类型。
操作系统
Mac OS X version 10.7.3

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)

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"

IntelliJ IDEA(社区版)

IntelliJ IDEA 11.0.2
Build #IC111.277
Built on February 1, 2012

3
我希望我能多次点赞这个东西。非常有用和有帮助。感谢您详细的回复! - joeslice
2
如果您想在活动中使用AWS方面(例如@ExponentialRetry注释及其相关方面ExponentialRetryAspect),那么"aspectj-maven-plugin"配置不应该包括"aws-java-sdk"作为一个aspectLibrary吗? - GuiSim
1
@GuiSim - 是的,我必须包含它才能使指数重试工作:<aspectLibraries> <aspectLibrary> <groupId>com.amazonaws</groupId> <artifactId>aws-java-sdk</artifactId> </aspectLibrary> </aspectLibraries> 我还必须在源代码块中包含它放置生成源代码的目录:<source> <basedir>target</basedir> <includes> <include>**/*.java</include> </includes></source> - Kenji Matsuoka
对于未来遇到此问题的人:如果Intellij无法解析符号,您可以查看此链接 - tmj
3
@KenjiMatsuoka,您能否发布您的pom.xml文件或者详细说明一下如何使异步和指数重试注释起作用的步骤。 - tmj

4
这里是一个适用于Java8(JDK8)和编译时织入的更新答案。
问题在于Maven编译器可以执行注解处理。如果它被打开并且使用AspectJ,你会尝试重复创建相同的类。 最好让Maven编译器处理注解(生成工作流/活动类),因为AspectJ需要它们被创建,这样它才能进行织入(@Retry @Async)。
<build>
    <plugins>
        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>aspectj-maven-plugin</artifactId>
            <version>1.8</version>
            <executions>
                <execution>
                    <goals>
                        <goal>compile</goal>       <!-- use this goal to weave all your main classes -->
                        <goal>test-compile</goal>  <!-- use this goal to weave all your test classes -->
                    </goals>
                </execution>
            </executions>
            <configuration>
                <complianceLevel>1.8</complianceLevel>
                <showWeaveInfo>true</showWeaveInfo>
                <verbose>true</verbose>
                <source>1.8</source>
                <target>1.8</target>
                <aspectLibraries>
                    <aspectLibrary>
                        <groupId>com.amazonaws</groupId>
                        <artifactId>aws-java-sdk-swf-libraries</artifactId>
                    </aspectLibrary>
                </aspectLibraries>
          <!-- This is important so we don't double process the annotations -->
                <proc>none</proc>
            </configuration>
        </plugin>

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <configuration>
                <verbose>true</verbose>
                <fork>true</fork>
                <source>1.8</source>
                <target>1.8</target>
            </configuration>
        </plugin>
    </plugins>
</build>

完美运行,谢谢! - dzirtbry

3

对于那些勇敢阅读此文的人: 大部分内容仍然适用。要使其与Java 1.8配合使用,您需要使用以下AspectJ方面库:

<aspectLibraries>
  <aspectLibrary>
    <groupId>com.amazonaws</groupId>
    <artifactId>aws-java-sdk-swf-libraries</artifactId>
  </aspectLibrary>
</aspectLibraries>

查看完整示例,请访问: https://github.com/mirceal/swf-flow-java18-sample


感谢分享,Mircea。我尝试了你的解决方案,它帮助我将AWS SDK的版本从1.7.3升级到了1.9.23。然而,在Java 1.8中,某些方面仍然无法被正确地检测和编织。你可以在我分享的文章中查看我的pom.xml(https://dl.dropboxusercontent.com/u/15628688/pom.xml)。 - Ana Todor
嗯...对我来说肯定是有效的。我会尽快准备一个示例POM。 - Mircea
没关系,我现在可以使用1.7版本。但是为了互联网的永久保存,更新一下也是很好的选择 :)。 - Ana Todor
谢谢,我会在有机会的时候尝试它。 - Ana Todor
1
这正是我所需要的。答案中包含的 GitHub 仓库拥有你所需的一切。非常感谢。 - Kyle Anderson

3
我已经成功地使用Maven和Eclipse使JAVA8 / AWS SDK 1.9.x运行,参考了这个出色的示例pedropaulovc/aws-flow-maven-eclipse-samples并调整了pom.xml文件,包括Mircea的建议和其他修改。您可以在此处找到工作的pom.xml文件。 请注意,我不得不将更新的flow-build-tools添加到aspectj插件aspect库中,否则,Activity和Workflow实现版本号注释将无法正常工作。
                <aspectLibraries>
                    <!-- for aspect weaving and swf versions -->
                    <aspectLibrary>
                        <groupId>com.amazonaws</groupId>
                        <artifactId>aws-java-sdk-swf-libraries</artifactId>
                    </aspectLibrary>
                    <aspectLibrary>
                        <groupId>com.amazonaws</groupId>
                        <artifactId>aws-java-sdk-flow-build-tools</artifactId>
                    </aspectLibrary>
                </aspectLibraries>

希望这对您有所帮助!


3
几年后,这个帖子对我在使用Maven时帮助很大,使AWS SWF Flow工作起来了。然而,这种方法中有些方面并不是开箱即用的。我写了一篇文章,汇总了所有我的发现,可以在这里查看。顺便说一句,我很想知道如何让Java 1.8也能与此兼容。

3

1
http://aws.amazon.com/releasenotes <-- 不错! - sdolgy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接