2019年7月2日火曜日

クラウドネイティブなアプリケーション環境向けアーキテクチャー

原文: Introduction to cloud-native application environment architecture By Christina Lin July 2, 2019


クラウドネイティブ環境のアーキテクチャーを理解するのはとても大変だったりします。アプリケーション開発者や ソフトウェア/システムアーキテクトの理解を助ける為、これからクラウドネイティブ環境のアーキテクチャーを構成する個々の要素とそれらがどのように連携するかについて説明します。
より理解しやすくするには、アーキテクチャーを4階層に分けて考えるのが有効である事に気がつきました。4階層は、「アプリケーションソフトウェア開発」、「サービスのスケール」、「アプリケーションネットワーク」、「コンテナオーケストレーションプラットフォーム」から構成されます。

この記事では、最初の階層である「アプリケーションソフトウェア開発」について説明します。4階層の概念を視覚化しやすくする為、下記の図を描きました。







































コンテナネイティブまたはクラウドネイティブなアプリケーション開発は一般的なグリーン・フィールドシステムと呼ばれ、アプリケーションはマイクロサービスに分割されます。各マイクロサービスの傾向として独自のデータソースがあり、他のマイクロサービスから独立しており、分散して配置されます。

このような実装の利点は、アプリケーションをよりアジャイルかつポリグロットにし、問題を切り分け、コードベースを小さくし、保守を容易にできることです。仮にこのような実装を選択することで今すぐあなたの人生が良くなると伝えたならば、私のメッセージはウソになります。

アジャイルで真にスケーラブルで自動化されたコンテナ/クラウドネイティブシステムのメリットを実現するには、アプリケーション、プラットフォーム、ペルソナといった要素を考慮する必要があります。以下の要素も含まれます:
  • シナリオに適したテクノロジを使用する
    • 複雑な解決策は過剰である場合があります
    • 間違った解決策を間違った場所で使用すると、責務を見失う可能性があります
  • 継続的インテグレーションをあわせたドメイン駆動設計
    • 非同期のイベントか API
    • 既存のブラウンフィールドアプリケーションといかにインテグレートするか
上の図は、コンテナ/クラウドネイティブ システムのさまざまな構成要素がどのように連携して機能するかの大まかな概要を示します。また、特定のテクノロジをいつ導入するか、または導入するかどうかを決めるのにも役立てばと願います。

アプリケーションソフトウェア開発レイヤー

アプリケーションソフトウェア開発レイヤーは、システムに適用されるソフトウェアパターンに関するレイヤーです。ドメインのモデリング、マイクロサービスの定義方法、デプロイ方法、疎結合で継続的に改善するシステムの開発に役立ちます。また、通信技術とアプリケーション間のパターンも含まれます。

サービス スケール - Knative

アプリケーションが使用されていないときにゼロへスケールインできると、リソースの最適化が可能になります。 このレイヤーは、クラウドコンピューティングの特性を最大限に活用しますが、すべてのサービスが必要とするわけではありません。

アプリケーションネットワーク - Service mesh

これは、分散マイクロサービス環境でとても一般的なアーキテクチャ機能です。 このレイヤーを使用すると、マイクロサービス間の通信をより良く、より均一に制御でき、観測性も向上します。 DevOps はこのレイヤーを使用して、一般的なセキュリティ、障害回復、ロールアウトポリシーなどを適用したり、カスタマイズされたポリシーを設定したりできます。 このレイヤーは、開発者の多くの冗長な作業を取り除きます。

コンテナ オーケストレーション プラットフォーム レイヤー - Red Hat OpenShift

クラウドネイティブ環境におけるアーキテクチャの基盤です。 コンテナオーケストレーション、サービスディスカバリ、CI/CD自動化、ロギングなどの基本的かつ不可欠な機能を提供します。

ドメイン駆動設計 と アジャイル インテグレーション 

ドメイン駆動設計(domain-driven design: DDD)の原則は、ビジネスユーザーと開発者間のコミュニケーションを改善し、ドメインに従ってオブジェクトをモデル化し、境界を設定して複雑なビジネス要件をセグメント化することにより、クラウドネイティブの世界でアプリケーションを開発する方法に適用されます。 DDDの重要な側面は、継続的インテグレーションです。

アジャイル インテグレーションは、マイクロサービスとDDDの基本概念から発展しました。 ビジネスロジックのモデリングをのぞくソフトウェア開発では、他の多くの要素も考慮する必要があります。 DDDをベースとしたアジャイル インテグレーションにより、モデルと境界だけでなく、異なる機能に関する懸念に基きそれらをどのように分離すべきか、およびそれらを物理的にデプロイする方法を定義するのに役立ちます。 アジャイル インテグレーションには3つの主な責任があります。
  • コア - ビジネスロジックまたはドメイン機能を実装するマイクロサービスの大部分は、このカテゴリに属します。 これらは、実行形態およびサービス間の連携方法の両方で軽量であり、典型的に小さくシンプルなマイクロサービスの良い例です
  • コンポジット - ここでは、サービスの適切な粒度の設定、トランザクションの処理、さまざまな種類のイベントに対するオーケストレーション、データ変換がすべて処理されます。 このカテゴリでは、データとイベントの集約と分離が行われます。 これは、あるポイントから別のポイントにイベントを適切な形式で伝搬するシンプルでステートレスなパイプとして機能し、場合によっては外部のSaaS、ブラウンフィールドアプリケーション、または境界コンテキスト外のサービスへのゲートウェイである必要があります
  • コントロール と ディスパッチ - システムが少数の外部システムとのみ連携する場合、このカテゴリは不要かもしれません。このカテゴリを使用すると、システムが提供するサービスについて、より多くの洞察と意味のあるビジネスコントロールが可能になります。これは、迅速でアドホックな変更を必要とする外部クライアントのリクエストから、常に面倒なカスタマイズを隠すカテゴリです。 ファサードパターンはこのカテゴリに適用されます
上記の原則を適用すると、次のことが可能になります:
  • ビジネス要件からモデルとエンティティを抽出します
  • ビジネスドメイン間の境界を設定します
  • コードの性質を分類し、独立した個別のデプロイ可能なマイクロサービスインスタンスに分けます
別の重要で基本的な問題は、これらのマイクロサービス間の通信です。 これらのマイクロサービスの通信バックボーンには、主にイベント駆動型かつ非同期である必要があるはずです。データの配信を疎結合にでき、システムはリアクティブになります。 欠点は、このタイプの設計ではトランザクションがかなり複雑になる可能性があることですが、これはイベントソーシングなどの手法を実装することで克服できます。 境界または外部クライアント/パートナー間の通信には、以下の理由で APIを使用することを強くお勧めします:
  • プロセスのほとんどはリクエスト/レスポンス形式を使用しており、 REST APIの生来の基本動作と合致します
  • コントラクトの定義とリポジトリを管理する為の技術は、API分野でより成熟しています
次回は、イベント内に存在するさまざまなタイプのデータとその処理方法、およびクラウドネイティブなアプリケーション環境でデータの一貫性を実現する方法について説明します。 また、今回紹介していない他のレイヤー(サービススケーリング、アプリケーションネットワーク、コンテナーオーケストレーションプラットフォーム)についても説明します。

原文: Introduction to cloud-native application environment architecture By Christina Lin July 2, 2019

2019年6月25日火曜日

Apache Camel 3 - camel-core vs camel-core-engine (小さくなった core)

原文: Apache Camel 3 - camel-core vs camel-core-engine (smaller core) By Claus lbsen(@davsclaus) June 25, 2019

Camelチームは、現在 Apache Camel 3 のリリースに向け多忙です。すでに多くのタスクが実装済みであり、これまでに 3つの マイルストーン リリースを公開しました。次のマイルストーンのリリース番号 4 には、革新的な新機能が同梱されます。今後数カ月にわたり、この素晴らしい新機能についてブログで紹介していきます。

このブログでは、camel-core をより小さなモジュールに分割した作業について紹介します。小さなモジュールに分割されたことで、必要なものだけを簡単に選択できるようになりました。

camel-core の JAR 依存関係ツリーを見ると、以下のように多くのモジュールに分割されていることがわかります。

[INFO] +- org.apache.camel:camel-core:jar:3.0.0-SNAPSHOT:compile
[INFO] |  +- org.apache.camel:camel-api:jar:3.0.0-SNAPSHOT:compile
[INFO] |  +- org.apache.camel:camel-base:jar:3.0.0-SNAPSHOT:compile
[INFO] |  +- org.apache.camel:camel-jaxp:jar:3.0.0-SNAPSHOT:compile
[INFO] |  +- org.apache.camel:camel-management-api:jar:3.0.0-SNAPSHOT:compile
[INFO] |  +- org.apache.camel:camel-support:jar:3.0.0-SNAPSHOT:compile
[INFO] |  +- org.apache.camel:camel-util:jar:3.0.0-SNAPSHOT:compile
[INFO] |  +- org.apache.camel:camel-util-json:jar:3.0.0-SNAPSHOT:compile
[INFO] |  +- org.apache.camel:camel-bean:jar:3.0.0-SNAPSHOT:compile
[INFO] |  +- org.apache.camel:camel-browse:jar:3.0.0-SNAPSHOT:compile
[INFO] |  +- org.apache.camel:camel-caffeine-lrucache:jar:3.0.0-SNAPSHOT:compile
[INFO] |  |  \- com.github.ben-manes.caffeine:caffeine:jar:2.7.0:compile
[INFO] |  |     +- org.checkerframework:checker-qual:jar:2.6.0:compile
[INFO] |  |     \- com.google.errorprone:error_prone_annotations:jar:2.3.3:compile
[INFO] |  +- org.apache.camel:camel-controlbus:jar:3.0.0-SNAPSHOT:compile
[INFO] |  +- org.apache.camel:camel-dataformat:jar:3.0.0-SNAPSHOT:compile
[INFO] |  +- org.apache.camel:camel-dataset:jar:3.0.0-SNAPSHOT:compile
[INFO] |  +- org.apache.camel:camel-direct:jar:3.0.0-SNAPSHOT:compile
[INFO] |  +- org.apache.camel:camel-directvm:jar:3.0.0-SNAPSHOT:compile
[INFO] |  +- org.apache.camel:camel-file:jar:3.0.0-SNAPSHOT:compile
[INFO] |  +- org.apache.camel:camel-language:jar:3.0.0-SNAPSHOT:compile
[INFO] |  +- org.apache.camel:camel-log:jar:3.0.0-SNAPSHOT:compile
[INFO] |  +- org.apache.camel:camel-mock:jar:3.0.0-SNAPSHOT:compile
[INFO] |  +- org.apache.camel:camel-properties:jar:3.0.0-SNAPSHOT:compile
[INFO] |  +- org.apache.camel:camel-ref:jar:3.0.0-SNAPSHOT:compile
[INFO] |  +- org.apache.camel:camel-rest:jar:3.0.0-SNAPSHOT:compile
[INFO] |  +- org.apache.camel:camel-saga:jar:3.0.0-SNAPSHOT:compile
[INFO] |  +- org.apache.camel:camel-scheduler:jar:3.0.0-SNAPSHOT:compile
[INFO] |  +- org.apache.camel:camel-seda:jar:3.0.0-SNAPSHOT:compile
[INFO] |  +- org.apache.camel:camel-stub:jar:3.0.0-SNAPSHOT:compile
[INFO] |  +- org.apache.camel:camel-timer:jar:3.0.0-SNAPSHOT:compile
[INFO] |  +- org.apache.camel:camel-validator:jar:3.0.0-SNAPSHOT:compile
[INFO] |  +- org.apache.camel:camel-vm:jar:3.0.0-SNAPSHOT:compile
[INFO] |  +- org.apache.camel:camel-xpath:jar:3.0.0-SNAPSHOT:compile
[INFO] |  +- org.apache.camel:camel-xslt:jar:3.0.0-SNAPSHOT:compile
[INFO] |  \- org.slf4j:slf4j-api:jar:1.7.25:compile

Camel 2.xでは、前述したすべてのモジュールが同じ camel-core JAR に含まれていました。

Camel 2.x から 3.0 へのマイグレーション作業内容と今後の使いやすさを考慮し、camel-core は Camel 2.x と同じ JAR 依存関係を保持します。つまり上記の出力は、camel-coreへの依存関係を宣言しただけの Maven  pom.xml もしくは gradle build ファイルから生成されたものです。

しかし Camel 3 マイルストーン 4 では、更に必要なものだけを簡単に選択できるようになります。たとえば以下の依存関係ツリーを確認することで、必要最低限の依存関係で camel-core が構成されていることがわかります。(新規に提供される下記 camel-core-engine JAR を dependency に設定します)

+- org.apache.camel:camel-core-engine:jar:3.0.0-SNAPSHOT:compile
[INFO] |  +- org.apache.camel:camel-api:jar:3.0.0-SNAPSHOT:compile
[INFO] |  |  \- org.apache.camel:camel-util:jar:3.0.0-SNAPSHOT:compile
[INFO] |  +- org.apache.camel:camel-management-api:jar:3.0.0-SNAPSHOT:compile
[INFO] |  +- org.apache.camel:camel-support:jar:3.0.0-SNAPSHOT:compile
[INFO] |  \- org.apache.camel:camel-core:jar:3.0.0-SNAPSHOT:compile
[INFO] |     +- org.apache.camel:camel-base:jar:3.0.0-SNAPSHOT:compile
[INFO] |     \- org.apache.camel:camel-properties:jar:3.0.0-SNAPSHOT:compile

この構成を説明する為に 2つのサンプルを提供しています。


前者はすべての core コンポーネントなどを含む camel-core に依存します。後者は必要最低限の依存関係を使います。この例では bean と quartz2 コンポーネントのみを使用しているので、それらを別途 依存関係として追加する必要があります。

camel-example-main-tiny の依存関係ツリーは以下のとおりです。(JAXB はテストスコープとして除外されます)

[INFO] --- maven-dependency-plugin:3.1.1:tree (default-cli) @ camel-example-main-tiny ---
[INFO] org.apache.camel.example:camel-example-main-tiny:jar:3.0.0-SNAPSHOT
[INFO] +- org.apache.camel:camel-core-engine:jar:3.0.0-SNAPSHOT:compile
[INFO] |  +- org.apache.camel:camel-api:jar:3.0.0-SNAPSHOT:compile
[INFO] |  |  \- org.apache.camel:camel-util:jar:3.0.0-SNAPSHOT:compile
[INFO] |  +- org.apache.camel:camel-management-api:jar:3.0.0-SNAPSHOT:compile
[INFO] |  +- org.apache.camel:camel-support:jar:3.0.0-SNAPSHOT:compile
[INFO] |  \- org.apache.camel:camel-core:jar:3.0.0-SNAPSHOT:compile
[INFO] |     +- org.apache.camel:camel-base:jar:3.0.0-SNAPSHOT:compile
[INFO] |     \- org.apache.camel:camel-properties:jar:3.0.0-SNAPSHOT:compile
[INFO] +- org.apache.camel:camel-main:jar:3.0.0-SNAPSHOT:compile
[INFO] +- org.apache.camel:camel-bean:jar:3.0.0-SNAPSHOT:compile
[INFO] +- org.apache.camel:camel-quartz2:jar:3.0.0-SNAPSHOT:compile
[INFO] |  +- org.quartz-scheduler:quartz:jar:2.3.1:compile
[INFO] |  |  +- com.mchange:mchange-commons-java:jar:0.2.15:compile
[INFO] |  |  \- com.zaxxer:HikariCP-java7:jar:2.4.13:compile
[INFO] |  \- com.mchange:c3p0:jar:0.9.5.4:compile
[INFO] +- com.sun.xml.bind:jaxb-core:jar:2.3.0:test
[INFO] +- com.sun.xml.bind:jaxb-impl:jar:2.3.0:test
[INFO] +- org.apache.logging.log4j:log4j-api:jar:2.11.2:runtime
[INFO] +- ch.qos.logback:logback-core:jar:1.2.3:compile
[INFO] \- ch.qos.logback:logback-classic:jar:1.2.3:compile
[INFO]    \- org.slf4j:slf4j-api:jar:1.7.25:compile

2つのサンプルそれぞれに含まれる JARの容量を比較してみました:
  • camel-example-main (camel-core): 48 JAR files with total of 9.3 MB
  • camel-example-main-tiny (camel-core-engine): 21 JAR files with total of 7.4 MB
2つのサンプルをそれぞれ実行すると、camel-core-engineを使用した方が、JVMにロードされるクラス数が若干少なくなることもわかります。
  • camel-example-main (camel-core): 3666 classes loaded
  • camel-example-main-tiny (camel-core-engine): 3430 classes loaded
目立った減少ではなかったかもしれませんが、Camel はコンポーネントを遅延ロード(lazy load)しますし、今回のサンプルは bean と quartz コンポーネントのみ使用している為、想定された結果となります。しかし、ディスクサイズが 約25% 減少し、JAR ファイルが 50% 削減されたことにより、クラスパスのスキャンスピードも多少向上するはずです。

この他にもたくさんの素晴らしい機能が Apache Camel 3 には含まれます。リリース前(2019年の 9月/10月 を予定)となる今夏、これら新機能についてブログを執筆する予定です。


2019年2月1日金曜日

[English] Check this data mapping tool! Atlasmap.io

Have you ever tried "Red Hat Fuse Online" before? It's an "integration Platform-as-a-Service (iPaaS) solution that makes it easy for business users to collaborate with integration experts and application developers".  If you've never tried it yet, please check this free trial.

https://www.redhat.com/en/technologies/jboss-middleware/fuse-online

If you know about "Red Hat Fuse Online", probably also you know that https://syndesis.io/ is the main upstream community for "Red Hat Fuse Online". How about https://www.atlasmap.io/ ?
"AtlasMap is a data mapping solution with interactive web based user interface, that simplifies configuring integrations between Java, XML, and JSON data sources." Please note that the ease of integration development is brought by AtlasMap too.

The good news is even if you are not ready for OpenShift world yet, you can still launch a standalone jar archive on your laptop to start AtlasMap web tooling. Yes, you can experience the data mapping solution within a few seconds. (Community members are still on the way to release standalone Atlasmap(issues/560), but we can try it in advance)
Of course, you can use the mapping file in your Java application. I recommend to use camel-atlasmap component because it's super easy to use.

Let me explain step by step about

  1. Download and launch Atlasmap web tooling
  2. Create data mapping
  3. Run the mapping by using Apache Camel

1: Download and launch AtlasMap web tooling

From version 1.39.0, atlasmap-standalone jar is available in maven central repository.
http://central.maven.org/maven2/io/atlasmap/atlasmap-standalone/1.39.0/atlasmap-standalone-1.39.0.jar
You can run AtlasMap standalone by `java -jar atlasmap-standalone-1.39.0.jar` which is springboot uber jar and UI is available at localhost:8585.

If you want to try latest AtlasMap source code, clone the repository and build it by yourself.
$ git clone https://github.com/atlasmap/atlasmap.git
$ cd ${ATLASMAP}
$ ./mvnw clean install -DskipTests

After booting up the web UI, you will see the console log something like this
2019-02-01 13:39:37.762  INFO 16127 --- [           main] b.c.e.u.UndertowEmbeddedServletContainer : Undertow started on port(s) 8585 (http)
2019-02-01 13:39:37.766  INFO 16127 --- [           main] io.atlasmap.standalone.Application       : Started Application in 4.816 seconds (JVM running for 5.427)
2019-02-01 13:39:37.766  INFO 16127 --- [           main] io.atlasmap.standalone.Application       : ### AtlasMap Data Mapper UI started at port: 8585 ###

2: Create data mapping

After accessing to localhost:8585, please take a look at the UI for about 5 minutes. I guess you will see what/how you can use  this tool.

On the left side panel named "Source", you can import and display the source data structure to convert.
On the right side pane named "Target", you can import and display the target data structure.

Java, XML, and JSON format is currently supported.

By moving the cursor to the arrow icon next with "Source" or "Target", you will see the pop up message "import instance or schema file".
As pop up message says, you can import xml file.(not schema file) AtlasMap will automatically analyze it for you.
Also you can import jar archive which contains multiple class files. After importing a jar archive, you can specify specific class name with package name.

By clicking each data entries from "Source" and "Target", you can do mapping.
On the right side panel named "Action", you can choose how you map data entries. (map/combine/separate)

By clicking gear icon on the right top right side corner, you can enable "Show Mapping Preview". With this feature, you can simulate the mapping using dummy data.

When you finish mapping, click export icon on the top right side to get the mapping archive.

3: Run the mapping by using Apache Camel

Using "Red Hat Developer Studio"(Eclipse) new project wizard, you can create a new sample Camel project. Please select spring boot for the run time. I select 2.21.0.fuse-720050-redhat-00001 for Red Hat Fuse version. If you love karaf container, please watch
https://github.com/atlasmap/atlasmap/issues/68.

Add camel-atlasmap dependency in the pom.xml

<dependency>
  <groupId>io.atlasmap</groupId>
  <artifactId>camel-atlasmap</artifactId>
  <version>1.40.0-SNAPSHOT</version>
</dependency>

Since 1.40.0-SNAPSHOT is not hosted on maven central repository, you need to use the one in the local maven repository.(I did mvn install with latest atlasmap git repo, so I can use 1.40.0-SNAPSHOT)

This is a sample camel route to test data mapping.
Timer consumer endpoint will fire one time. Put a sample pojo object using "sebBody", and do mapping(pojo to xml) by using camel-atlasmap. we can check the result by comparing the output log.

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=" http://www.springframework.org/schema/beans  http://www.springframework.org/schema/beans/spring-beans.xsd  http://camel.apache.org/schema/spring  http://camel.apache.org/schema/spring/camel-spring.xsd">
    <bean class="sample.Product" id="sampleProduct">
        <property name="id">
            <value>1</value>
        </property>
        <property name="price">
            <value>1000</value>
        </property>
    </bean>
    <camelContext id="camel" xmlns="http://camel.apache.org/schema/spring">
        <route id="simple-route">
            <from id="route-timer" uri="timer:timerName?repeatCount=1"/>
            <log id="route-log1" message="hello world"/>
            <setBody id="route-setBody">
                <simple>${ref:sampleProduct}</simple>
            </setBody>
            <log id="route-log2" message="Before Mapping >>> ${body}"/>
            <to id="_to1" uri="atlas:atlasmap-mapping.adm"/>
            <log id="route-log3" message="After Mapping >>> ${body}"/>
        </route>
    </camelContext>
</beans>

This part of camel route is camel-atlasmap. atlasmap-mapping.adm file is placed under $PROJECT/src/main/resources.

<to id="_to1" uri="atlas:atlasmap-mapping.adm"/>

This is the part of output log. We can confirm that the data was converted from pojo to xml.
14:08:33.813 [main] INFO  org.mycompany.Application - Started Application in 4.41 seconds (JVM running for 4.691)
14:08:34.763 [Camel (MyCamel) thread #1 - timer://timerName] INFO  simple-route - hello world
14:08:34.768 [Camel (MyCamel) thread #1 - timer://timerName] INFO  simple-route - Before Mapping >>> sample.Product@5ed4bc
14:08:35.036 [Camel (MyCamel) thread #1 - timer://timerName] WARN  o.a.c.c.atlasmap.AtlasEndpoint - There's no source document with docId='JSONInstanceSource', returning default: docId='null', path='null'
14:08:35.037 [Camel (MyCamel) thread #1 - timer://timerName] WARN  o.a.c.c.atlasmap.AtlasEndpoint - Null or non-String source document: docId='JSONInstanceSource': docId='JSONInstanceSource', path='null'
14:08:35.037 [Camel (MyCamel) thread #1 - timer://timerName] WARN  o.a.c.c.atlasmap.AtlasEndpoint - There's no source document with docId='JSONSchemaSource', returning default: docId='null', path='null'
14:08:35.037 [Camel (MyCamel) thread #1 - timer://timerName] WARN  o.a.c.c.atlasmap.AtlasEndpoint - Null or non-String source document: docId='JSONSchemaSource': docId='JSONSchemaSource', path='null'
14:08:35.037 [Camel (MyCamel) thread #1 - timer://timerName] WARN  o.a.c.c.atlasmap.AtlasEndpoint - There's no source document with docId='XMLSchemaSource', returning default: docId='null', path='null'
14:08:35.037 [Camel (MyCamel) thread #1 - timer://timerName] WARN  o.a.c.c.atlasmap.AtlasEndpoint - Null or non-String source document: docId='XMLSchemaSource': docId='XMLSchemaSource', path='null'
14:08:35.037 [Camel (MyCamel) thread #1 - timer://timerName] WARN  o.a.c.c.atlasmap.AtlasEndpoint - There's no source document with docId='sample.Product', returning default: docId='null', path='null'
14:08:35.037 [Camel (MyCamel) thread #1 - timer://timerName] WARN  o.a.c.c.atlasmap.AtlasEndpoint - There's no source document with docId='XMLInstanceSource', returning default: docId='null', path='null'
14:08:35.037 [Camel (MyCamel) thread #1 - timer://timerName] WARN  o.a.c.c.atlasmap.AtlasEndpoint - Null or non-String source document: docId='XMLInstanceSource': docId='XMLInstanceSource', path='null'
14:08:35.037 [Camel (MyCamel) thread #1 - timer://timerName] WARN  o.a.c.c.atlasmap.AtlasEndpoint - No target document created for DataSource:[id=JSONInstanceTarget, uri=atlas:json:JSONInstanceTarget]: docId='JSONInstanceTarget', path='null'
14:08:35.037 [Camel (MyCamel) thread #1 - timer://timerName] WARN  o.a.c.c.atlasmap.AtlasEndpoint - No target document created for DataSource:[id=JSONSchemaTarget, uri=atlas:json:JSONSchemaTarget]: docId='JSONSchemaTarget', path='null'
14:08:35.039 [Camel (MyCamel) thread #1 - timer://timerName] INFO  simple-route - After Mapping >>> {JSONInstanceTarget=null, JSONSchemaTarget=null, XMLInstanceTarget=<?xml version="1.0" encoding="UTF-8" standalone="no"?>, sample=<?xml version="1.0" encoding="UTF-8" standalone="no"?><request><id>1</id><price>1000</price></request>, XMLSchemaTarget=<?xml version="1.0" encoding="UTF-8" standalone="no"?>}

For more details/instruction/latest information about AtlasMap, please visit https://www.atlasmap.io/.
I hope this post helps a bit.

Regards,
Hisao

2019年1月31日木曜日

atlasmap.io に注目! (後編)

2018年12月21日に data mapperを使いマッピングをデザインしてから1ヵ月以上が経過していました。。
大変遅れてしまいましたが、やっとマッピングしたものを動かす記事を書きます。

日進月歩の勢いで開発が進んでいるプロジェクトなので、現時点での改善点をいくつかご紹介します。
 1: 1.39.0 から、maven repositoryで atlasmap-standalone jar が公開されました。
   http://central.maven.org/maven2/io/atlasmap/atlasmap-standalone/1.39.0/atlasmap-standalone-1.39.0.jar
   java -jar atlasmap-standalone-1.39.0.jar で web ui が起動します。ポート番号は前回と同様に 8585 です。

 2: camel-atlasmap コンポーネントを動かす為の修正や改善が複数入りました。コミュニティメンバーが親切に対応してくださったおかげで、使い易くなっています。
    https://github.com/atlasmap/atlasmap/issues/712
    https://github.com/atlasmap/atlasmap/issues/713
    https://github.com/atlasmap/atlasmap/issues/729

今回の動作検証を通し、不具合についてコミュニティメンバーへインプットしました。メンバーはどなたも親切で、何かインプットしてから製品に反映されるまでの速さにはとても驚きました。ディスカッションを通して内部構造を知るきっかけにもなり 良い事尽くしだったので、ぜひ皆さんもコミュニティーへ活発に参加されてみてはいかがでしょうか。

話がそれましたが、いよいよ本題です。今回は camel-atlasmap を使い、データ変換を試してみます。ランタイムは springbootを使います。
(捕捉: karaf愛好家の方は、こちらのチケットを watchしてください。 https://github.com/atlasmap/atlasmap/issues/68)

atlasmap git repository を最新の状態にし、ビルドしてください。

$ cd ${ATLASMAP}
$ git pull
$ ./mvnw clean install -DskipTests

お手数ですが、再度前回の投稿で実施したマッピング作業をし、設定ファイルをエクスポートしてください。 issues/713 の修正を使った設定ファイルが必要だからです。

Red Hat Developer Studio(Eclipse) のウィザードで、新規 Camel プロジェクトを作成します。ランタイムに springboot を選択し、Fuseのバージョンには 2.21.0.fuse-720050-redhat-00001 を指定しました。
pom.xml に camel-atlasmap の dependency を追記します。

<dependency>
  <groupId>io.atlasmap</groupId>
  <artifactId>camel-atlasmap</artifactId>
  <version>1.40.0-SNAPSHOT</version>
</dependency>

オンライン リポジトリーには 1.40.0-SNAPSHOT が公開されていないので、ローカルリポジトリを参照する必要があります。

データ変換を試す為に、簡単な camel routeを作成しました。タイマーを使い1回メッセージを生成し、サンプル用の pojoを挿入後、camel-atlasmap で xmlに変換しています。変換前/変換後のデータはログから確認できます。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=" http://www.springframework.org/schema/beans  http://www.springframework.org/schema/beans/spring-beans.xsd  http://camel.apache.org/schema/spring  http://camel.apache.org/schema/spring/camel-spring.xsd">
    <bean class="sample.Product" id="sampleProduct">
        <property name="id">
            <value>1</value>
        </property>
        <property name="price">
            <value>1000</value>
        </property>
    </bean>
    <camelContext id="camel" xmlns="http://camel.apache.org/schema/spring">
        <route id="simple-route">
            <from id="route-timer" uri="timer:timerName?repeatCount=1"/>
            <log id="route-log1" message="hello world"/>
            <setBody id="route-setBody">
                <simple>${ref:sampleProduct}</simple>
            </setBody>
            <log id="route-log2" message="Before Mapping >>> ${body}"/>
            <to id="_to1" uri="atlas:atlasmap-mapping.adm"/>
            <log id="route-log3" message="After Mapping >>> ${body}"/>
        </route>
    </camelContext>
</beans>

camel-atlasmap の定義はこの箇所です。

<to id="_to1" uri="atlas:atlasmap-mapping.adm"/>

出力した atlasmap-mapping.adm を指定しています。atlasmap-mapping.adm は、$PROJECT/src/main/resources 配下に設置しています。

プロジェクトを実行すると、このようなログが出力されるはずです。(ログは一部を抜粋しています) XMLに変換されている事が確認できます。

14:08:33.813 [main] INFO  org.mycompany.Application - Started Application in 4.41 seconds (JVM running for 4.691)
14:08:34.763 [Camel (MyCamel) thread #1 - timer://timerName] INFO  simple-route - hello world
14:08:34.768 [Camel (MyCamel) thread #1 - timer://timerName] INFO  simple-route - Before Mapping >>> sample.Product@5ed4bc
14:08:35.036 [Camel (MyCamel) thread #1 - timer://timerName] WARN  o.a.c.c.atlasmap.AtlasEndpoint - There's no source document with docId='JSONInstanceSource', returning default: docId='null', path='null'
14:08:35.037 [Camel (MyCamel) thread #1 - timer://timerName] WARN  o.a.c.c.atlasmap.AtlasEndpoint - Null or non-String source document: docId='JSONInstanceSource': docId='JSONInstanceSource', path='null'
14:08:35.037 [Camel (MyCamel) thread #1 - timer://timerName] WARN  o.a.c.c.atlasmap.AtlasEndpoint - There's no source document with docId='JSONSchemaSource', returning default: docId='null', path='null'
14:08:35.037 [Camel (MyCamel) thread #1 - timer://timerName] WARN  o.a.c.c.atlasmap.AtlasEndpoint - Null or non-String source document: docId='JSONSchemaSource': docId='JSONSchemaSource', path='null'
14:08:35.037 [Camel (MyCamel) thread #1 - timer://timerName] WARN  o.a.c.c.atlasmap.AtlasEndpoint - There's no source document with docId='XMLSchemaSource', returning default: docId='null', path='null'
14:08:35.037 [Camel (MyCamel) thread #1 - timer://timerName] WARN  o.a.c.c.atlasmap.AtlasEndpoint - Null or non-String source document: docId='XMLSchemaSource': docId='XMLSchemaSource', path='null'
14:08:35.037 [Camel (MyCamel) thread #1 - timer://timerName] WARN  o.a.c.c.atlasmap.AtlasEndpoint - There's no source document with docId='sample.Product', returning default: docId='null', path='null'
14:08:35.037 [Camel (MyCamel) thread #1 - timer://timerName] WARN  o.a.c.c.atlasmap.AtlasEndpoint - There's no source document with docId='XMLInstanceSource', returning default: docId='null', path='null'
14:08:35.037 [Camel (MyCamel) thread #1 - timer://timerName] WARN  o.a.c.c.atlasmap.AtlasEndpoint - Null or non-String source document: docId='XMLInstanceSource': docId='XMLInstanceSource', path='null'
14:08:35.037 [Camel (MyCamel) thread #1 - timer://timerName] WARN  o.a.c.c.atlasmap.AtlasEndpoint - No target document created for DataSource:[id=JSONInstanceTarget, uri=atlas:json:JSONInstanceTarget]: docId='JSONInstanceTarget', path='null'
14:08:35.037 [Camel (MyCamel) thread #1 - timer://timerName] WARN  o.a.c.c.atlasmap.AtlasEndpoint - No target document created for DataSource:[id=JSONSchemaTarget, uri=atlas:json:JSONSchemaTarget]: docId='JSONSchemaTarget', path='null'
14:08:35.039 [Camel (MyCamel) thread #1 - timer://timerName] INFO  simple-route - After Mapping >>> {JSONInstanceTarget=null, JSONSchemaTarget=null, XMLInstanceTarget=<?xml version="1.0" encoding="UTF-8" standalone="no"?>, sample=<?xml version="1.0" encoding="UTF-8" standalone="no"?><request><id>1</id><price>1000</price></request>, XMLSchemaTarget=<?xml version="1.0" encoding="UTF-8" standalone="no"?>}

ぜひお試しいただき、コミュニティーへフィードバックしていただければと思います。こちらへコメントしていただければ、自分が代理でコミュニティーへインプットすることもできます。お気軽にお知らせください。
引き続きよろしくお願い致します。

2018年12月21日金曜日

atlasmap.io に注目!

Red Hat サポートエンジニアの古市です。
赤帽エンジニアAdvent Calendar 2018の21日目の記事を担当します。本日のお題は atlasmap です。

今年の11月8日に開催された Red Hat Tech Nightで、Red Hat Fuse Online という iPaaS製品やそのアップストリームに位置するコミュニティー syndesis をご紹介しました。
記憶にない方やイマイチ理解できなかった方は、赤帽エンジニアでも度々投稿されている、佐藤匡剛さんの記事をご覧ください。iPaaSについてご理解いただけるはずです。(インストール手順などは、syndesis.ioで公開されている最新情報をご確認ください)

オープンソースの iPaaS: Syndesis を使ってみる (2017/8/30)

Fuse Online は "GUI で簡単にシステム間連携のソリューションを作れる"ような製品ですから、システム間で異るデータ形式(Java, JSON, XML)やデータ構造が要求されるケースも当然想定されており、Web UI(Data Mapperと呼びます)を使いデータの内容を適切にマッピングする事もできます。
このマッピング機能ですが、厳密には atlasmap プロジェクトの成果物を syndesis プロジェクトが活用しています。

atlasmap プロジェクトの webサイトはこちらです。
https://www.atlasmap.io/

個人的に注目している点ですが、Fuse Onlinesyndesis を使わずとも、スタンドアローンで Data Mapper を使ったデータマッピングが可能です。定義されたデータマッピングは、Javaプログラムでもちろん使用することができます。
Apache Camel用に camel-atlasmap が提供されており、Camel routeを使う事で更に簡単に定義したデータマッピングを使用できます。

それでは早速、DataMapper を使ってみましょう。
1: DataMapper のビルドと実行
こちらの READMEファイルに記載された手順を実行することで、Data Mapperをスタンドアローンで起動することができます。
https://github.com/atlasmap/atlasmap/blob/master/README.md
一応、昨日 実施した作業内容をのこしておきます。

$ git clone https://github.com/atlasmap/atlasmap
$ cd atlasmap
$ ./mvnw clean install -DskipTests
$ cd standalone
$ ../mvnw -Pitests spring-boot:run

最終的には、このようなログをご確認いただけます。

2018-12-20 14:18:01.864  INFO 16432 --- [           main] io.atlasmap.standalone.Application       : Started Application in 4.124 seconds (JVM running for 4.474)
2018-12-20 14:18:01.864  INFO 16432 --- [           main] io.atlasmap.standalone.Application       : ### AtlasMap Data Mapper UI started at port: 8585 ###

ご利用されているブラウザーで、localhost:8585 にアクセスしてください。DataMapper が表示されるはずです。



無事に起動を確認された方は、なんとなく UI をいじってみてください。5分ぐらい触っていただくと、なんとなくわかります。
左側の "Source" で、変換前のデータ構造/形式をインポートして表示します。
右側の "Target" で、変換後のデータ構造/形式をインポートして表示します。

現時点では、Java、XML、JSON形式のデータ構造に対応しています。
インポート方法ですが、"Source" や "Target" と書かれた右隣にある矢印ボタンにマウスカーソルをあわせると、"import instance or schema file" とポップアップがでるので、なんとなくわかります。
説明文から気が付くかと思いますが、xml schema ではなく、 xmlファイルを読み込ませても データ構造を解析してくれます。Javaですと jarアーカイブで複数クラスを読み取らせることもできます。
隣にある プラスアイコンも、ポップアップから機能を理解できます。例えば jarアーカイブを取り込んだ場合、パッケージとクラス名を記入すると、マッピング用に該当クラスの解析結果が出力されます。



"Source" と "Target" にそれぞれデータ構造をインポートした後は、それぞれのデータ カラムをクリックすることで、マッピング作業を実施できます。
右側のパネルをみると、Actionパネルで 分割や結合の指定もできるのが読み取れます。

Fuse Online 7.2から提供された機能ですが、画面右上の 設定用ギアアイコン をクリックし、"Show Mapping Preview"にチェックを入れると、ダミーデータを使ったシミュレートも可能です。




マッピング作業が終了したら、画面右上にある 出力矢印のアイコンをクリックし、定義済みファイルをエクスポートします。



年内を目処に、次回は実行方法についてまた記事を書きたいと思います。
赤帽ブログを通して告知しますので引き続きよろしくお願いします。

2017年7月27日木曜日

原文: Reference Architecture for Agile Integration By Christina Lin July 27, 2017

アジャイル・インテグレーションの リファレンス・アーキテクチャー

















この投稿はあくまでも著者による個人の意見であり、Red Hatによる見解ではありません。


現在のインテグレーションは、今までとは異る形で存在しています。 近代的なインテグレーションとはどういったものでしょうか? 従来のウォータフォール開発が、どのように スクラム開発(アジャイル)へ置き換わったのかを考えてみると、短期リリースサイクルの実現や、フィードバックの早期反映、変更への柔軟な対応を可能にする為であったと言えます。 同じように従来のインテグレーションは、アジャイルへ置き換わるべきだと私は信じます。従来の ESB を分散型のマイクロサービスへ解体する事で、アジャイルを実現します。

アジャイル・インテグレーションに必要な要素を簡単におさらいします:
  • 分散型・インテグレーション
    • 軽量で、分散配備に対応
    • パターンベースのインテグレーション
    • 再利用可能なコネクター
    • マイクロサービス
  • コンテナ
    • クラウド・ネイティブ
    • リーンな成果物であり、個別に配備可能
    • コンテナベースでスケーリングや高可用性に対応
  • API
    • よく定義され再利用可能であり、よく管理されたエンドポイント
    • エコシステムの活用
私は、これら3つの原則に基づいたリファレンスアーキテクチャを作成するよう求められました。たくさんのボックスやダイアグラムのスケッチを繰り返しながら熟考しました。ある日、3歳児が遊んでいる様子を眺めている時、ついに閃いたのです。これが私の答えです...

そう、これが アジャイル・インテグレーションのリファレンス・アーキテクチャーです! ソフトウェア プロジェクトの設計段階では、リファレンス・アーキテクチャがしばしば必要になります。リファレンス・アーキテクチャーは、ソフトウェア プロジェクトの構造とバックボーンを提供します。一旦それら設計フェーズの終了が意味するものは、切り戻しできない完全なコミットであったりします。アーキテクチャ上の変更は困難であり、悲惨な結果をもたらす可能性があるからです。私たちは皆、「ソフトウェア開発において、変わらない事は、いつまでたっても変わらない」ことを知っています。おそらく、規制要件、市場要求、または、よりビジネス ドメインに関する学習に、ウェイトを置いている為かもしれません。そこで私は、変化に対して柔軟性のあるアーキテクチャを構築し、必要に応じてプロジェクトの要求に適応することができるかを考え始めました。これは、前述したコンセプトに基づいた、アジャイル・インテグレーションのリファレンス・アーキテクチャーです。即ち、多面的な柔軟性を可能にする先進的なインテグレーション・アプリケーション開発のアーキテクチャーです。
アジャイル・インテグレーションのリファレンス・アーキテクチャー ダイアグラムには、以下の主要コンポーネントがあります:

PaaS - 自動化されたプロビジョニングを可能にするだけでなく、開発者に対してセルフサービスを可能にすることで、迅速なソフトウェア開発を提供するインフラ基盤です。また、システム環境全体が DevOps 対応になるので、運用効率を向上させます。

セキュリティ/アイデンティティ管理(IAM) - アプリケーション・インターフェースとプラットフォームの、基本的な認証/認可を処理します。

自動化 - アプリケーションのビルド処理に関するプロセスと、アップグレードの為のローリング・デプロイメント戦略の両方を自動化します。CIツール(継続的インテグレーションツール)とあわせて、アプリケーション・ソフトウェアの継続的な提供が可能になります。

ログとトレース - モノシリックな世界では簡単なものが、分散マイクロサービスアーキテクチャにおける課題の1つになっています。どのように処理されているか一元的に把握することが難しくなった為です。ログ全体を確認できる手段や、様々なアクティビティをトレースできる機能を提供することが重要です。

コンテナ化されたパッケージ - コンテナ技術は、プログラム言語に依存しない、不変のポータブルな軽量アプリケーションパッケージを構築することを可能にします。このビルドパッケージと設定は独立しているので、同じパッケージを複数の異る環境に素早く配備することができます。

コンテナ管理 - 大規模システムでは、アプリケーションを実行するすべてのコンテナを管理するための、便利な管理プラットフォームが不可欠です。実行中のコンテナに対して、監視、検出、回復、フェイルオーバーを実行します。

マイクロサービス - 大規模なアプリケーション/サービスを、メンテナンスの用意なピースに分割します。個々のピースはそれぞれ独立して開発され、分散環境に配備されます。それぞれのピースは、障害を考慮して構築される必要があります。

ロードバランス/サービス・ディスカバリー/ネットワーク管理 - マイクロサービスは、柔軟性を考慮して構築されています。よって、システムの負荷に応じて、自動的に負荷をそれぞれ稼働中のインスタンスへ分散する必要があります。すべてのサービスは登録され、複雑な設定をせずにシステム内で確認できる必要があります。外部ユーザーから配備の複雑さを隠蔽する為に、プロキシーエンドポイントであることが理想的です。

階層化アーキテクチャー - マイクロサービスを論理的に、複数レイヤー層で構成してみます。それぞれのレイヤーは、他のレイヤーと重複しない独自の責務を持つようデザインし、後々個々のレイヤーで変更しやすくしています。結果、4つのレイヤーになりました:
  • ゲートウェイ レイヤー - バージョン管理などの簡単なゲートウェイ・ルーティング機能を提供し、様々なプラットフォームデバイスに対応可能です。
  • コンポジット レイヤー - 複数マイクロサービス群を処理する重要な中間層です。中間層では、コンテンツのデータ自体の処理からより複雑なルーティングを行い、時にはデータの集約や正規化を実施します。
  • ベース レイヤー - 名前の意味するように、システムの基本的なコンポーネントを示します。データ検索や、ビジネスロジックを処理します。
  • 腐敗防止レイヤー - このレイヤーは、レガシーアプリケーションや、俊敏性で柔軟性のあるマイクロサービスの原理に反する処理へのインターフェースを提供します。このレイヤーは、防御壁としてあなたのシステムに組み込まれています。実装の非常に異る2つのシステム間で、ジョブの変換や翻訳を実施します。
アプリケーション ドメイン -  これはアーキテクチャーというよりも、パターンに似ています。ソフトウェアのレイヤーについて言及したので、このトピックについても少し触れます。マイクロサービスをより組織的な方法で再編成するための話しになります。アプリケーションドメインをそれぞれ定義することをお薦めします。(同じデータ・モデルのセットを使います) ドメイン間を結ぶため、外部にインテグレートされたマイクロサービスを別途所持することもあります。マイクロサービスに関するもう1つの良い点は、小さいなマイクロサービスを、それぞれ最適なドメインへ移動することができる柔軟性です。

API 管理 - 強化されたアクセスポリシーの利用や、使用状況の統計情報を収集し、APIを管理します。また、API開発者とユーザーの間に、健全なエコシステムを構築します。さらに、APIの使用自体を収入源にすることが可能になります。

今日の技術では、完全に柔軟なアーキテクチャを実現するうえで、いくつかの制限があります。しかし、このモデルを使うことで、システムに変更が発生した時でも、大きな影響を与えない柔軟性をもたらすことができると私は信じています。詳細については、今後の記事で紹介します。


"Red Hat Developers membership"を利用し、無料で RHELをダウンロードしてください。


"Red Hat Developer Program"(無料)に参加し、関連するチートシートや、書籍、製品ダウンロードサイトにアクセスしてください。

Red Hat OpenShiftおよびその他の関連トピックについては、OpenShiftOpenShift Onlineをご参照してください。

原文: Reference Architecture for Agile Integration By Christina Lin July 27, 2017

2015年5月13日水曜日

JBoss BPM Suite クイックガイド: JBoss EAP 6.4 を使ったアプリケーションをビルドするには

原文: JBoss BPM Suite Quick Guide: Changes You Need for Building Applications with JBoss EAP 6.4 Modules by Eric D. Schabell

今週の tips & tricksは、4月16日(木)にリリースされた JBoss BRMS 6.1についてご紹介します。

以前の記事でもご紹介しましたが、この新しいリリースには、いくつもの興味深い新機能が含まれています。

JBoss Demo Centralで公開されているデモプロジェクトのアップデート作業をする際、Cool Storeデモのウェブアプリケーションのコードは、JBoss BRMS 6.1のベースプラットフォームである JBoss EAP 6.4を対象にビルドした方が良いと気づきました。

Figure 1: JBoss EAP 6.1に含まれる JBoss BRMSモジュール
以前のバージョン( JBoss BRMS か JBoss BPM Suite)をインストールした際に生成されるモジュールに対し、ウェブアプリケーションをビルドされる場合、モジュールは JBoss EAPサーバーの modulesディレクトリにありました。パスは figure 1をご確認ください。

figure1は、JBoss BRMS用の図となりますのでご注意ください。JBoss BPM Suiteでも同様の階層構造になりますが、フォルダー名が brmsではなく bpmsとなります。

JBoss EAP 6.4をベースとした JBoss BRMS 6.1 か JBoss BPM Suite 6.1に対し、同じ maven configurationであなたのプロジェクトをビルドされた場合、うまくいかない事に気付くでしょう。

figure 2にある JBoss EAP 6.4の modulesディレクトリーを figure 1と比較すると、理由がわかるはずです。

layers配下に、インストール時に生成されるモジュールがありません。ビルドされたいプロジェクトの maven configurationを修正し、JBoss Maven リポジトリーから依存関係を取得する必要があります。

Figure 2: JBoss EAP 6.4にはモジュールが無い
修正方法が気になりますよね。

ほんの数分で Maven configurationを修正できます。簡単ですよ。

以前の記事で、JBoss Mavenリポジトリから依存関係を取得する方法をご案内しました。今回は完結に、configurationに記載すべきコードをご案内します:

<repositories>
 <repository>
  <id>jboss-maven-repository</id>
  <name>JBoss Maven Repository</name>
  <url>http://maven.repository.redhat.com/techpreview/all/</url>
  <layout>default</layout>
  <releases>
   <enabled>true</enabled>
   <updatePolicy>never</updatePolicy>
  </releases>
  <snapshots>
   <enabled>false</enabled>
   <updatePolicy>never</updatePolicy>
  </snapshots>
 </repository>
</repositories>

<pluginrepositories>
 <pluginrepository>
  <id>jboss-maven-repository</id>
  <name>JBoss Maven Repository</name>
  <url>http://maven.repository.redhat.com/techpreview/all/</url>
  <layout>default</layout>
  <releases>
   <enabled>true</enabled>
   <updatePolicy>never</updatePolicy>
  </releases>
  <snapshots>
   <enabled>false</enabled>
   <updatePolicy>never</updatePolicy>
  </snapshots>
 </pluginrepository>
</pluginrepositories>


ビジネスの自動化を検討されていますか?
configurationの設定が終われば、依存関係を取得できるはずです。以前 JBoss BRMS/BPM Suiteのベースとなる JBoss EAP 6.1の modulesディレクトリから依存関係を取得されていた方は、JBoss Mavenリポジトリを使い同様のことが実現できるわけです。

この記事についてご質問がある方は、気軽にコメントをください。

原文: JBoss BPM Suite Quick Guide: Changes You Need for Building Applications with JBoss EAP 6.4 Modules by Eric D. Schabell