狠狠撸

狠狠撸Share a Scribd company logo
JavaOne2015 - Java EE
2015/11/14 上妻 宜人 (あげつま のりと)
? APサーバサポート、Javaトラブルシューティング
? ブログ 見習いプログラミング日記
? twitter: @n_agetsu
上妻 宜人 (あげつま のりと)
? Java EE 8 のアップデート
? Early Draft Review1: Servlet4.0, JMS2.1
? ドラフト未リリース: JAX-RS2.1, JPA2.2
? Java EE 周辺の話
? WildFly Swarm
本日の内容
Java EE 8 はまだ検討中。
この先の内容は、今後大きく変わる
可能性があります。
Servlet4.0
現在のステータス: Early Draft Review
JSR-368 https://jcp.org/en/jsr/detail?id=368
Servlet 4.0
サーブレットコンテナもHTTP/2通信に対応
? 2015年5月 RFC 7540で公開。SPDYが原型。
? 多重化 / バイナリフレーム / ヘッダ圧縮
? ヘッダの意味合い (GET/POST/200 OK など) は基本的に踏襲
client server
client server
client server
並行リクエストは、複数TCP接続が必要
ブラウザ実装によっては同時接続数『6』 1TCP接続で多重化
TCPコネクション_1
TCPコネクション_2..
Servlet 4.0
HTTP/2 ストリームによる多重化
Connection : 1つのTCPコネクション
Stream : 1つのリクエスト & レスポンスの組
Stream id=1
Stream id=1 .. N:
http://chimera.labs.oreilly.com/books/1230000000545/ch12.html#HTTP2_STREAMS_MESSAGES_FRAMES
Request
Stream: 1
:method: GET ...
Frame : HTTP2.0通信の最小単位
Stream: 1
:status:200
HEADERS frame
Stream: 1
response data
DATA frame
Response
Servlet 4.0
HTTP/2 ストリームによる多重化のServlet影響
? APIのユーザ視点では影響はあまりない
? 1リクエスト => 1レスポンス の法則が崩れなければ、
doGet, doPostメソッドの現状の仕組みがそのまま使える
? HttpServletRequest/HttpServletResponse へのメソッド追加
? int getStreamId()
? ストリームIDを知りたい機会は少ないと思う
Servlet 4.0
HTTP/2 サーバプッシュ
client server
.html
.js
.png
.css
? SSE/WebSocketとは用途が異なる
? 関連リソースをサーバプッシュ
? 例えばhtmlの要求がきたら
? 関連のjs, png, css もプッシュする
? 従来はインラインイメージを適用
? 1リクエスト => 1レスポンスが崩れる
? 今までのHttpServletResponseは
1レスポンスが前提
Servlet 4.0
HTTP/2 サーバプッシュのServlet影響
public void doGet(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException {
PushBuilder builder = request.getPushBuilder();
builder.setPath(“/style.css”);
builder.push();
res.setContentType(“text/html”);
PrintWriter out = res.getPrintWriter();
out.println(“<html>”);
out.println(“<head>”)
out.println(“<link rel=”stylesheet” type=”text/css” href=“style.css”>”);
…
}
Servlet4.0 まとめ
? HTTP/2 対応
– サーブレットコンテナがHTTP/2に対応
– ストリームID取得, サーバプッシュ向けAPIの追加
? 本日は未紹介
– (検討中) Java9 Flow対応によるリクエスト処理
JAX-RS2.1
現在のステータス: ドラフト未リリース
JSR-370 https://jcp.org/en/jsr/detail?id=370
JAX-RS2.1
主なテーマ
? 非同期クライアントAPIの改善
? ノンブロッキング I/O
? Server-Sent Event
– Jersey実装と同じ
JAX-RS2.1
非同期クライアントAPIの改善
? 並列で依存関係のあるWebAPIを呼び出したい
? Jerseyには既に実装がある
? RxJava Observable, Java 8 CompletableFuture 対応
出張手配
サービス
新幹線予約
ホテル予約大阪1泊2日で!
手配完了
料金請求
1. 予約を並列実行
2. 予約が終わったら
請求サービスに投げる
JAX-RS2.1
非同期クライアント: rx()によるCompletationState取得
// Aの問い合わせ (非同期)
WebTarget targetA = Client.newClient().target(...);
CompletionStage<User> a = target1.request().resolveTemplate(“id”, 1)
.rx().get(User.class);
// Bの問い合わせ (非同期)
CompletionState<Product> b = targetB.request().resolveTemplate(“id”, 1)
.rx().get(Product.class);
// AとBの結果を組み合わせて、Cに問い合わせ (非同期)
CompletionState<String> c = a.thenCombine(b, (user, product) ->
targetC.request()
.resolveTemplate(“user”,user)
.resolveTemplate(“prod”,product).rx().get(...)));
// 最終的な結果の取得
c.join();
a
b
c 最終的な結果
JAX-RS2.1
非同期クライアント: rx()によるCompletationState取得
// Aの問い合わせ (非同期)
WebTarget targetA = Client.newClient().target(...);
CompletionStage<User> a = target1.request().resolveTemplate(“id”, 1)
.rx().get(User.class);
// Bの問い合わせ (非同期)
CompletionState<Product> b = targetB.request().resolveTemplate(“id”, 1)
.rx().get(Product.class);
// AとBの結果を組み合わせて、Cに問い合わせ (非同期)
CompletionState<String> c = a.thenCombine(b, (user, product) ->
targetC.request()
.resolveTemplate(“user”,user)
.resolveTemplate(“prod”,product).rx().get(...)));
// 最終的な結果の取得
c.join();
a
b
c 最終的な結果
JAX-RS2.1
非同期クライアント: アノテーションによる依存性制御
class DeclarativeRxHandler {
@FinalResult
public String getC(
@PartialResult(“A”) String a, @PartialResult(“B”) String b) {
return a;
}
@PartialResult(“A”)
public CompletableFuture<String> getA() {...}
@PartialResult(“B”)
public CompletableFuture<String> getB() {...}
}
A
B
C 最終的な結果
JAX-RS2.1
ノンブロッキング I/O - 背景
? 不安定/遅いネットワークからファイルアップロード
? CPUは別スレッドに割当てられても、メモリは1MB消費し続ける
@Path(“/upload”)
public class FileUploadResource {
@POST @Consumes(MediaType.MULTIPART_FORM_DATA)
public void upload(@FormDataParam(“file”) InputStream input, ...) {
byte[] buf = new byte[1024];
int readed;
try {
while ((readed = input.read(buf)) != -1) {
// write file ...
} catch (IOException e) {...}
}
データが来るまでブロック
(64bitJVM)
@POST @Consumes(MediaType.APPLICATION_OCTET_STREAM)
public void upload(@QueryParam(“path”) String path,
@Context request, @Suspend AsyncResponse response) {
FileOutputStream out = new FileOutputStream(tmpdir);
byte[] buf = new byte[1024];
request.entity(input -> {
try {
if (input.isFinished()) {
// データ読み込み完了
out.close();
response.resume(“Upload Completed”);
} else {
final int n = input.read(buffer);
out.write(buffer, 0, n);
}
} catch (IOException e) {...}
}
}
JAX-RS2.1
ノンブロッキング I/O - JavaOneで紹介されていたアイディア
@POST @Consumes(MediaType.APPLICATION_OCTET_STREAM)
public void upload(@QueryParam(“path”) String path,
@Context request, @Suspend AsyncResponse response) {
FileOutputStream out = new FileOutputStream(tmpdir);
byte[] buf = new byte[1024];
request.entity(input -> {
try {
if (input.isFinished()) {
// データ読み込み完了
out.close();
response.resume(“Upload Completed”);
} else {
final int n = input.read(buffer);
out.write(buffer, 0, n);
}
} catch (IOException e) {...}
}
}
ブロックしない
読込可能データの発生毎に
繰り返しコールバックされる?
JAX-RS2.1
ノンブロッキング I/O - JavaOneで紹介されていたアイディア
JAX-RS2.1
ノンブロッキング I/O - まだまだ検討中
? 本当に必要? 色々と議論がある
? ユーザレベルでNIOを意識しなくても良いのでは など?
– MessageBodyReader, MessageBodyWriterの実装内に隠蔽
(JAX-RSランタイムの中の json read/write 時に利用)
– Servlet コンテナのコネクタ実装としてのNIOで十分では?
JMS2.1
現在のステータス: Early Draft Review
JSR-368 https://jcp.org/en/jsr/detail?id=368
JMS2.0
Java EE 7 - JMS2.0のMDBを振り返る
@MessageDriven(
activationConfig = {
@ActivationConfigProperty(
propertyName="destinationType", propertyValue="javax.jms.Queue"),
@ActivationConfigProperty(
propertyName="destination", propertyValue="java:/queue/myQueue")
})
public class SampleMDB implements MessageListener {
@Override
public void onMessage(Message message) {
try {
TextMessage textMessage = (TextMessage) message;
System.out.println(textMessage.getText());
} catch (JMSException e) {
e.printStackTrace();
}
}
}
@MessageDriven(
activationConfig = {
@ActivationConfigProperty(
propertyName="destinationType", propertyValue="javax.jms.Queue"),
@ActivationConfigProperty(
propertyName="destination", propertyValue="java:/queue/myQueue")
})
public class SampleMDB implements MessageListener {
@Override
public void onMessage(Message message) {
try {
TextMessage textMessage = (TextMessage) message;
System.out.println(textMessage.getText());
} catch (JMSException e) {
e.printStackTrace();
}
}
}
JMS2.0
Java EE 7 - JMS2.0のMDBを振り返る
何のリスナ (Queue or Topic)を
文字列で指定する必要がある
@MessageDriven(
activationConfig = {
@ActivationConfigProperty(
propertyName="destinationType", propertyValue="javax.jms.Queue"),
@ActivationConfigProperty(
propertyName="destination", propertyValue="java:/queue/myQueue")
})
public class SampleMDB implements MessageListener {
@Override
public void onMessage(Message message) {
try {
TextMessage textMessage = (TextMessage) message;
System.out.println(textMessage.getText());
} catch (JMSException e) {
e.printStackTrace();
}
}
}
JMS2.0
Java EE 7 - JMS2.0のMDBを振り返る
インタフェースの実装、
Messageのキャストが必要
JMS2.1
JMS2.1の主な機能追加
? MDBからMessageListenerの実装を不要とする
? タイプセーフ
? キャストの不要化
? 1クラスで複数コールバックメソッドを実装
JMS2.1
JMS2.1ドラフト: @JMSQueueListener
@MessageDriven
public class SampleMDB {
@JMSQueueListener (destionationLookup = “java:/queue/myQueue”)
public void printMessage(TextMessage text) {
try {
System.out.println(text.getText());
} catch (JMSException e) {
e.printStackTrace();
}
}
}
@MessageDriven
public class SampleMDB {
@JMSQueueListener (destionationLookup = “java:/queue/myQueue”)
public void printQueue1Msg(TextMessage text) {
….
}
@JMSQueueListener (destionationLookup = “java:/queue/myQueue2”)
public void printQueue2Msg(TextMessage text) {
….
}
}
JMS2.1
JMS2.1ドラフト: 1クラスに複数コールバック定義
? MDB停止中のトピック書き込みは検知できない
? JMS2.0では
@ActivationConfigProperty(
propertyName="subscriptionDurability“, propertyValue="NonDurable")
@MessageDriven
public class SampleMDB {
@JMSNonDurableTopicListener(destinationLookup=“java:/topic/myTopic”)
public void printMessage(TextMessage text) {
….
}
}
JMS2.1
JMS2.1ドラフト: トピック向け非永続化サブスクライバ
@MessageDriven
public class SampleMDB {
@JMSDurableTopicListener (
destinationLookup=“java:/topic/myTopic”, cliendId=“someid”,
subscriptionName=“somename”)
public void printMessage(TextMessage text) {
….
}
}
? 全永続化サブスクライバの受信までメッセージ削除されない
? JMS2.0では
@ActivationConfigProperty(
propertyName="subscriptionDurability“, propertyValue="Durable")
@ActivationConfigProperty(propertyName=“clientid”, propertyValue=“someid”)
@ActivationConfigProperty(propertyName="subscriptionName", propertyValue=“somename")
JMS2.1
JMS2.1ドラフト: トピック向け永続化サブスクライバ
JMS2.1 まとめ
? 今のところはMDBのシンプル化が主な内容
? CDI管理Beanによるメッセージ受信は検討中
(Early Draft Review1には含まれていない)
JPA2.2
現在のステータス: ドラフト未リリース
JSRなし (状況はJIRA参照https://java.net/jira/browse/JPA_SPEC)
JPA2.2
検討中の主な項目
? Java SE 8対応
? Date and Time API への対応
? @NamedQueryのRepeatableアノテーション対応
? スクロール機能の標準化
? 例: org.hibernate.ScrollableResults
JPA2.2
スクロール機能の標準化 - getStreamResult()
Query q = em.createQuery(“select e from Employee e”);
// OutOfMemoryError ??
List<Employee> employees = q.getResultList();
// 少ないJavaヒープメモリで動作
int total = q.getStreamResult().collect(
Collectors.summingInt(Employee::getSalary));
Java EE 8 スケジュール
Java EE 8 & GlassFish5リリースは2017上半期予定
? 2015 Q4 Early Draft
? 2016 Q1 Public Review
? 2016 Q4 Proposed Final Draft
? 2017年上半期 Final 予定
Java EE 周辺の話
Spring Boot風 Java EE “WildFly Swarm”
WildFly Swarm
Java EE で java -jar myapp.jar 起動
? Spring Boot風のJava EE
? 2015/5 に1.0.0.Alpha1リリース
– まだ実験的: (最新) 2015/10/25 1.0.0.Alpha5
? APサーバの事前インストールが不要になる
? java -jar myapp.jar で手軽に起動
なぜ WildFly Swarm
Spring Bootとは少し背景が違う
? Spring Bootの背景 (集約)
? 機能が豊富で、pom.xml の組み合わせ方法が難しい
=> 推奨組み合わせを作って、簡単に使えるようにした
? WildFly Swarmの背景 (分解)
? Java EE をフルセットで使う人は少ない
=> アプリで利用する機能だけ一式jarにまとめて軽量化
Hello World!
1. 利用したい機能をpom.xmlに記述
<dependencies>
<dependency>
<groupId>org.wildfly.swarm</groupId>
<artifactId>wildfly-swarm-jaxrs-weld</artifactId>
<version>${version.wildfly-swarm}</version>
</dependency>
<dependency>
<groupId>org.wildfly.swarm</groupId>
<artifactId>wildfly-swarm-jpa</artifactId>
<version>${version.wildfly-swarm}</version>
</dependency>
</dependencies>
JAX-RS & CDI
JPA
組み込みH2の起動
データソースExampleDS追加
Hello World!
2. uber jar を作成する wildfly-swarm-plugin
<plugin>
<groupId>org.wildfly.swarm</groupId>
<artifactId>wildfly-swarm-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>package</goal>
</goals>
</execution>
</executions>
</plugin>
? Mavenプラグインによりmvn packageで実行可能jarを生成
Hello World!
3. 通常と変わりなくコードを書く
@Path("/")
public class EmployeeResource {
@Inject
EntityManager em;
@GET
@Produces("application/json")
public List<Employee> get() {
return em.createNamedQuery("Employee.findAll", Employee.class)
.getResultList();
}
}
Hello World!
4. アプリケーションの起動
? デフォルト設定利用時はmainメソッド不要
? mvn package; java -jar target/xxx-swarm.jar
– 必要なモジュールのみjarにまとめられる
– JAX-RS+CDI+JPAアプリで94MB(WildFly全体約127M)。まだ大きい。
? サンプルコードが豊富
– https://github.com/wildfly-swarm/wildfly-swarm-examples
Hello World!
カスタム設定はmainメソッドに実装
public static void main(String[] args) throws Exception {
Container container = new Container();
/ /H2向けJDBCドライバの登録と、データソースの生成
container.fraction(new DatasourcesFraction()
.jdbcDriver("h2", (d) -> {
d.driverDatasourceClassName("org.h2.Driver");
d.xaDatasourceClass("org.h2.jdbcx.JdbcDataSource");
d.driverModuleName("com.h2database.h2");
})
.dataSource("MyDS", (ds) -> {
ds.driverName("h2");
ds.connectionUrl("jdbc:h2:mem:test;DB_CLOSE_DELAY=-1;... ");
ds.userName("sa");
ds.password("sa");
})
);
....
Hello World!
カスタム設定はmainメソッドに実装
public static void main(String[] args) throws Exception {
Container container = new Container();
/ /H2向けJDBCドライバの登録と、データソースの生成
container.fraction(new DatasourcesFraction()
.jdbcDriver("h2", (d) -> {
d.driverDatasourceClassName("org.h2.Driver");
d.xaDatasourceClass("org.h2.jdbcx.JdbcDataSource");
d.driverModuleName("com.h2database.h2");
})
.dataSource("MyDS", (ds) -> {
ds.driverName("h2");
ds.connectionUrl("jdbc:h2:mem:test;DB_CLOSE_DELAY=-1;... ");
ds.userName("sa");
ds.password("sa");
})
);
....
デフォルト設定を調べるには
Fraction: WildFlyのサブシステムのようなもの
? Swarmのソースより、xxxFraction.java クラスの中を確認
– デフォルト値はWildFlyの設定値 (standalone.xml) とほぼ同じ
public class JPAFraction extends JPA<JPAFraction> implements Fraction {
...
@Override
public void initialize(Container.InitContext initContext) {
if (!inhibitDefaultDatasource) {
final DatasourcesFraction datasources = new DatasourcesFraction()
.jdbcDriver(new JDBCDriver("h2")
.driverName("h2")
.driverDatasourceClassName("org.h2.driver")
.....
主なFraction
Java EE 以外からも機能を取り込み
? Java EE : JAX-RS, JSF, JPA, CDI, Transaction, JMS ...
? logstash
? サーバログをlogstashサーバ(TCP)に送る機能
? java -Dswarm.logstash.hostname -Dswarm.logstash.port
? Netflix OSS(Ribbon, Hystrix), Jolokia (JMX REST-API)
? 一覧はSwarmユーザガイド参照
https://wildfly-swarm.gitbooks.io/wildfly-swarm-users-guide/
SwarmによるJava EEの分解を見て
Java EE にもマイナーアップデートが欲しい
? Spring Frameworkは着実に進化
– 4.0 (2013/12) => 4.1 (2014/9) => 4.2 (2015/7)
? Java EE は標準化に時間が掛かる
– Java EE 7 (2013年) => Java EE 8 (2017年予定)
– 実装サーバは仕様がFinalになってから1年ぐらい後
– 例えば JCache + MVC + Java 8 RepetableAnnotation 対応で
Java EE 7.1 など
まとめ
まとめ
? Java EE 8 は2017年リリース予定
– HTTP/2対応、非同期、APIのシンプル化
– 徐々にではあるが、検討が進み始めている
? Java EE 周辺
– WildFly Swarmの進化に期待

More Related Content

What's hot (19)

Java Batch 仕様 (Public Review時点)
Java Batch 仕様 (Public Review時点) Java Batch 仕様 (Public Review時点)
Java Batch 仕様 (Public Review時点)
Norito Agetsuma
?
Javaアプリケーションサーバ 構築?運用の勘所
Javaアプリケーションサーバ 構築?運用の勘所Javaアプリケーションサーバ 構築?運用の勘所
Javaアプリケーションサーバ 構築?運用の勘所
Takahiro YAMADA
?
はじめての闯笔础
はじめての闯笔础はじめての闯笔础
はじめての闯笔础
kawaba
?
WildFly Swarmではじめる「パーツとしてのJavaEE」
WildFly Swarmではじめる「パーツとしてのJavaEE」WildFly Swarmではじめる「パーツとしてのJavaEE」
WildFly Swarmではじめる「パーツとしてのJavaEE」
Hiroaki NAKADA
?
奥别产アプリに低レイテンシ?高可用性を求めるのは间违っているのだろうか
奥别产アプリに低レイテンシ?高可用性を求めるのは间违っているのだろうか奥别产アプリに低レイテンシ?高可用性を求めるのは间违っているのだろうか
奥别产アプリに低レイテンシ?高可用性を求めるのは间违っているのだろうか
Chihiro Ito
?
WildFly Swarm - Rightsize Your Java EE Apps
WildFly Swarm - Rightsize Your Java EE AppsWildFly Swarm - Rightsize Your Java EE Apps
WildFly Swarm - Rightsize Your Java EE Apps
Yoshimasa Tanabe
?
Java EE 7技術アップデート & 逆引き JSF 2.2
Java EE 7技術アップデート & 逆引き JSF 2.2 Java EE 7技術アップデート & 逆引き JSF 2.2
Java EE 7技術アップデート & 逆引き JSF 2.2
Hirofumi Iwasaki
?
Java EE 再入門
Java EE 再入門Java EE 再入門
Java EE 再入門
minazou67
?
(Tech DeepDive #1) Java Flight Recorder を活用した問題解決
(Tech DeepDive #1) Java Flight Recorder を活用した問題解決(Tech DeepDive #1) Java Flight Recorder を活用した問題解決
(Tech DeepDive #1) Java Flight Recorder を活用した問題解決
オラクルエンジニア通信
?
闯补惫补9新机能概要
闯补惫补9新机能概要闯补惫补9新机能概要
闯补惫补9新机能概要
HonMarkHunt
?
闯补惫补におけるネイティフ?コート?连携の各种手法の绍介
闯补惫补におけるネイティフ?コート?连携の各种手法の绍介闯补惫补におけるネイティフ?コート?连携の各种手法の绍介
闯补惫补におけるネイティフ?コート?连携の各种手法の绍介
khisano
?
Prepare for Java 9 #jjug
Prepare for Java 9 #jjugPrepare for Java 9 #jjug
Prepare for Java 9 #jjug
Yuji Kubota
?
闯补惫补仮想マシンの実装技术
闯补惫补仮想マシンの実装技术闯补惫补仮想マシンの実装技术
闯补惫补仮想マシンの実装技术
Kiyokuni Kawachiya
?
Java SE 再入門
Java SE 再入門Java SE 再入門
Java SE 再入門
minazou67
?
Jsf アプリ作ったった
Jsf アプリ作ったったJsf アプリ作ったった
Jsf アプリ作ったった
Oda Shinsuke
?
Hello Java
Hello JavaHello Java
Hello Java
Chihiro Ito
?
これからのJDK/JVM 何を選ぶ?どう選ぶ?
これからのJDK/JVM 何を選ぶ?どう選ぶ?これからのJDK/JVM 何を選ぶ?どう選ぶ?
これからのJDK/JVM 何を選ぶ?どう選ぶ?
Takahiro YAMADA
?
Lambda: A Peek Under The Hood [Java Day Tokyo 2015 6-3]
Lambda: A Peek Under The Hood [Java Day Tokyo 2015 6-3]Lambda: A Peek Under The Hood [Java Day Tokyo 2015 6-3]
Lambda: A Peek Under The Hood [Java Day Tokyo 2015 6-3]
David Buck
?
これからの狈补蝉丑辞谤苍
これからの狈补蝉丑辞谤苍これからの狈补蝉丑辞谤苍
これからの狈补蝉丑辞谤苍
Logico
?
Java Batch 仕様 (Public Review時点)
Java Batch 仕様 (Public Review時点) Java Batch 仕様 (Public Review時点)
Java Batch 仕様 (Public Review時点)
Norito Agetsuma
?
Javaアプリケーションサーバ 構築?運用の勘所
Javaアプリケーションサーバ 構築?運用の勘所Javaアプリケーションサーバ 構築?運用の勘所
Javaアプリケーションサーバ 構築?運用の勘所
Takahiro YAMADA
?
はじめての闯笔础
はじめての闯笔础はじめての闯笔础
はじめての闯笔础
kawaba
?
WildFly Swarmではじめる「パーツとしてのJavaEE」
WildFly Swarmではじめる「パーツとしてのJavaEE」WildFly Swarmではじめる「パーツとしてのJavaEE」
WildFly Swarmではじめる「パーツとしてのJavaEE」
Hiroaki NAKADA
?
奥别产アプリに低レイテンシ?高可用性を求めるのは间违っているのだろうか
奥别产アプリに低レイテンシ?高可用性を求めるのは间违っているのだろうか奥别产アプリに低レイテンシ?高可用性を求めるのは间违っているのだろうか
奥别产アプリに低レイテンシ?高可用性を求めるのは间违っているのだろうか
Chihiro Ito
?
WildFly Swarm - Rightsize Your Java EE Apps
WildFly Swarm - Rightsize Your Java EE AppsWildFly Swarm - Rightsize Your Java EE Apps
WildFly Swarm - Rightsize Your Java EE Apps
Yoshimasa Tanabe
?
Java EE 7技術アップデート & 逆引き JSF 2.2
Java EE 7技術アップデート & 逆引き JSF 2.2 Java EE 7技術アップデート & 逆引き JSF 2.2
Java EE 7技術アップデート & 逆引き JSF 2.2
Hirofumi Iwasaki
?
Java EE 再入門
Java EE 再入門Java EE 再入門
Java EE 再入門
minazou67
?
(Tech DeepDive #1) Java Flight Recorder を活用した問題解決
(Tech DeepDive #1) Java Flight Recorder を活用した問題解決(Tech DeepDive #1) Java Flight Recorder を活用した問題解決
(Tech DeepDive #1) Java Flight Recorder を活用した問題解決
オラクルエンジニア通信
?
闯补惫补9新机能概要
闯补惫补9新机能概要闯补惫补9新机能概要
闯补惫补9新机能概要
HonMarkHunt
?
闯补惫补におけるネイティフ?コート?连携の各种手法の绍介
闯补惫补におけるネイティフ?コート?连携の各种手法の绍介闯补惫补におけるネイティフ?コート?连携の各种手法の绍介
闯补惫补におけるネイティフ?コート?连携の各种手法の绍介
khisano
?
Prepare for Java 9 #jjug
Prepare for Java 9 #jjugPrepare for Java 9 #jjug
Prepare for Java 9 #jjug
Yuji Kubota
?
闯补惫补仮想マシンの実装技术
闯补惫补仮想マシンの実装技术闯补惫补仮想マシンの実装技术
闯补惫补仮想マシンの実装技术
Kiyokuni Kawachiya
?
Java SE 再入門
Java SE 再入門Java SE 再入門
Java SE 再入門
minazou67
?
Jsf アプリ作ったった
Jsf アプリ作ったったJsf アプリ作ったった
Jsf アプリ作ったった
Oda Shinsuke
?
これからのJDK/JVM 何を選ぶ?どう選ぶ?
これからのJDK/JVM 何を選ぶ?どう選ぶ?これからのJDK/JVM 何を選ぶ?どう選ぶ?
これからのJDK/JVM 何を選ぶ?どう選ぶ?
Takahiro YAMADA
?
Lambda: A Peek Under The Hood [Java Day Tokyo 2015 6-3]
Lambda: A Peek Under The Hood [Java Day Tokyo 2015 6-3]Lambda: A Peek Under The Hood [Java Day Tokyo 2015 6-3]
Lambda: A Peek Under The Hood [Java Day Tokyo 2015 6-3]
David Buck
?
これからの狈补蝉丑辞谤苍
これからの狈补蝉丑辞谤苍これからの狈补蝉丑辞谤苍
これからの狈补蝉丑辞谤苍
Logico
?

Viewers also liked (18)

Java Küche 2016 LT 在室状況自動通知ボット #JavaKueche
Java Küche 2016 LT 在室状況自動通知ボット #JavaKuecheJava Küche 2016 LT 在室状況自動通知ボット #JavaKueche
Java Küche 2016 LT 在室状況自動通知ボット #JavaKueche
Yusuke Yamamoto
?
Java EE 7 for Real Enterprise Systems
Java EE 7 for Real Enterprise SystemsJava EE 7 for Real Enterprise Systems
Java EE 7 for Real Enterprise Systems
Hirofumi Iwasaki
?
Seven Points for Applying Java EE 7
Seven Points for Applying Java EE 7Seven Points for Applying Java EE 7
Seven Points for Applying Java EE 7
Hirofumi Iwasaki
?
JavaOne 2016 - Photo Edition -
JavaOne 2016 - Photo Edition - JavaOne 2016 - Photo Edition -
JavaOne 2016 - Photo Edition -
Yuichi Sakuraba
?
JBoss.org – SwitchYardコミュニティ開発者の日常 - JJUG CCC 2014 Spring - R1-4 - #ccc_r14
JBoss.org – SwitchYardコミュニティ開発者の日常 - JJUG CCC 2014 Spring - R1-4 - #ccc_r14JBoss.org – SwitchYardコミュニティ開発者の日常 - JJUG CCC 2014 Spring - R1-4 - #ccc_r14
JBoss.org – SwitchYardコミュニティ開発者の日常 - JJUG CCC 2014 Spring - R1-4 - #ccc_r14
Tomohisa Igarashi
?
JetBrains IDEハンズオン
JetBrains IDEハンズオンJetBrains IDEハンズオン
JetBrains IDEハンズオン
Yusuke Yamamoto
?
What's New in Java SE 9
What's New in Java SE 9What's New in Java SE 9
What's New in Java SE 9
Yuichi Sakuraba
?
複雑さに挑む!カンバンによるプロジェクト マネジメント
複雑さに挑む!カンバンによるプロジェクト マネジメント複雑さに挑む!カンバンによるプロジェクト マネジメント
複雑さに挑む!カンバンによるプロジェクト マネジメント
智治 長沢
?
フ?レセ?ン基礎講座 2016.11
フ?レセ?ン基礎講座 2016.11フ?レセ?ン基礎講座 2016.11
フ?レセ?ン基礎講座 2016.11
智治 長沢
?
Java in the Past, Java in the Future
Java in the Past, Java in the FutureJava in the Past, Java in the Future
Java in the Past, Java in the Future
Yuichi Sakuraba
?
自動テストの誤解とアンチパターン in 楽天 Tech Talk
自動テストの誤解とアンチパターン in 楽天 Tech Talk自動テストの誤解とアンチパターン in 楽天 Tech Talk
自動テストの誤解とアンチパターン in 楽天 Tech Talk
kyon mm
?
Keycloak で SSO #渋谷java
Keycloak で SSO #渋谷javaKeycloak で SSO #渋谷java
Keycloak で SSO #渋谷java
Yoshimasa Tanabe
?
础苍诲谤辞颈诲端末の谤辞辞迟化について
础苍诲谤辞颈诲端末の谤辞辞迟化について础苍诲谤辞颈诲端末の谤辞辞迟化について
础苍诲谤辞颈诲端末の谤辞辞迟化について
Shuichi Takaya
?
これまでのJava これからのJava
これまでのJava これからのJavaこれまでのJava これからのJava
これまでのJava これからのJava
Yuichi Sakuraba
?
メンテナンス性の良い奥别产システムを构筑するために箩补惫补とフロントエント?て?やるへ?きこと
メンテナンス性の良い奥别产システムを构筑するために箩补惫补とフロントエント?て?やるへ?きことメンテナンス性の良い奥别产システムを构筑するために箩补惫补とフロントエント?て?やるへ?きこと
メンテナンス性の良い奥别产システムを构筑するために箩补惫补とフロントエント?て?やるへ?きこと
Mitsuru Ogawa
?
ついに始まるJava EE 7時代のアプリケーション開発
ついに始まるJava EE 7時代のアプリケーション開発ついに始まるJava EE 7時代のアプリケーション開発
ついに始まるJava EE 7時代のアプリケーション開発
Takakiyo Tanaka
?
アプリ開発?端末毎の解像度の違いを吸収する方法 Android Bazaar and Conference 2011 Summer
アプリ開発?端末毎の解像度の違いを吸収する方法 Android Bazaar and Conference 2011 Summer アプリ開発?端末毎の解像度の違いを吸収する方法 Android Bazaar and Conference 2011 Summer
アプリ開発?端末毎の解像度の違いを吸収する方法 Android Bazaar and Conference 2011 Summer
Kunimasa Noda
?
桐岛、搁耻产测やめるってよ
桐岛、搁耻产测やめるってよ桐岛、搁耻产测やめるってよ
桐岛、搁耻产测やめるってよ
Narihiro Nakamura
?
Java Küche 2016 LT 在室状況自動通知ボット #JavaKueche
Java Küche 2016 LT 在室状況自動通知ボット #JavaKuecheJava Küche 2016 LT 在室状況自動通知ボット #JavaKueche
Java Küche 2016 LT 在室状況自動通知ボット #JavaKueche
Yusuke Yamamoto
?
Java EE 7 for Real Enterprise Systems
Java EE 7 for Real Enterprise SystemsJava EE 7 for Real Enterprise Systems
Java EE 7 for Real Enterprise Systems
Hirofumi Iwasaki
?
Seven Points for Applying Java EE 7
Seven Points for Applying Java EE 7Seven Points for Applying Java EE 7
Seven Points for Applying Java EE 7
Hirofumi Iwasaki
?
JavaOne 2016 - Photo Edition -
JavaOne 2016 - Photo Edition - JavaOne 2016 - Photo Edition -
JavaOne 2016 - Photo Edition -
Yuichi Sakuraba
?
JBoss.org – SwitchYardコミュニティ開発者の日常 - JJUG CCC 2014 Spring - R1-4 - #ccc_r14
JBoss.org – SwitchYardコミュニティ開発者の日常 - JJUG CCC 2014 Spring - R1-4 - #ccc_r14JBoss.org – SwitchYardコミュニティ開発者の日常 - JJUG CCC 2014 Spring - R1-4 - #ccc_r14
JBoss.org – SwitchYardコミュニティ開発者の日常 - JJUG CCC 2014 Spring - R1-4 - #ccc_r14
Tomohisa Igarashi
?
JetBrains IDEハンズオン
JetBrains IDEハンズオンJetBrains IDEハンズオン
JetBrains IDEハンズオン
Yusuke Yamamoto
?
複雑さに挑む!カンバンによるプロジェクト マネジメント
複雑さに挑む!カンバンによるプロジェクト マネジメント複雑さに挑む!カンバンによるプロジェクト マネジメント
複雑さに挑む!カンバンによるプロジェクト マネジメント
智治 長沢
?
フ?レセ?ン基礎講座 2016.11
フ?レセ?ン基礎講座 2016.11フ?レセ?ン基礎講座 2016.11
フ?レセ?ン基礎講座 2016.11
智治 長沢
?
Java in the Past, Java in the Future
Java in the Past, Java in the FutureJava in the Past, Java in the Future
Java in the Past, Java in the Future
Yuichi Sakuraba
?
自動テストの誤解とアンチパターン in 楽天 Tech Talk
自動テストの誤解とアンチパターン in 楽天 Tech Talk自動テストの誤解とアンチパターン in 楽天 Tech Talk
自動テストの誤解とアンチパターン in 楽天 Tech Talk
kyon mm
?
础苍诲谤辞颈诲端末の谤辞辞迟化について
础苍诲谤辞颈诲端末の谤辞辞迟化について础苍诲谤辞颈诲端末の谤辞辞迟化について
础苍诲谤辞颈诲端末の谤辞辞迟化について
Shuichi Takaya
?
これまでのJava これからのJava
これまでのJava これからのJavaこれまでのJava これからのJava
これまでのJava これからのJava
Yuichi Sakuraba
?
メンテナンス性の良い奥别产システムを构筑するために箩补惫补とフロントエント?て?やるへ?きこと
メンテナンス性の良い奥别产システムを构筑するために箩补惫补とフロントエント?て?やるへ?きことメンテナンス性の良い奥别产システムを构筑するために箩补惫补とフロントエント?て?やるへ?きこと
メンテナンス性の良い奥别产システムを构筑するために箩补惫补とフロントエント?て?やるへ?きこと
Mitsuru Ogawa
?
ついに始まるJava EE 7時代のアプリケーション開発
ついに始まるJava EE 7時代のアプリケーション開発ついに始まるJava EE 7時代のアプリケーション開発
ついに始まるJava EE 7時代のアプリケーション開発
Takakiyo Tanaka
?
アプリ開発?端末毎の解像度の違いを吸収する方法 Android Bazaar and Conference 2011 Summer
アプリ開発?端末毎の解像度の違いを吸収する方法 Android Bazaar and Conference 2011 Summer アプリ開発?端末毎の解像度の違いを吸収する方法 Android Bazaar and Conference 2011 Summer
アプリ開発?端末毎の解像度の違いを吸収する方法 Android Bazaar and Conference 2011 Summer
Kunimasa Noda
?
桐岛、搁耻产测やめるってよ
桐岛、搁耻产测やめるってよ桐岛、搁耻产测やめるってよ
桐岛、搁耻产测やめるってよ
Narihiro Nakamura
?

Similar to JavaOne2015報告会 Java EE アップデート #j1jp (20)

jjugccc2018 app review postmortem
jjugccc2018 app review postmortemjjugccc2018 app review postmortem
jjugccc2018 app review postmortem
tamtam180
?
Apache Torqueについて
Apache TorqueについてApache Torqueについて
Apache Torqueについて
tako pons
?
Java 7
Java 7Java 7
Java 7
Tetsuya Yoshida
?
明日から使える Java SE 7
明日から使える Java SE 7明日から使える Java SE 7
明日から使える Java SE 7
Yuichi Sakuraba
?
Ibm worklight デモ環境とサンプルコード
Ibm worklight デモ環境とサンプルコードIbm worklight デモ環境とサンプルコード
Ibm worklight デモ環境とサンプルコード
K Kimura
?
骋谤辞辞惫测で楽に厂蚕尝を実行してみよう
骋谤辞辞惫测で楽に厂蚕尝を実行してみよう骋谤辞辞惫测で楽に厂蚕尝を実行してみよう
骋谤辞辞惫测で楽に厂蚕尝を実行してみよう
Akira Shimosako
?
Beginning Java EE 6 勉強会(3) #bje_study
Beginning Java EE 6 勉強会(3) #bje_studyBeginning Java EE 6 勉強会(3) #bje_study
Beginning Java EE 6 勉強会(3) #bje_study
inatus
?
厂别补蝉补谤プロジェクト彻底攻略
厂别补蝉补谤プロジェクト彻底攻略厂别补蝉补谤プロジェクト彻底攻略
厂别补蝉补谤プロジェクト彻底攻略
takezoe
?
闯补惫补翱苍别2015报告またはこれからの闯补惫补
闯补惫补翱苍别2015报告またはこれからの闯补惫补闯补惫补翱苍别2015报告またはこれからの闯补惫补
闯补惫补翱苍别2015报告またはこれからの闯补惫补
なおき きしだ
?
SDLoader SeasarCon 2009 Whire
SDLoader SeasarCon 2009 WhireSDLoader SeasarCon 2009 Whire
SDLoader SeasarCon 2009 Whire
Akio Katayama
?
SAStruts Seminar In Tripodworks
SAStruts Seminar In TripodworksSAStruts Seminar In Tripodworks
SAStruts Seminar In Tripodworks
tripodworks
?
闯补惫补のバージョニング问题の话しよっか
闯补惫补のバージョニング问题の话しよっか闯补惫补のバージョニング问题の话しよっか
闯补惫补のバージョニング问题の话しよっか
Ryota Murohoshi
?
Springて?dao 20070413
Springて?dao 20070413Springて?dao 20070413
Springて?dao 20070413
Funato Takashi
?
Scala EE 7 Essentials
Scala EE 7 EssentialsScala EE 7 Essentials
Scala EE 7 Essentials
tnoda
?
SpringMVCとmixer2で作るWebアプリのキホン 2013-01-24 Spring勉強会 #jsug
SpringMVCとmixer2で作るWebアプリのキホン 2013-01-24 Spring勉強会 #jsugSpringMVCとmixer2で作るWebアプリのキホン 2013-01-24 Spring勉強会 #jsug
SpringMVCとmixer2で作るWebアプリのキホン 2013-01-24 Spring勉強会 #jsug
Y Watanabe
?
Cubby 2006-08-23
Cubby 2006-08-23Cubby 2006-08-23
Cubby 2006-08-23
Agata Toshikata
?
Apache CommonsのHttpClientに おけるSSLサーバ証明書検証不備 (CVE-2012-5783)
Apache CommonsのHttpClientに おけるSSLサーバ証明書検証不備 (CVE-2012-5783)Apache CommonsのHttpClientに おけるSSLサーバ証明書検証不備 (CVE-2012-5783)
Apache CommonsのHttpClientに おけるSSLサーバ証明書検証不備 (CVE-2012-5783)
JPCERT Coordination Center
?
JJUG 11月ナイトセミナー CDIをはじめよう
JJUG 11月ナイトセミナー CDIをはじめようJJUG 11月ナイトセミナー CDIをはじめよう
JJUG 11月ナイトセミナー CDIをはじめよう
Norito Agetsuma
?
jjugccc2018 app review postmortem
jjugccc2018 app review postmortemjjugccc2018 app review postmortem
jjugccc2018 app review postmortem
tamtam180
?
Apache Torqueについて
Apache TorqueについてApache Torqueについて
Apache Torqueについて
tako pons
?
明日から使える Java SE 7
明日から使える Java SE 7明日から使える Java SE 7
明日から使える Java SE 7
Yuichi Sakuraba
?
Ibm worklight デモ環境とサンプルコード
Ibm worklight デモ環境とサンプルコードIbm worklight デモ環境とサンプルコード
Ibm worklight デモ環境とサンプルコード
K Kimura
?
骋谤辞辞惫测で楽に厂蚕尝を実行してみよう
骋谤辞辞惫测で楽に厂蚕尝を実行してみよう骋谤辞辞惫测で楽に厂蚕尝を実行してみよう
骋谤辞辞惫测で楽に厂蚕尝を実行してみよう
Akira Shimosako
?
Beginning Java EE 6 勉強会(3) #bje_study
Beginning Java EE 6 勉強会(3) #bje_studyBeginning Java EE 6 勉強会(3) #bje_study
Beginning Java EE 6 勉強会(3) #bje_study
inatus
?
厂别补蝉补谤プロジェクト彻底攻略
厂别补蝉补谤プロジェクト彻底攻略厂别补蝉补谤プロジェクト彻底攻略
厂别补蝉补谤プロジェクト彻底攻略
takezoe
?
闯补惫补翱苍别2015报告またはこれからの闯补惫补
闯补惫补翱苍别2015报告またはこれからの闯补惫补闯补惫补翱苍别2015报告またはこれからの闯补惫补
闯补惫补翱苍别2015报告またはこれからの闯补惫补
なおき きしだ
?
SDLoader SeasarCon 2009 Whire
SDLoader SeasarCon 2009 WhireSDLoader SeasarCon 2009 Whire
SDLoader SeasarCon 2009 Whire
Akio Katayama
?
SAStruts Seminar In Tripodworks
SAStruts Seminar In TripodworksSAStruts Seminar In Tripodworks
SAStruts Seminar In Tripodworks
tripodworks
?
闯补惫补のバージョニング问题の话しよっか
闯补惫补のバージョニング问题の话しよっか闯补惫补のバージョニング问题の话しよっか
闯补惫补のバージョニング问题の话しよっか
Ryota Murohoshi
?
Scala EE 7 Essentials
Scala EE 7 EssentialsScala EE 7 Essentials
Scala EE 7 Essentials
tnoda
?
SpringMVCとmixer2で作るWebアプリのキホン 2013-01-24 Spring勉強会 #jsug
SpringMVCとmixer2で作るWebアプリのキホン 2013-01-24 Spring勉強会 #jsugSpringMVCとmixer2で作るWebアプリのキホン 2013-01-24 Spring勉強会 #jsug
SpringMVCとmixer2で作るWebアプリのキホン 2013-01-24 Spring勉強会 #jsug
Y Watanabe
?
Apache CommonsのHttpClientに おけるSSLサーバ証明書検証不備 (CVE-2012-5783)
Apache CommonsのHttpClientに おけるSSLサーバ証明書検証不備 (CVE-2012-5783)Apache CommonsのHttpClientに おけるSSLサーバ証明書検証不備 (CVE-2012-5783)
Apache CommonsのHttpClientに おけるSSLサーバ証明書検証不備 (CVE-2012-5783)
JPCERT Coordination Center
?
JJUG 11月ナイトセミナー CDIをはじめよう
JJUG 11月ナイトセミナー CDIをはじめようJJUG 11月ナイトセミナー CDIをはじめよう
JJUG 11月ナイトセミナー CDIをはじめよう
Norito Agetsuma
?

More from Norito Agetsuma (10)

蚕耻补谤办耻蝉入门
蚕耻补谤办耻蝉入门蚕耻补谤办耻蝉入门
蚕耻补谤办耻蝉入门
Norito Agetsuma
?
Java EEを補完する仕様 MicroProfile
Java EEを補完する仕様 MicroProfileJava EEを補完する仕様 MicroProfile
Java EEを補完する仕様 MicroProfile
Norito Agetsuma
?
Jbatch実践入門 #jdt2015
Jbatch実践入門 #jdt2015Jbatch実践入門 #jdt2015
Jbatch実践入門 #jdt2015
Norito Agetsuma
?
Tomcatの実装から学ふ?クラスロータ?リーク #渋谷Java
Tomcatの実装から学ふ?クラスロータ?リーク #渋谷JavaTomcatの実装から学ふ?クラスロータ?リーク #渋谷Java
Tomcatの実装から学ふ?クラスロータ?リーク #渋谷Java
Norito Agetsuma
?
Javaトラブルに備えよう #jjug_ccc #ccc_h2
Javaトラブルに備えよう #jjug_ccc #ccc_h2Javaトラブルに備えよう #jjug_ccc #ccc_h2
Javaトラブルに備えよう #jjug_ccc #ccc_h2
Norito Agetsuma
?
Unixカーネルの設計 7 プロセスの制御
Unixカーネルの設計 7 プロセスの制御Unixカーネルの設計 7 プロセスの制御
Unixカーネルの設計 7 プロセスの制御
Norito Agetsuma
?
AeroGear & Java EE 7 で簡単プッシュ
AeroGear & Java EE 7 で簡単プッシュAeroGear & Java EE 7 で簡単プッシュ
AeroGear & Java EE 7 で簡単プッシュ
Norito Agetsuma
?
プロになるためのJavaScript入門読書会 レジュメ
プロになるためのJavaScript入門読書会 レジュメプロになるためのJavaScript入門読書会 レジュメ
プロになるためのJavaScript入門読書会 レジュメ
Norito Agetsuma
?
SQLアンチパターン読書会 レジュメ
SQLアンチパターン読書会 レジュメSQLアンチパターン読書会 レジュメ
SQLアンチパターン読書会 レジュメ
Norito Agetsuma
?
JSR 352 “Batch Applications for the Java Platform”
JSR 352 “Batch Applications for the Java Platform”JSR 352 “Batch Applications for the Java Platform”
JSR 352 “Batch Applications for the Java Platform”
Norito Agetsuma
?
蚕耻补谤办耻蝉入门
蚕耻补谤办耻蝉入门蚕耻补谤办耻蝉入门
蚕耻补谤办耻蝉入门
Norito Agetsuma
?
Java EEを補完する仕様 MicroProfile
Java EEを補完する仕様 MicroProfileJava EEを補完する仕様 MicroProfile
Java EEを補完する仕様 MicroProfile
Norito Agetsuma
?
Jbatch実践入門 #jdt2015
Jbatch実践入門 #jdt2015Jbatch実践入門 #jdt2015
Jbatch実践入門 #jdt2015
Norito Agetsuma
?
Tomcatの実装から学ふ?クラスロータ?リーク #渋谷Java
Tomcatの実装から学ふ?クラスロータ?リーク #渋谷JavaTomcatの実装から学ふ?クラスロータ?リーク #渋谷Java
Tomcatの実装から学ふ?クラスロータ?リーク #渋谷Java
Norito Agetsuma
?
Javaトラブルに備えよう #jjug_ccc #ccc_h2
Javaトラブルに備えよう #jjug_ccc #ccc_h2Javaトラブルに備えよう #jjug_ccc #ccc_h2
Javaトラブルに備えよう #jjug_ccc #ccc_h2
Norito Agetsuma
?
Unixカーネルの設計 7 プロセスの制御
Unixカーネルの設計 7 プロセスの制御Unixカーネルの設計 7 プロセスの制御
Unixカーネルの設計 7 プロセスの制御
Norito Agetsuma
?
AeroGear & Java EE 7 で簡単プッシュ
AeroGear & Java EE 7 で簡単プッシュAeroGear & Java EE 7 で簡単プッシュ
AeroGear & Java EE 7 で簡単プッシュ
Norito Agetsuma
?
プロになるためのJavaScript入門読書会 レジュメ
プロになるためのJavaScript入門読書会 レジュメプロになるためのJavaScript入門読書会 レジュメ
プロになるためのJavaScript入門読書会 レジュメ
Norito Agetsuma
?
SQLアンチパターン読書会 レジュメ
SQLアンチパターン読書会 レジュメSQLアンチパターン読書会 レジュメ
SQLアンチパターン読書会 レジュメ
Norito Agetsuma
?
JSR 352 “Batch Applications for the Java Platform”
JSR 352 “Batch Applications for the Java Platform”JSR 352 “Batch Applications for the Java Platform”
JSR 352 “Batch Applications for the Java Platform”
Norito Agetsuma
?

JavaOne2015報告会 Java EE アップデート #j1jp

  • 1. JavaOne2015 - Java EE 2015/11/14 上妻 宜人 (あげつま のりと)
  • 2. ? APサーバサポート、Javaトラブルシューティング ? ブログ 見習いプログラミング日記 ? twitter: @n_agetsu 上妻 宜人 (あげつま のりと)
  • 3. ? Java EE 8 のアップデート ? Early Draft Review1: Servlet4.0, JMS2.1 ? ドラフト未リリース: JAX-RS2.1, JPA2.2 ? Java EE 周辺の話 ? WildFly Swarm 本日の内容
  • 4. Java EE 8 はまだ検討中。 この先の内容は、今後大きく変わる 可能性があります。
  • 5. Servlet4.0 現在のステータス: Early Draft Review JSR-368 https://jcp.org/en/jsr/detail?id=368
  • 6. Servlet 4.0 サーブレットコンテナもHTTP/2通信に対応 ? 2015年5月 RFC 7540で公開。SPDYが原型。 ? 多重化 / バイナリフレーム / ヘッダ圧縮 ? ヘッダの意味合い (GET/POST/200 OK など) は基本的に踏襲 client server client server client server 並行リクエストは、複数TCP接続が必要 ブラウザ実装によっては同時接続数『6』 1TCP接続で多重化 TCPコネクション_1 TCPコネクション_2..
  • 7. Servlet 4.0 HTTP/2 ストリームによる多重化 Connection : 1つのTCPコネクション Stream : 1つのリクエスト & レスポンスの組 Stream id=1 Stream id=1 .. N: http://chimera.labs.oreilly.com/books/1230000000545/ch12.html#HTTP2_STREAMS_MESSAGES_FRAMES Request Stream: 1 :method: GET ... Frame : HTTP2.0通信の最小単位 Stream: 1 :status:200 HEADERS frame Stream: 1 response data DATA frame Response
  • 8. Servlet 4.0 HTTP/2 ストリームによる多重化のServlet影響 ? APIのユーザ視点では影響はあまりない ? 1リクエスト => 1レスポンス の法則が崩れなければ、 doGet, doPostメソッドの現状の仕組みがそのまま使える ? HttpServletRequest/HttpServletResponse へのメソッド追加 ? int getStreamId() ? ストリームIDを知りたい機会は少ないと思う
  • 9. Servlet 4.0 HTTP/2 サーバプッシュ client server .html .js .png .css ? SSE/WebSocketとは用途が異なる ? 関連リソースをサーバプッシュ ? 例えばhtmlの要求がきたら ? 関連のjs, png, css もプッシュする ? 従来はインラインイメージを適用 ? 1リクエスト => 1レスポンスが崩れる ? 今までのHttpServletResponseは 1レスポンスが前提
  • 10. Servlet 4.0 HTTP/2 サーバプッシュのServlet影響 public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { PushBuilder builder = request.getPushBuilder(); builder.setPath(“/style.css”); builder.push(); res.setContentType(“text/html”); PrintWriter out = res.getPrintWriter(); out.println(“<html>”); out.println(“<head>”) out.println(“<link rel=”stylesheet” type=”text/css” href=“style.css”>”); … }
  • 11. Servlet4.0 まとめ ? HTTP/2 対応 – サーブレットコンテナがHTTP/2に対応 – ストリームID取得, サーバプッシュ向けAPIの追加 ? 本日は未紹介 – (検討中) Java9 Flow対応によるリクエスト処理
  • 14. JAX-RS2.1 非同期クライアントAPIの改善 ? 並列で依存関係のあるWebAPIを呼び出したい ? Jerseyには既に実装がある ? RxJava Observable, Java 8 CompletableFuture 対応 出張手配 サービス 新幹線予約 ホテル予約大阪1泊2日で! 手配完了 料金請求 1. 予約を並列実行 2. 予約が終わったら 請求サービスに投げる
  • 15. JAX-RS2.1 非同期クライアント: rx()によるCompletationState取得 // Aの問い合わせ (非同期) WebTarget targetA = Client.newClient().target(...); CompletionStage<User> a = target1.request().resolveTemplate(“id”, 1) .rx().get(User.class); // Bの問い合わせ (非同期) CompletionState<Product> b = targetB.request().resolveTemplate(“id”, 1) .rx().get(Product.class); // AとBの結果を組み合わせて、Cに問い合わせ (非同期) CompletionState<String> c = a.thenCombine(b, (user, product) -> targetC.request() .resolveTemplate(“user”,user) .resolveTemplate(“prod”,product).rx().get(...))); // 最終的な結果の取得 c.join(); a b c 最終的な結果
  • 16. JAX-RS2.1 非同期クライアント: rx()によるCompletationState取得 // Aの問い合わせ (非同期) WebTarget targetA = Client.newClient().target(...); CompletionStage<User> a = target1.request().resolveTemplate(“id”, 1) .rx().get(User.class); // Bの問い合わせ (非同期) CompletionState<Product> b = targetB.request().resolveTemplate(“id”, 1) .rx().get(Product.class); // AとBの結果を組み合わせて、Cに問い合わせ (非同期) CompletionState<String> c = a.thenCombine(b, (user, product) -> targetC.request() .resolveTemplate(“user”,user) .resolveTemplate(“prod”,product).rx().get(...))); // 最終的な結果の取得 c.join(); a b c 最終的な結果
  • 17. JAX-RS2.1 非同期クライアント: アノテーションによる依存性制御 class DeclarativeRxHandler { @FinalResult public String getC( @PartialResult(“A”) String a, @PartialResult(“B”) String b) { return a; } @PartialResult(“A”) public CompletableFuture<String> getA() {...} @PartialResult(“B”) public CompletableFuture<String> getB() {...} } A B C 最終的な結果
  • 18. JAX-RS2.1 ノンブロッキング I/O - 背景 ? 不安定/遅いネットワークからファイルアップロード ? CPUは別スレッドに割当てられても、メモリは1MB消費し続ける @Path(“/upload”) public class FileUploadResource { @POST @Consumes(MediaType.MULTIPART_FORM_DATA) public void upload(@FormDataParam(“file”) InputStream input, ...) { byte[] buf = new byte[1024]; int readed; try { while ((readed = input.read(buf)) != -1) { // write file ... } catch (IOException e) {...} } データが来るまでブロック (64bitJVM)
  • 19. @POST @Consumes(MediaType.APPLICATION_OCTET_STREAM) public void upload(@QueryParam(“path”) String path, @Context request, @Suspend AsyncResponse response) { FileOutputStream out = new FileOutputStream(tmpdir); byte[] buf = new byte[1024]; request.entity(input -> { try { if (input.isFinished()) { // データ読み込み完了 out.close(); response.resume(“Upload Completed”); } else { final int n = input.read(buffer); out.write(buffer, 0, n); } } catch (IOException e) {...} } } JAX-RS2.1 ノンブロッキング I/O - JavaOneで紹介されていたアイディア
  • 20. @POST @Consumes(MediaType.APPLICATION_OCTET_STREAM) public void upload(@QueryParam(“path”) String path, @Context request, @Suspend AsyncResponse response) { FileOutputStream out = new FileOutputStream(tmpdir); byte[] buf = new byte[1024]; request.entity(input -> { try { if (input.isFinished()) { // データ読み込み完了 out.close(); response.resume(“Upload Completed”); } else { final int n = input.read(buffer); out.write(buffer, 0, n); } } catch (IOException e) {...} } } ブロックしない 読込可能データの発生毎に 繰り返しコールバックされる? JAX-RS2.1 ノンブロッキング I/O - JavaOneで紹介されていたアイディア
  • 21. JAX-RS2.1 ノンブロッキング I/O - まだまだ検討中 ? 本当に必要? 色々と議論がある ? ユーザレベルでNIOを意識しなくても良いのでは など? – MessageBodyReader, MessageBodyWriterの実装内に隠蔽 (JAX-RSランタイムの中の json read/write 時に利用) – Servlet コンテナのコネクタ実装としてのNIOで十分では?
  • 22. JMS2.1 現在のステータス: Early Draft Review JSR-368 https://jcp.org/en/jsr/detail?id=368
  • 23. JMS2.0 Java EE 7 - JMS2.0のMDBを振り返る @MessageDriven( activationConfig = { @ActivationConfigProperty( propertyName="destinationType", propertyValue="javax.jms.Queue"), @ActivationConfigProperty( propertyName="destination", propertyValue="java:/queue/myQueue") }) public class SampleMDB implements MessageListener { @Override public void onMessage(Message message) { try { TextMessage textMessage = (TextMessage) message; System.out.println(textMessage.getText()); } catch (JMSException e) { e.printStackTrace(); } } }
  • 24. @MessageDriven( activationConfig = { @ActivationConfigProperty( propertyName="destinationType", propertyValue="javax.jms.Queue"), @ActivationConfigProperty( propertyName="destination", propertyValue="java:/queue/myQueue") }) public class SampleMDB implements MessageListener { @Override public void onMessage(Message message) { try { TextMessage textMessage = (TextMessage) message; System.out.println(textMessage.getText()); } catch (JMSException e) { e.printStackTrace(); } } } JMS2.0 Java EE 7 - JMS2.0のMDBを振り返る 何のリスナ (Queue or Topic)を 文字列で指定する必要がある
  • 25. @MessageDriven( activationConfig = { @ActivationConfigProperty( propertyName="destinationType", propertyValue="javax.jms.Queue"), @ActivationConfigProperty( propertyName="destination", propertyValue="java:/queue/myQueue") }) public class SampleMDB implements MessageListener { @Override public void onMessage(Message message) { try { TextMessage textMessage = (TextMessage) message; System.out.println(textMessage.getText()); } catch (JMSException e) { e.printStackTrace(); } } } JMS2.0 Java EE 7 - JMS2.0のMDBを振り返る インタフェースの実装、 Messageのキャストが必要
  • 26. JMS2.1 JMS2.1の主な機能追加 ? MDBからMessageListenerの実装を不要とする ? タイプセーフ ? キャストの不要化 ? 1クラスで複数コールバックメソッドを実装
  • 27. JMS2.1 JMS2.1ドラフト: @JMSQueueListener @MessageDriven public class SampleMDB { @JMSQueueListener (destionationLookup = “java:/queue/myQueue”) public void printMessage(TextMessage text) { try { System.out.println(text.getText()); } catch (JMSException e) { e.printStackTrace(); } } }
  • 28. @MessageDriven public class SampleMDB { @JMSQueueListener (destionationLookup = “java:/queue/myQueue”) public void printQueue1Msg(TextMessage text) { …. } @JMSQueueListener (destionationLookup = “java:/queue/myQueue2”) public void printQueue2Msg(TextMessage text) { …. } } JMS2.1 JMS2.1ドラフト: 1クラスに複数コールバック定義
  • 29. ? MDB停止中のトピック書き込みは検知できない ? JMS2.0では @ActivationConfigProperty( propertyName="subscriptionDurability“, propertyValue="NonDurable") @MessageDriven public class SampleMDB { @JMSNonDurableTopicListener(destinationLookup=“java:/topic/myTopic”) public void printMessage(TextMessage text) { …. } } JMS2.1 JMS2.1ドラフト: トピック向け非永続化サブスクライバ
  • 30. @MessageDriven public class SampleMDB { @JMSDurableTopicListener ( destinationLookup=“java:/topic/myTopic”, cliendId=“someid”, subscriptionName=“somename”) public void printMessage(TextMessage text) { …. } } ? 全永続化サブスクライバの受信までメッセージ削除されない ? JMS2.0では @ActivationConfigProperty( propertyName="subscriptionDurability“, propertyValue="Durable") @ActivationConfigProperty(propertyName=“clientid”, propertyValue=“someid”) @ActivationConfigProperty(propertyName="subscriptionName", propertyValue=“somename") JMS2.1 JMS2.1ドラフト: トピック向け永続化サブスクライバ
  • 31. JMS2.1 まとめ ? 今のところはMDBのシンプル化が主な内容 ? CDI管理Beanによるメッセージ受信は検討中 (Early Draft Review1には含まれていない)
  • 33. JPA2.2 検討中の主な項目 ? Java SE 8対応 ? Date and Time API への対応 ? @NamedQueryのRepeatableアノテーション対応 ? スクロール機能の標準化 ? 例: org.hibernate.ScrollableResults
  • 34. JPA2.2 スクロール機能の標準化 - getStreamResult() Query q = em.createQuery(“select e from Employee e”); // OutOfMemoryError ?? List<Employee> employees = q.getResultList(); // 少ないJavaヒープメモリで動作 int total = q.getStreamResult().collect( Collectors.summingInt(Employee::getSalary));
  • 35. Java EE 8 スケジュール Java EE 8 & GlassFish5リリースは2017上半期予定 ? 2015 Q4 Early Draft ? 2016 Q1 Public Review ? 2016 Q4 Proposed Final Draft ? 2017年上半期 Final 予定
  • 36. Java EE 周辺の話 Spring Boot風 Java EE “WildFly Swarm”
  • 37. WildFly Swarm Java EE で java -jar myapp.jar 起動 ? Spring Boot風のJava EE ? 2015/5 に1.0.0.Alpha1リリース – まだ実験的: (最新) 2015/10/25 1.0.0.Alpha5 ? APサーバの事前インストールが不要になる ? java -jar myapp.jar で手軽に起動
  • 38. なぜ WildFly Swarm Spring Bootとは少し背景が違う ? Spring Bootの背景 (集約) ? 機能が豊富で、pom.xml の組み合わせ方法が難しい => 推奨組み合わせを作って、簡単に使えるようにした ? WildFly Swarmの背景 (分解) ? Java EE をフルセットで使う人は少ない => アプリで利用する機能だけ一式jarにまとめて軽量化
  • 40. Hello World! 2. uber jar を作成する wildfly-swarm-plugin <plugin> <groupId>org.wildfly.swarm</groupId> <artifactId>wildfly-swarm-plugin</artifactId> <executions> <execution> <goals> <goal>package</goal> </goals> </execution> </executions> </plugin> ? Mavenプラグインによりmvn packageで実行可能jarを生成
  • 41. Hello World! 3. 通常と変わりなくコードを書く @Path("/") public class EmployeeResource { @Inject EntityManager em; @GET @Produces("application/json") public List<Employee> get() { return em.createNamedQuery("Employee.findAll", Employee.class) .getResultList(); } }
  • 42. Hello World! 4. アプリケーションの起動 ? デフォルト設定利用時はmainメソッド不要 ? mvn package; java -jar target/xxx-swarm.jar – 必要なモジュールのみjarにまとめられる – JAX-RS+CDI+JPAアプリで94MB(WildFly全体約127M)。まだ大きい。 ? サンプルコードが豊富 – https://github.com/wildfly-swarm/wildfly-swarm-examples
  • 43. Hello World! カスタム設定はmainメソッドに実装 public static void main(String[] args) throws Exception { Container container = new Container(); / /H2向けJDBCドライバの登録と、データソースの生成 container.fraction(new DatasourcesFraction() .jdbcDriver("h2", (d) -> { d.driverDatasourceClassName("org.h2.Driver"); d.xaDatasourceClass("org.h2.jdbcx.JdbcDataSource"); d.driverModuleName("com.h2database.h2"); }) .dataSource("MyDS", (ds) -> { ds.driverName("h2"); ds.connectionUrl("jdbc:h2:mem:test;DB_CLOSE_DELAY=-1;... "); ds.userName("sa"); ds.password("sa"); }) ); ....
  • 44. Hello World! カスタム設定はmainメソッドに実装 public static void main(String[] args) throws Exception { Container container = new Container(); / /H2向けJDBCドライバの登録と、データソースの生成 container.fraction(new DatasourcesFraction() .jdbcDriver("h2", (d) -> { d.driverDatasourceClassName("org.h2.Driver"); d.xaDatasourceClass("org.h2.jdbcx.JdbcDataSource"); d.driverModuleName("com.h2database.h2"); }) .dataSource("MyDS", (ds) -> { ds.driverName("h2"); ds.connectionUrl("jdbc:h2:mem:test;DB_CLOSE_DELAY=-1;... "); ds.userName("sa"); ds.password("sa"); }) ); ....
  • 45. デフォルト設定を調べるには Fraction: WildFlyのサブシステムのようなもの ? Swarmのソースより、xxxFraction.java クラスの中を確認 – デフォルト値はWildFlyの設定値 (standalone.xml) とほぼ同じ public class JPAFraction extends JPA<JPAFraction> implements Fraction { ... @Override public void initialize(Container.InitContext initContext) { if (!inhibitDefaultDatasource) { final DatasourcesFraction datasources = new DatasourcesFraction() .jdbcDriver(new JDBCDriver("h2") .driverName("h2") .driverDatasourceClassName("org.h2.driver") .....
  • 46. 主なFraction Java EE 以外からも機能を取り込み ? Java EE : JAX-RS, JSF, JPA, CDI, Transaction, JMS ... ? logstash ? サーバログをlogstashサーバ(TCP)に送る機能 ? java -Dswarm.logstash.hostname -Dswarm.logstash.port ? Netflix OSS(Ribbon, Hystrix), Jolokia (JMX REST-API) ? 一覧はSwarmユーザガイド参照 https://wildfly-swarm.gitbooks.io/wildfly-swarm-users-guide/
  • 47. SwarmによるJava EEの分解を見て Java EE にもマイナーアップデートが欲しい ? Spring Frameworkは着実に進化 – 4.0 (2013/12) => 4.1 (2014/9) => 4.2 (2015/7) ? Java EE は標準化に時間が掛かる – Java EE 7 (2013年) => Java EE 8 (2017年予定) – 実装サーバは仕様がFinalになってから1年ぐらい後 – 例えば JCache + MVC + Java 8 RepetableAnnotation 対応で Java EE 7.1 など
  • 49. まとめ ? Java EE 8 は2017年リリース予定 – HTTP/2対応、非同期、APIのシンプル化 – 徐々にではあるが、検討が進み始めている ? Java EE 周辺 – WildFly Swarmの進化に期待