WildFly Swarmではじめる
「パーツとしてのJavaEE」
2015/07/03 @koduki
JavaEEコンテナの世界観
● 従来のJavaEEコンテナのインフラは全てを集約する
● セッションレプリケーション
● クラスタ
● 負荷分散
● 名前解決
● 無停止デプロイ
● 効率化のため一つのシステムに複数のアプリをデプロイ
JavaEEコンテナの世界観
GlassFish/Weblogic/WildFly
App レプリケーション
負荷分散監視
従来のJavaEEコンテナの限界
● ブルーグリーンデプロイメントとかを考えるとクラスタリン
グ機能が弱い
● すべてをJavaEEで完結するのは難しい(Apache, KVS,
ローカルファイル)
-> Dockerとかと組み合わせやすい、もっとシンプルなコン
テナがほしい
WildFly Swarm
● SpringBootのJavaEE版
● WildFlyのコンポーネントを組み合わせて実行可能なJar
を作る
● 内部的にはArquillianと同様にShrinkwrapを使って
るっぽい
● DockerやConsulなどJavaEE以外の仕組みでクラス
タリング、スケジューリングする事が前提
WildFly-Swarmの世界観
App(WildFly)
レプリケーション(Redis)
負荷分散
(mod_mruby)
監視(Zabbix)
WildFly Swarmのメリット
● JavaEEコンテナにすべての機能を載せない
● アプリケーション単位でプロセスが立上がるので、リ
ソース管理や運用が分かりやすい
● デーモン化しないので、Dockerとかと組み合わせや
すい
● ローカル端末にアプリケーションコンテナのインストー
ルが不要
WildFly Swarmの世界観
● JavaEEコンテナにすべての機能を乗せない
● DockerやConsulなどの複合システムにおいて、アプ
リケーション実行環境のみを提供する「パーツ」に。
● JavaEEコンテナで完結する世界よりは複雑だが、
JavaEEとそれ以外が共存する世界よりは統合され
ている
類似のアプローチ
● Payara Micro(GlassFish)
● Liberty Profile(WebSphere)
対極のアプローチ
● 次期Weblogic 12cのマルチテナント
● 今までのJavaEEらしさを追及
● JavaEEで完結するなら、OS仮想化やDocker使うよ
りも簡単で効率的
現状のWildFly Swarm
● WildFly 9ベース。1.0.0.Alpha3
● CDI, JAX-RS, JPAなどは動く
● JSFなど、正常動作しない機能もまだ多い
デモ
● JAX-RS, CDI, JPA(h2database)を使ったシンプル
なデモ
● mavenやNetBeansから簡単に実行可能
● コードは下記を使用
○ https://github.com/koduki/example-wildfly-
swarm/tree/0.1.0
JAX-RS
● JAX-RSとCDIを使ったありふれたリソース
@ApplicationScoped
@Path("/employees")
public class EmployeeResource {
@Inject
private EmployeeService employeeService;
@GET
@Produces(MediaType.APPLICATION_JSON)
public List<Employee> findAll() {
List<Employee> results = employeeService.findAll();
System.err.println(results);
return results;
}
}
CDI
● CDIを使った良くあるサービスクラス
@ApplicationScoped
public class EmployeeService {
@Inject
EntityManager em;
public List<Employee> findAll() {
return em.createQuery("SELECT e FROM Employee e", Employee.
class).getResultList();
}
}
JPA
● LombokとJPAを使った普通のEntity
@Entity
@Data
@AllArgsConstructor
public class Employee implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private String name;
public Employee() {}
}
Swarm固有の部分 - bootstrap
● mainメソッドにコンテナの起動を記述
public class Main {
public static void main(String[] args) throws Exception {
Container container = new Container();
JAXRSDeployment deployment = ….
container.start().deploy(deployment);
}
Swarm固有の部分 - pom.xml - 1
● pom.xmlにてpackageはjarに設定
● MavenはNetBeans 8.02組み込みのバージョンでは
古いので、3.2以上を個別にインストールするしないと
エラーになる
<packaging>jar</packaging>
<name>example-wilfly-swarm</name>
<properties>
<version.wildfly-swarm>1.0.0.Alpha3</version.wildfly-swarm>
<maven.min.version>3.2.1</maven.min.version>
<maven.compiler.target>1.8</maven.compiler.target>
<maven.compiler.source>1.8</maven.compiler.source>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
Swarm固有の部分 - pom.xml - 2
● wildfly-swarm-pluginに起動するクラスを指定
<plugin>
<groupId>org.wildfly.swarm</groupId>
<artifactId>wildfly-swarm-plugin</artifactId>
<version>${version.wildfly-swarm}</version>
<configuration>
<mainClass>cn.orz.pascal.example.wilfly.swarm.Main</mainClass>
</configuration>
<executions>
<execution>
<goals>
<goal>package</goal>
</goals>
</execution>
</executions>
</plugin>
アプリケーションの実行
● mvn packageで${app-name}-swarm.jarができる
● java -jar ${app-name}-swarm.jarで実行
● IDEからの起動は普通にbootstrapになるMainクラス
を実行するだけ
● WildFlyのインストール等は不要
まとめ
● SpringBoot的なJavaEEコンテナ
● jarがあれば動くので配布は簡単
● JavaEEでの完結をあきらめて、エコシステムで動く
「パーツ」として使う
● Dockerとの相性は良さそう
● まだまだ発展途上

WildFly Swarmではじめる「パーツとしてのJavaEE」