如何使用 Amazon SWF [关闭]
Posted
技术标签:
【中文标题】如何使用 Amazon SWF [关闭]【英文标题】:How to consume Amazon SWF [closed] 【发布时间】:2012-03-12 15:42:28 【问题描述】:Amazon SWF 今天推出。如何最好地使用 Java / php / 等?
当前的 SDK 支持似乎不包含它。我知道它是新的,但有没有人有关于如何使用它的任何好的资源,或者我需要在以下任何 SDK 中实施哪些更改才能立即开始?
AWS SDK for Java AWS SDK for PHP AWS SDK for Python AWS SDK for Ruby AWS SDK for .NET就我个人而言,我的兴趣在于 Java 和 PHP SDK 的...
更新的版本可见:http://aws.amazon.com/releasenotesThanks Bjorn!
【问题讨论】:
如果您想使用 Gradle 执行此操作,请在此处查看我的答案:***.com/questions/11550393/… 【参考方案1】:这是适用于 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>
【讨论】:
完美运行,谢谢!【参考方案2】:对于阅读此文的勇敢的灵魂: 大多数东西仍然适用。要使其与 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 开发工具包的版本从 1.7.3 升级到了 1.9.23。但是,Java 1.8 中仍然没有检测和正确编织方面。你可以在我分享的文章中看到我的 pom.xml (dl.dropboxusercontent.com/u/15628688/pom.xml)。 嗯...这绝对对我有用。这些天将尝试整理一个示例 pom。 不急,我现在可以使用 1.7。但对互联网后代来说会很棒:)。 谢谢,有机会我会试试的。 这正是我所需要的。答案中包含的 GitHub 存储库拥有您需要的一切。非常感谢。【参考方案3】:我已经设法使 JAVA8 / AWS SDK 1.9.x 与 Maven 和 Eclipse 一起工作,遵循这个非凡的示例 pedropaulovc/aws-flow-maven-eclipse-samples 并调整了 pom.xml,包括勇敢的 Mircea 建议和其他返工。
您可以找到生成的工作 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>
希望这会有所帮助!
【讨论】:
【参考方案4】:几年后,这个线程帮助我使 AWS SWF Flow 与 Maven 一起工作。但是,使用这种方法,某些方面并不是开箱即用的。我写了an article 来集中我所有的发现。 PS:希望有一些技巧可以让 Java 1.8 也能正常工作。
【讨论】:
【参考方案5】:我正在使用 Amazon Simple Workflow Service (SWF) 通过 AWS Flow Framework 实施异步业务处理。使用 Maven 进行开发构建设置对我来说很重要,这样我就可以轻松地从我选择的 IDE (IntelliJ IDEA) 构建,以及自动化我的测试构建以进行持续集成和生产构建以进行发布和部署。
我的大部分时间都花在尝试获取使用 AspectJ 创建的自动生成的代理类上。这最初是我在 Eclipse 中的一个问题,因为我使用的是 3.7 版(Indigo),即使在遵循 Setting up the Development Environment 文档中的加载时和编译时编织指令之后,我也无法成功地让类被炸毁。凭直觉我记得文档说他们使用的是 Eclipse 3.6 (Helios),所以我下载了这个特定版本的 Eclipse,并使用加载时编织方法重试,它就像一个冠军一样工作。查看这两个版本之间的 Eclipse 日志,我发现 Eclipse 3.7 缺少 log4j
和 freemarker
的依赖项。由于我更像是 IntelliJ IDEA 用户,因此我并没有费心在 Eclipse 中进一步解决这个问题,但我确信让 Eclipse 正常工作是绝对有可能的。
我接下来的工作是让 IntelliJ IDEA Maven 项目启动并运行,并使用我的 pom.xml
中的最少信息量来启用代理类的自动生成。线索是设置开发环境文档中加载时编织说明的最后一段,其中指出:
如果您是从命令行构建项目,请确保 aws-java-sdk-flow-build-tools-1.3.3.jar 在类路径中。这个罐子 文件包含 AWS Flow Framework 注释处理器,必须 运行以生成代码。例如,请参阅包含的 build.xml 文件 在示例文件夹中。
除非我弄错了,我迄今为止所做的研究表明aspectj-maven-plugin
目前不支持加载时编织。摆脱了加载时编织并利用aop.xml
文件以及作为Java 代理运行的aspectjweaver
,我转向了此插件支持的编译时编织。我不禁想到,当我直接在 Eclipse 中安装 AWS SDK for Java 支持时,它又会在 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 项目创建
-
启动 IntelliJ IDEA 应用程序。
创建一个新项目。
输入项目名称和项目文件位置。
选择类型应该是Maven Module。
如果合适,在下一屏幕上调整任何 Maven 属性,然后单击 完成。
按照下面的 Maven 说明设置
pom.xml
。
适用于 Java 的 AWS 开发工具包
为了参考开发工作流程和活动所需的类型,您需要下载适用于 Java 的 AWS 开发工具包。建议您使用 Maven 为您的项目和构建包含此库的 dependency
,但您仍应下载此库以获取可在下面找到的 aws-java-sdk-flow-build-tools
库lib
目录。
SWF 流构建工具
AWS SDK for Java 下载在 lib
目录下包含一个 aws-java-sdk-flow-build-tools-<version>.jar
JAR。为了允许为这个库包含一个 Maven dependency
,您需要将 JAR 安装到您的本地 Maven 存储库中。您可以通过从 AWS 开发工具包下载的 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 开发工具包下载中的相应版本。
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>
您的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
节点出现在Maven 项目中的Plugins
节点下 IntelliJ IDEA 中的工具窗口。如果需要,您还可以选择添加或调整aspectj-maven-plugin
插件的configuration
部分的元素。可以在here 的aspectj:compile
目标文档中找到各种支持的设置。我还没有调整我的插件配置以确保.java
文件在我的源目录下的正确位置生成,尽管我确信这是完全可行的。
外部库
一旦您包含了上面列出的 dependencies
集并至少运行了 Maven compile
,您应该至少注意到 External Libraries 节点下列出的以下依赖项集在 IntelliJ IDEA 的 Project 工具窗口中:
示例 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-sdk
和 aws-java-sdk-flow-build-tools
JAR 中包含了各个方面,它们被编织到您的工作流和活动中,aws-java-sdk-flow-build-tools
JAR 包括自动生成所需代理类以执行工作流和活动的必要机制。为了确保您使用的是最新生成的代理类,您应该注意在构建之前清理生成的工件,以便丢弃不需要的和/或旧的类。这可以通过在您选择的开发工具中运行以下命令或等效命令来实现:
mvn clean install
如果您在aspectj-maven-plugin
插件中启用showWeaveInfo
配置选项,您应该在构建输出中看到类似以下sn-p 的内容,尽管这里只有几行输出,因为只有此运行的单个工作流和单个活动:
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”实际上分别是您的实际工作流和活动接口的名称,您应该看到以下一组为您定义的每个工作流和活动接口:
工作流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我还包括一些背景信息,以帮助阐明我正在开发的开发环境的类型以及我用于日常编码的工具。
操作系统
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
【讨论】:
我希望我能多次支持这件事。非常有用和有帮助。感谢您的详细回复! 如果您想在活动中使用 AWS 方面(例如 @ExponentialRetry 注释及其相关方面 ExponentialRetryAspect) @GuiSim - 是的,我必须包含它才能使指数重试工作:<aspectLibraries> <aspectLibrary> <groupId>com.amazonaws</groupId> <artifactId>aws-java-sdk</artifactId> </aspectLibrary> </aspectLibraries>
我还必须包含将我生成的源代码放入源代码块的目录。 <source> <basedir>target</basedir> <includes> <include>**/*.java</include> </includes> </source>
对于以后在这里磕磕绊绊的人:如果intellij无法解析符号,可以看this。
@KenjiMatsuoka 您能否发布您的 pom.xml 或者您能否详细说明使异步和指数重试注释工作的步骤。【参考方案6】:
您今天检查更新的 SDK 了吗?大约 10 小时前有一个新版本(至少 .NET 的 1.4.3,于 2012 年 2 月 21 日发布)。
http://aws.amazon.com/releasenotes/.NET/5023081835314406
【讨论】:
aws.amazon.com/releasenotes以上是关于如何使用 Amazon SWF [关闭]的主要内容,如果未能解决你的问题,请参考以下文章