Как использовать Amazon SWF

Amazon SWF был запущен сегодня. Как лучше всего использовать его с помощью Java/PHP и т.д.?

Текущая поддержка SDK, похоже, не включает его. Я знаю, что это новое, но есть ли у кого-нибудь хорошие ресурсы по его потреблению или какие изменения мне нужно реализовать в любом из следующих SDK, чтобы сразу начать работу?

Лично меня интересует Java и PHP SDK...

Обновленные выпуски видны по адресу: http://aws.amazon.com/releasenotes Спасибо Bjorn!

Ответы

Ответ 1

Я использую 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. Я не потрудился зайти слишком далеко по пути, чтобы устранить эту проблему дальше с Eclipse, так как я больше являюсь пользователем IntelliJ IDEA, но я уверен, что наиболее определенно можно правильно заставить Eclipse работать.

Следующее мое усилие состояло в том, чтобы запустить проект IntelliJ IDEA Maven с минимальным объемом информации в моем pom.xml, чтобы включить автоматическое поколение прокси-классов. Ключ был последним абзацем инструкций по загрузке во времени в документации "Настройка среды разработки", в которой говорится:

Если вы строите проект из командной строки, убедитесь, что aws-java-sdk-flow-build-tools-1.3.3.jar находится в пути к классам. Эта банка файл содержит обработчик аннотаций потоков AWS, который должен быть запустить для генерации кода. Например, см. Файл build.xml. в папке с образцами.

Если я ошибаюсь, исследование, которое я сделал до настоящего времени, указывает, что aspectj-maven-plugin в настоящее время не поддерживает загрузку во времени. Если вы отделитесь от трения с загрузкой и используете файл aop.xml в сочетании с aspectjweaver, запущенным как агент Java, я перешел на компиляцию во времени, поддерживаемый этим плагином. Я не могу не думать, что когда я установил поддержку AWS SDK для Java непосредственно в Eclipse, это, в свою очередь, испекла в поддержке, найденной в зависимости от 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

  • Запустите приложение IntelliJ IDEA.
  • Создайте Новый проект.
  • Введите Название проекта и Местоположение файлов проекта.
  • Выберите тип Модуль Maven.
  • Отрегулируйте любые свойства Maven, если это необходимо на следующем экране, и нажмите Готово.
  • Следуйте инструкциям Maven ниже для настройки pom.xml.

AWS SDK для Java

Чтобы ссылаться на необходимые типы для разработки рабочих процессов и действий, вам необходимо загрузить AWS SDK для Java. Рекомендуется использовать Maven для включения dependency для этой библиотеки для вашего проекта и сборки, но вы должны загрузить эту библиотеку, чтобы получить библиотеку aws-java-sdk-flow-build-tools, которая может быть найдена в каталог lib.

Инструменты сборки потока SWF

Загрузка AWS SDK для Java включает в себя aws-java-sdk-flow-build-tools-<version>.jar JAR в каталоге lib. Чтобы разрешить включение Maven dependency для этой библиотеки, вам необходимо установить JAR в локальный репозиторий Maven. Вы можете добиться этого, выполнив следующее из каталога lib загрузки AWS 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 

ПРИМЕЧАНИЕ. Обязательно замените маркеры в приведенной выше команде соответствующей версией, найденной в вашем загружаемом файле 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>

В файле 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 node отображается под Plugins node в Maven Проекты в IntelliJ IDEA. Вы также можете дополнительно добавить или настроить элементы раздела configuration плагина aspectj-maven-plugin, если хотите. Различные поддерживаемые параметры можно найти в документации по целям aspectj:compile, найденной здесь. Я еще не изменил конфигурацию своего плагина, чтобы гарантировать, что файлы .java создаются в нужном месте в моем исходном каталоге, хотя я уверен, что это вполне выполнимо.

Внешние библиотеки

После включения набора dependencies, указанного выше, и, по крайней мере, запустите Maven compile, вы должны заметить, как минимум, следующий набор зависимостей, перечисленных в разделе Внешние библиотеки node в окне инструмента Проект в IntelliJ IDEA:

  • com.amazonaws: AWS-ява-СДК-флоу-сборка-инструменты
  • com.amazonaws: AWS-Java-SDK
  • Обще-кодек: Обще-кодек
  • Обще-каротажные: Обще-входа
  • org.apache.httpcomponents: HttpClient
  • org.apache.httpcomponents: httpcore
  • org.aspectj: aspectjrt
  • org.codehaus.jackson: джексон-ядро-над уровнем моря
  • org.codehaus.jackson: джексон-картографа-над уровнем моря
  • 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, используется один метод и имеет свойство свойства версия.
  • Интерфейс имеет имя, которое заканчивается строкой 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 и имеет свойство свойства версия.
  • Интерфейс имеет имя, которое заканчивается строкой 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. Различные аспекты были включены в JAR-устройства aws-java-sdk и aws-java-sdk-flow-build-tools, которые сотканы в ваши рабочие процессы и действия, а JAR aws-java-sdk-flow-build-tools включает в себя необходимый механизм автоматического генерации требуемых прокси-классов для выполнения рабочих процессов и действий. Чтобы убедиться, что вы работаете с последними созданными прокси-классами, вы должны позаботиться о очистке созданных артефактов перед сборкой, чтобы выбросить ненужные и/или старые классы. Этого можно достичь, выполнив следующую команду или эквивалент в вашем инструменте разработки по выбору:

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.

Автогенерируемые прокси

После того, как вы скомпилировали свои рабочие процессы и действия, вы должны найти следующий набор автоматически сгенерированных классов прокси. Эти прокси должны использоваться в ваших рабочих процессах для вызова ваших различных действий, выполнения дочерних рабочих процессов в других рабочих процессах, а также для выполнения рабочих процессов на верхнем уровне. ПРИМЕЧАНИЕ. Строки "Рабочий процесс" и "Действия" в следующих марках на самом деле являются именами ваших фактических интерфейсов рабочего процесса и действий соответственно, и вы должны увидеть следующий набор классов, созданных для каждого из ваших определенные интерфейсы рабочего процесса и действий:

  • Рабочий процесс Client.java
  • Рабочий процесс ClientExternal.java
  • Рабочий процесс ClientExternalFactory.java
  • Рабочий процесс ClientExternalFactoryImpl.java
  • Рабочий процесс ClientExternalImpl.java
  • Рабочий процесс ClientFactory.java
  • Рабочий процесс ClientFactoryImpl.java
  • Рабочий процесс ClientImpl.java
  • Рабочий процесс SelfClient.java
  • Workflow 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

Ответ 2

Вот более свежий ответ, который работает для 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 часов назад (1.4.3 для .NET, по крайней мере, выпущен 21 февраля 2012 года).

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

Ответ 4

Несколько лет спустя эта нить помогла мне много сделать работу AWS SWF Flow с Maven. Тем не менее, некоторые аспекты не работают из коробки с таким подходом. Я написал статью, чтобы сосредоточить все мои выводы. PS: хотелось бы немного советов, чтобы сделать работу Java 1.8 с этим.

Ответ 5

Для храбрых душ, которые читают это: Большая часть материала по-прежнему применяется. Чтобы он работал с 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

Ответ 6

Мне удалось сделать JAVA8/AWS SDK 1.9.x работать с Maven и Eclipse, следуя этим замечательным примерам pedropaulovc/aws-flow-maven-eclipse-samples и настроить pom.xml, включая смелое предложение Mircea и другие реорганизации.

вы можете найти полученный рабочий pom.xml здесь

Обратите внимание, что мне пришлось добавить в аспектные анимированные анимированные библиотеки плагинов также обновленные инструменты построения потока, в противном случае аннотации номера версии Action и 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>

Надеюсь, это может быть полезно!