Ответ 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