14

Amazon SWF于今天推出。如何最好地使用 Java/PHP/等来使用它?

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

就个人而言,我的兴趣在于 Java 和 PHP SDK 的...

更新版本可见: http ://aws.amazon.com/releasenotes 感谢 Bjorn!

4

6 回答 6

73

我正在使用 Amazon Simple Workflow Service (SWF) 通过 AWS Flow Framework 实施异步业务处理。使用 Maven 进行开发构建设置对我来说很重要,这样我就可以轻松地从我选择的 IDE (IntelliJ IDEA) 构建,以及自动化我的测试构建以进行持续集成和生产构建以进行发布和部署。

我的大部分时间都花在尝试获取使用 AspectJ 创建的自动生成的代理类上。这最初是我在 Eclipse 中的一个问题,因为我使用的是 3.7 版(Indigo),即使在遵循设置开发环境文档中的加载时和编译时编织说明之后,我也无法成功地得到类出去。凭直觉我记得文档说他们使用的是 Eclipse 3.6 (Helios),所以我下载了这个特定版本的 Eclipse 并使用加载时编织方法重试,它就像一个冠军一样工作。查看这两个版本之间的 Eclipse 日志,我发现 Eclipse 3.7 缺少对log4j和的依赖项freemarker. 由于我更像是一个 IntelliJ IDEA 用户,所以我没有费心去进一步解决这个问题,因为我是一个 IntelliJ IDEA 用户,但我确信让 Eclipse 正常工作是绝对有可能的。

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

如果您从命令行构建项目,请确保 aws-java-sdk-flow-build-tools-1.3.3.jar 在类路径中。此 jar 文件包含必须运行才能生成代码的 AWS Flow Framework 注释处理器。例如,请参阅示例文件夹中包含的 build.xml 文件。

除非我弄错了,否则我迄今为止所做的研究表明aspectj-maven-plugin当前不支持加载时编织。摆脱了加载时编织和aop.xml结合aspectjweaver作为 Java 代理运行的文件,我转向了这个插件支持的编译时编织。我不禁想到,当我直接在 Eclipse 中安装 AWS SDK for Java 支持时,它又会在aws-java-sdk-flow-build-tools-1.3.3.jar依赖项中找到支持。考虑到上述线索,在将这个 JAR 安装到我的本地 Maven 存储库之后,我终于能够通过aws-java-sdk-flow-build-tools-1.3.3.jar在我的依赖项中包含一个依赖项来消除代理类。pom.xml本条目的其余部分概述了为实现这一切而采取的步骤。

IntelliJ IDEA 项目创建

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

适用于 Java 的 AWS 开发工具包

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

SWF 流构建工具

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

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 开发工具包下载中的相应版本。

马文

您的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>

您的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>

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

外部库

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

  • com.amazonaws:aws-java-sdk-flow-build-tools
  • com.amazonaws:aws-java-sdk
  • 公共编解码器:公共编解码器
  • 公共日志记录:公共日志记录
  • org.apache.httpcomponents:httpclient
  • org.apache.http 组件: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注释并具有版本属性集的接口定义了一个方法。
  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进行注释,并具有版本属性集。
  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-sdkJAR和JAR 中包含了各个方面,aws-java-sdk-flow-build-tools它们被编织到您的工作流和活动中,并且aws-java-sdk-flow-build-toolsJAR 包括自动生成所需代理类以执行工作流和活动的必要机制。为了确保您使用的是最新生成的代理类,您应该注意在构建之前清理生成的工件,以便丢弃不需要的和/或旧的类。这可以通过在您选择的开发工具中运行以下命令或等效命令来实现:

mvn clean install

如果您showWeaveInfo在插件中保持启用配置选项aspectj-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.

自动生成的代理

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

  • 工作流客户端.java
  • 工作流客户端External.java
  • 工作流客户端ExternalFactory.java
  • 工作流客户端ExternalFactoryImpl.java
  • 工作流客户端ExternalImpl.java
  • 工作流客户端工厂.java
  • 工作流ClientFactoryImpl.java
  • 工作流ClientImpl.java
  • 工作流SelfClient.java
  • 工作流SelfClientImpl$1.java
  • 工作流SelfClientImpl.java
  • 活动客户端.java
  • 活动ClientImpl.java

我还包括一些背景信息,以帮助阐明我正在使用的开发环境的类型以及我用于日常编码的工具。

操作系统

Mac OS X version 10.7.3

爪哇

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)

马文

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
于 2012-03-13T03:02:21.010 回答
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>
于 2016-03-09T00:37:47.680 回答
3

您今天检查更新的 SDK 了吗?大约 10 小时前有一个新版本(至少 .NET 的 1.4.3,于 2012 年 2 月 21 日发布)。

http://aws.amazon.com/releasenotes/.NET/5023081835314406

于 2012-02-22T10:19:58.313 回答
3

几年后,这个线程帮助我使 AWS SWF Flow 与 Maven 一起工作。但是,使用这种方法,某些方面并不是开箱即用的。我写了一篇文章来集中我所有的发现。PS:希望有一些技巧可以使 Java 1.8 也能正常工作。

于 2015-02-26T21:21:24.367 回答
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

于 2015-03-03T22:26:51.327 回答
3

我已经设法使 JAVA8 / AWS SDK 1.9.x 与 Maven 和 Eclipse 一起工作,遵循这个非凡的示例pedroaulovc/aws-flow-maven-eclipse-samples并调整 pom.xml,包括勇敢的 Mircea 建议和其他返工。

您可以在此处找到生成的工作 pom.xml

请注意,我还必须向 aspectj 插件方面库添加更新的 flow-build-tools,否则,Activity 和 Workflow impl 版本号注释无法正常工作

                <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>

希望这会有所帮助!

于 2015-04-19T21:11:28.670 回答