首页 文章

如何使用Amazon SWF [关闭]

提问于
浏览
14

Amazon SWF今天发布 . 如何最好地使用Java / PHP /等?

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

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

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

6 回答

  • 4

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

    我的大部分时间都花在尝试使用AspectJ创建自动生成的代理类上 . 这对我来说最初是一个问题,因为我使用的是版本3.7(Indigo),甚至在遵循Setting up the Development Environment文档中的加载时和编译时编织指令之后,我无法成功地将类烧掉 . 在预感中,我记得文档说他们使用了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批注处理器 . 有关示例,请参阅samples文件夹中包含的build.xml文件 .

    除非我'm mistaken, the research I'已经完成,否则表明 aspectj-maven-plugin 目前不支持加载时编织 . 打破了加载时编织并将 aop.xml 文件与作为Java代理运行的 aspectjweaver 一起使用,我转而使用此插件支持的编译时编织 . 我不禁想到,当我直接在Eclipse中安装AWS SDK for Java支持时,它又会在 aws-java-sdk-flow-build-tools-1.3.3.jar 依赖项中找到支持 . 采取上述线索,我终于能够通过在我的本地Maven存储库中安装此JAR之后在我的 pom.xml 中包含 aws-java-sdk-flow-build-tools-1.3.3.jar 的依赖项来解决代理类问题 . 本条目的其余部分概述了实现这一切的步骤 .

    IntelliJ IDEA项目创建

    • 启动 IntelliJ IDEA 应用程序 .

    • 创建 New Project .

    • 输入 Project nameProject files location .

    • 选择类型应为 Maven Module .

    • 如果适用,在下一个屏幕上调整任何Maven属性,然后单击 Finish .

    • 按照下面的 Maven 说明设置 pom.xml .

    AWS SDK for Java

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

    SWF流程构建工具

    AWS SDK for Java 下载包含 lib 目录下的 aws-java-sdk-flow-build-tools-<version>.jar JAR . 为了允许为此库包含Maven dependency ,您需要将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
    

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

    Maven

    你的 pom.xml 文件应该包括关注 dependencies . 我使用've included the version numbers I' m,以防您遇到使用不同版本的更改:

    <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 并且至少运行了Maven compile ,你应该注意到 aspectj 节点出现在IntelliJ IDEA的 Maven Projects 工具窗口的 Plugins 节点下面 . 如果需要,您还可以选择添加或调整 aspectj-maven-plugin 插件的 configuration 部分的元素 . 可以在找到的 aspectj:compile 目标文档here中找到各种受支持的设置 . 我已经调整了我的插件配置,以确保 .java 文件是在我的源目录下的正确位置生成的,尽管我确信这是非常可行的 .

    外部图书馆

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

    • 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接口:

    • 该接口使用 @Workflow 进行批注 .

    • 为使用 @Execute 注释并具有 version 属性集的接口定义了单个方法 .

    • 接口的名称以字符串 Workflow 结尾 .

    • 该接口位于以 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接口:

    • 该接口使用 @Activities 进行批注,并设置了 version 属性 .

    • 接口的名称以字符串 Activities 结尾 .

    • 该接口位于以 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.
    

    自动生成的代理

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

    • 工作流程 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
    

    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 (Community Edition)

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

    这是一个适用于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>
    
  • 3

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

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

  • 3

    几年后,这个线程帮助我做了很多工作,使AWS SWF Flow与Maven一起工作 . 但是,某些方面并没有采用这种方法开箱即用 . 我写了an article来集中我的所有发现 . PS:会喜欢一些使Java 1.8能够正常运行的技巧 .

  • 3

    我已经设法使JAVA8 / AWS SDK 1.9.x与Maven和Eclipse一起使用这个非凡的例子pedropaulovc/aws-flow-maven-eclipse-samples并调整pom.xml,包括勇敢的Mircea建议和其他reworks .

    你可以找到生成的工作pom.xml here

    请注意,我必须向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>
    

    希望这可能会有所帮助!

  • 73

    对于那些读到这个的勇敢的灵魂:大多数东西仍然适用 . 要使其与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

相关问题