AWS Flow Framework を使用して非同期ビジネス処理を実装するために、Amazon Simple Workflow Service (SWF) を使用しています。Maven を使用して開発ビルドをセットアップすることが重要でした。これにより、選択した IDE (IntelliJ IDEA) から簡単にビルドできるだけでなく、継続的インテグレーション用のテスト ビルドと、リリースおよびデプロイ用の運用ビルドを自動化できました。
私の時間のほとんどは、AspectJ を使用して作成された自動生成されたプロキシ クラスを取得することに費やされました。これは、バージョン 3.7 (Indigo) を使用していた Eclipse で最初に発生した問題であり、開発環境のセットアップに関するドキュメントのロード時とコンパイル時の両方のウィービング手順に従った後でも、クラスをうまく吹き飛ばすことができませんでした。アウト。直感で、ドキュメントには Eclipse 3.6 (Helios) を使用していると書かれていることを思い出したので、この特定のバージョンの Eclipse をダウンロードし、ロードタイム ウィービング アプローチを使用して再試行したところ、チャンピオンのように機能しました。これら 2 つのバージョン間の Eclipse ログを見ると、Eclipse 3.7 には依存関係がないことがわかりましたlog4j
。freemarker
. 私はIntelliJ IDEAユーザーの方が多いので、Eclipseでこれをさらにトラブルシューティングするためにあまり道を進むことは気にしませんでしたが、Eclipseを適切に動作させることは間違いなく可能だと確信しています.
pom.xml
私の次の取り組みは、IntelliJ IDEA Maven プロジェクトを立ち上げて、プロキシ クラスの自動生成を有効にするために最小限の情報で実行することでした。手がかりは、開発環境のセットアップに関するドキュメントのロード時の織り込みに関する指示の最後の段落で、次のように述べられています。
コマンドラインからプロジェクトをビルドする場合は、aws-java-sdk-flow-build-tools-1.3.3.jar がクラスパスにあることを確認してください。この jar ファイルには、コードを生成するために実行する必要がある AWS Flow Framework アノテーション プロセッサが含まれています。例については、samples フォルダーに含まれている build.xml ファイルを参照してください。
私が間違っていない限り、私がこれまでに行った調査によると、aspectj-maven-plugin
は現在、ロード時のウィービングをサポートしていません。ロード時のウィービングやJava エージェントとしての実行aop.xml
と連動したファイルの利用から脱却aspectjweaver
し、このプラグインでサポートされているコンパイル時のウィービングに移行しました。AWS SDK for Java サポートを Eclipse に直接インストールしたときに、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 プロジェクトの作成
- IntelliJ IDEAアプリケーションを起動します。
- 新しいプロジェクトを作成します。
- プロジェクト名とプロジェクト ファイルの場所を入力します。
- 選択タイプはMaven Moduleである必要があります。
- 次の画面で必要に応じて Maven プロパティを調整し、Finishをクリックします。
- を設定するには、以下のMavenの手順に従ってください
pom.xml
。
AWS SDK for Java
ワークフローとアクティビティの開発に必要なタイプを参照するには、AWS SDK for Java をダウンロードする必要があります。Mavendependency
を使用してプロジェクトとビルドにこのライブラリを含めることをお勧めしますが、ディレクトリaws-java-sdk-flow-build-tools
の下にあるライブラリを取得するには、このライブラリをダウンロードする必要があります。lib
SWF フロー構築ツール
AWS SDK for Javaのダウンロードには、ディレクトリaws-java-sdk-flow-build-tools-<version>.jar
の下に JAR が含まれています。lib
このライブラリにMaven を含めることができるようにするには、JAR をローカルのMavenリポジトリdependency
にインストールする必要があります。これを実現するには、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
注:上記のコマンドのトークンは、AWS SDK ダウンロードにある適切なバージョンに置き換えてください。
メイヴン
ファイル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 を実行すると、IntelliJ IDEA のMaven プロジェクトツール ウィンドウ内のノードの下にノードが表示されるcompile
ことに気付くはずです。必要に応じて、プラグインのセクションの要素をオプションで追加または微調整することもできます。サポートされているさまざまな設定は、ここにある目標のドキュメントに記載されています。ソースディレクトリの下の適切な場所にファイルが生成されるように、まだプラグイン構成を微調整していませんが、これはかなり可能だと確信しています.aspectj
Plugins
configuration
aspectj-maven-plugin
aspectj:compile
.java
外部ライブラリ
上記のリストのセットを含め、dependencies
少なくとも Maven を実行すると、IntelliJ IDEAのプロジェクトツールウィンドウ内の外部ライブラリノードcompile
の下にリストされている次の依存関係のセットに少なくとも気付くはずです。
- com.amazonaws:aws-java-sdk-flow-build-tools
- com.amazonaws:aws-java-sdk
- コモンズ コーデック:コモンズ コーデック
- 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:フリーマーカー
例 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で注釈が付けられ、バージョンプロパティが設定されているインターフェイスに対して 1 つのメソッドが定義されます。
- インターフェイスの名前は、文字列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を介してビルドを実行する必要があります。aws-java-sdk
およびaws-java-sdk-flow-build-tools
JAR にはさまざまな側面が含まれており、ワークフローとアクティビティに組み込まれています。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.
自動生成されたプロキシ
ワークフローとアクティビティをコンパイルすると、次の自動生成プロキシ クラスのセットが作成されていることがわかります。これらのプロキシは、さまざまなアクティビティを呼び出したり、他のワークフロー内で子ワークフローを実行したり、最上位でワークフローを実行したりするために、ワークフロー内で使用されます。 注:次の箇条書きの文字列「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 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