SlideShare une entreprise Scribd logo
1  sur  49
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の進化に期待

Contenu connexe

Tendances

Nashorn in the future (Japanese)
Nashorn in the future (Japanese)Nashorn in the future (Japanese)
Nashorn in the future (Japanese)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
 
はじめてのJPA
はじめてのJPAはじめてのJPA
はじめてのJPAkawaba
 
WildFly Swarmではじめる「パーツとしてのJavaEE」
WildFly Swarmではじめる「パーツとしてのJavaEE」WildFly Swarmではじめる「パーツとしてのJavaEE」
WildFly Swarmではじめる「パーツとしてのJavaEE」Hiroaki NAKADA
 
Webアプリに低レイテンシ・高可用性を求めるのは間違っているのだろうか
Webアプリに低レイテンシ・高可用性を求めるのは間違っているのだろうかWebアプリに低レイテンシ・高可用性を求めるのは間違っているのだろうか
Webアプリに低レイテンシ・高可用性を求めるのは間違っているのだろうか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 AppsYoshimasa 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
 
はまる!JPA(初学者向けライト版)
はまる!JPA(初学者向けライト版)はまる!JPA(初学者向けライト版)
はまる!JPA(初学者向けライト版)Masatoshi Tada
 
(Tech DeepDive #1) Java Flight Recorder を活用した問題解決
(Tech DeepDive #1) Java Flight Recorder を活用した問題解決(Tech DeepDive #1) Java Flight Recorder を活用した問題解決
(Tech DeepDive #1) Java Flight Recorder を活用した問題解決オラクルエンジニア通信
 
Java9新機能概要
Java9新機能概要Java9新機能概要
Java9新機能概要HonMarkHunt
 
Javaにおけるネイティブコード連携の各種手法の紹介
Javaにおけるネイティブコード連携の各種手法の紹介Javaにおけるネイティブコード連携の各種手法の紹介
Javaにおけるネイティブコード連携の各種手法の紹介khisano
 
Prepare for Java 9 #jjug
Prepare for Java 9 #jjugPrepare for Java 9 #jjug
Prepare for Java 9 #jjugYuji Kubota
 
Java仮想マシンの実装技術
Java仮想マシンの実装技術Java仮想マシンの実装技術
Java仮想マシンの実装技術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
 

Tendances (20)

Nashorn in the future (Japanese)
Nashorn in the future (Japanese)Nashorn in the future (Japanese)
Nashorn in the future (Japanese)
 
Java Batch 仕様 (Public Review時点)
Java Batch 仕様 (Public Review時点) Java Batch 仕様 (Public Review時点)
Java Batch 仕様 (Public Review時点)
 
Javaアプリケーションサーバ 構築・運用の勘所
Javaアプリケーションサーバ 構築・運用の勘所Javaアプリケーションサーバ 構築・運用の勘所
Javaアプリケーションサーバ 構築・運用の勘所
 
はじめてのJPA
はじめてのJPAはじめてのJPA
はじめてのJPA
 
WildFly Swarmではじめる「パーツとしてのJavaEE」
WildFly Swarmではじめる「パーツとしてのJavaEE」WildFly Swarmではじめる「パーツとしてのJavaEE」
WildFly Swarmではじめる「パーツとしてのJavaEE」
 
Webアプリに低レイテンシ・高可用性を求めるのは間違っているのだろうか
Webアプリに低レイテンシ・高可用性を求めるのは間違っているのだろうかWebアプリに低レイテンシ・高可用性を求めるのは間違っているのだろうか
Webアプリに低レイテンシ・高可用性を求めるのは間違っているのだろうか
 
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
 
Java EE 7技術アップデート & 逆引き JSF 2.2
Java EE 7技術アップデート & 逆引き JSF 2.2 Java EE 7技術アップデート & 逆引き JSF 2.2
Java EE 7技術アップデート & 逆引き JSF 2.2
 
Java EE 再入門
Java EE 再入門Java EE 再入門
Java EE 再入門
 
はまる!JPA(初学者向けライト版)
はまる!JPA(初学者向けライト版)はまる!JPA(初学者向けライト版)
はまる!JPA(初学者向けライト版)
 
(Tech DeepDive #1) Java Flight Recorder を活用した問題解決
(Tech DeepDive #1) Java Flight Recorder を活用した問題解決(Tech DeepDive #1) Java Flight Recorder を活用した問題解決
(Tech DeepDive #1) Java Flight Recorder を活用した問題解決
 
Java9新機能概要
Java9新機能概要Java9新機能概要
Java9新機能概要
 
Javaにおけるネイティブコード連携の各種手法の紹介
Javaにおけるネイティブコード連携の各種手法の紹介Javaにおけるネイティブコード連携の各種手法の紹介
Javaにおけるネイティブコード連携の各種手法の紹介
 
Prepare for Java 9 #jjug
Prepare for Java 9 #jjugPrepare for Java 9 #jjug
Prepare for Java 9 #jjug
 
Java仮想マシンの実装技術
Java仮想マシンの実装技術Java仮想マシンの実装技術
Java仮想マシンの実装技術
 
Java SE 再入門
Java SE 再入門Java SE 再入門
Java SE 再入門
 
Jsf アプリ作ったった
Jsf アプリ作ったったJsf アプリ作ったった
Jsf アプリ作ったった
 
Hello Java
Hello JavaHello Java
Hello Java
 
これからのJDK/JVM 何を選ぶ?どう選ぶ?
これからのJDK/JVM 何を選ぶ?どう選ぶ?これからのJDK/JVM 何を選ぶ?どう選ぶ?
これからのJDK/JVM 何を選ぶ?どう選ぶ?
 
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]
 

En vedette

Java Küche 2016 LT 在室状況自動通知ボット #JavaKueche
Java Küche 2016 LT 在室状況自動通知ボット #JavaKuecheJava Küche 2016 LT 在室状況自動通知ボット #JavaKueche
Java Küche 2016 LT 在室状況自動通知ボット #JavaKuecheYusuke 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 SystemsHirofumi 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 7Hirofumi 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_r14Tomohisa 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 FutureYuichi Sakuraba
 
自動テストの誤解とアンチパターン in 楽天 Tech Talk
自動テストの誤解とアンチパターン in 楽天 Tech Talk自動テストの誤解とアンチパターン in 楽天 Tech Talk
自動テストの誤解とアンチパターン in 楽天 Tech Talkkyon mm
 
Keycloak で SSO #渋谷java
Keycloak で SSO #渋谷javaKeycloak で SSO #渋谷java
Keycloak で SSO #渋谷javaYoshimasa Tanabe
 
Android端末のroot化について
Android端末のroot化についてAndroid端末のroot化について
Android端末のroot化についてShuichi Takaya
 
これまでのJava これからのJava
これまでのJava これからのJavaこれまでのJava これからのJava
これまでのJava これからのJavaYuichi Sakuraba
 
メンテナンス性の良いWebシステムを構築するためにjavaとフロントエンドでやるべきこと
メンテナンス性の良いWebシステムを構築するためにjavaとフロントエンドでやるべきことメンテナンス性の良いWebシステムを構築するためにjavaとフロントエンドでやるべきこと
メンテナンス性の良いWebシステムを構築するためにjavaとフロントエンドでやるべきこと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
 
桐島、Rubyやめるってよ
桐島、Rubyやめるってよ桐島、Rubyやめるってよ
桐島、RubyやめるってよNarihiro Nakamura
 

En vedette (18)

Java Küche 2016 LT 在室状況自動通知ボット #JavaKueche
Java Küche 2016 LT 在室状況自動通知ボット #JavaKuecheJava Küche 2016 LT 在室状況自動通知ボット #JavaKueche
Java Küche 2016 LT 在室状況自動通知ボット #JavaKueche
 
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
 
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
 
JavaOne 2016 - Photo Edition -
JavaOne 2016 - Photo Edition - JavaOne 2016 - Photo Edition -
JavaOne 2016 - Photo Edition -
 
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
 
JetBrains IDEハンズオン
JetBrains IDEハンズオンJetBrains IDEハンズオン
JetBrains IDEハンズオン
 
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
 
複雑さに挑む!カンバンによるプロジェクト マネジメント
複雑さに挑む!カンバンによるプロジェクト マネジメント複雑さに挑む!カンバンによるプロジェクト マネジメント
複雑さに挑む!カンバンによるプロジェクト マネジメント
 
プレゼン基礎講座 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
 
自動テストの誤解とアンチパターン in 楽天 Tech Talk
自動テストの誤解とアンチパターン in 楽天 Tech Talk自動テストの誤解とアンチパターン in 楽天 Tech Talk
自動テストの誤解とアンチパターン in 楽天 Tech Talk
 
Keycloak で SSO #渋谷java
Keycloak で SSO #渋谷javaKeycloak で SSO #渋谷java
Keycloak で SSO #渋谷java
 
Android端末のroot化について
Android端末のroot化についてAndroid端末のroot化について
Android端末のroot化について
 
これまでのJava これからのJava
これまでのJava これからのJavaこれまでのJava これからのJava
これまでのJava これからのJava
 
メンテナンス性の良いWebシステムを構築するためにjavaとフロントエンドでやるべきこと
メンテナンス性の良いWebシステムを構築するためにjavaとフロントエンドでやるべきことメンテナンス性の良いWebシステムを構築するためにjavaとフロントエンドでやるべきこと
メンテナンス性の良いWebシステムを構築するためにjavaとフロントエンドでやるべきこと
 
ついに始まるJava EE 7時代のアプリケーション開発
ついに始まるJava EE 7時代のアプリケーション開発ついに始まるJava EE 7時代のアプリケーション開発
ついに始まるJava EE 7時代のアプリケーション開発
 
アプリ開発・端末毎の解像度の違いを吸収する方法 Android Bazaar and Conference 2011 Summer
アプリ開発・端末毎の解像度の違いを吸収する方法 Android Bazaar and Conference 2011 Summer アプリ開発・端末毎の解像度の違いを吸収する方法 Android Bazaar and Conference 2011 Summer
アプリ開発・端末毎の解像度の違いを吸収する方法 Android Bazaar and Conference 2011 Summer
 
桐島、Rubyやめるってよ
桐島、Rubyやめるってよ桐島、Rubyやめるってよ
桐島、Rubyやめるってよ
 

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

jjugccc2018 app review postmortem
jjugccc2018 app review postmortemjjugccc2018 app review postmortem
jjugccc2018 app review postmortemtamtam180
 
Apache Torqueについて
Apache TorqueについてApache Torqueについて
Apache Torqueについてtako pons
 
明日から使える Java SE 7
明日から使える Java SE 7明日から使える Java SE 7
明日から使える Java SE 7Yuichi Sakuraba
 
Ibm worklight デモ環境とサンプルコード
Ibm worklight デモ環境とサンプルコードIbm worklight デモ環境とサンプルコード
Ibm worklight デモ環境とサンプルコードK Kimura
 
Groovyで楽にSQLを実行してみよう
Groovyで楽にSQLを実行してみようGroovyで楽にSQLを実行してみよう
Groovyで楽にSQLを実行してみよう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_studyinatus
 
Seasarプロジェクト徹底攻略
Seasarプロジェクト徹底攻略Seasarプロジェクト徹底攻略
Seasarプロジェクト徹底攻略takezoe
 
JavaOne2015報告またはこれからのJava
JavaOne2015報告またはこれからのJavaJavaOne2015報告またはこれからのJava
JavaOne2015報告またはこれからのJavaなおき きしだ
 
SDLoader SeasarCon 2009 Whire
SDLoader SeasarCon 2009 WhireSDLoader SeasarCon 2009 Whire
SDLoader SeasarCon 2009 WhireAkio Katayama
 
SAStruts Seminar In Tripodworks
SAStruts Seminar In TripodworksSAStruts Seminar In Tripodworks
SAStruts Seminar In Tripodworkstripodworks
 
Javaのバージョニング問題の話しよっか
Javaのバージョニング問題の話しよっかJavaのバージョニング問題の話しよっか
Javaのバージョニング問題の話しよっかRyota Murohoshi
 
Springでdao 20070413
Springでdao 20070413Springでdao 20070413
Springでdao 20070413Funato Takashi
 
Scala EE 7 Essentials
Scala EE 7 EssentialsScala EE 7 Essentials
Scala EE 7 Essentialstnoda
 
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勉強会 #jsugY 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
 

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

jjugccc2018 app review postmortem
jjugccc2018 app review postmortemjjugccc2018 app review postmortem
jjugccc2018 app review postmortem
 
Apache Torqueについて
Apache TorqueについてApache Torqueについて
Apache Torqueについて
 
Java 7
Java 7Java 7
Java 7
 
明日から使える Java SE 7
明日から使える Java SE 7明日から使える Java SE 7
明日から使える Java SE 7
 
Ibm worklight デモ環境とサンプルコード
Ibm worklight デモ環境とサンプルコードIbm worklight デモ環境とサンプルコード
Ibm worklight デモ環境とサンプルコード
 
Groovyで楽にSQLを実行してみよう
Groovyで楽にSQLを実行してみようGroovyで楽にSQLを実行してみよう
Groovyで楽にSQLを実行してみよう
 
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
 
Seasarプロジェクト徹底攻略
Seasarプロジェクト徹底攻略Seasarプロジェクト徹底攻略
Seasarプロジェクト徹底攻略
 
Spring AMQP × RabbitMQ
Spring AMQP × RabbitMQSpring AMQP × RabbitMQ
Spring AMQP × RabbitMQ
 
JavaOne2015報告またはこれからのJava
JavaOne2015報告またはこれからのJavaJavaOne2015報告またはこれからのJava
JavaOne2015報告またはこれからのJava
 
Ptt391
Ptt391Ptt391
Ptt391
 
SDLoader SeasarCon 2009 Whire
SDLoader SeasarCon 2009 WhireSDLoader SeasarCon 2009 Whire
SDLoader SeasarCon 2009 Whire
 
SAStruts Seminar In Tripodworks
SAStruts Seminar In TripodworksSAStruts Seminar In Tripodworks
SAStruts Seminar In Tripodworks
 
Javaのバージョニング問題の話しよっか
Javaのバージョニング問題の話しよっかJavaのバージョニング問題の話しよっか
Javaのバージョニング問題の話しよっか
 
Springでdao 20070413
Springでdao 20070413Springでdao 20070413
Springでdao 20070413
 
Scala EE 7 Essentials
Scala EE 7 EssentialsScala EE 7 Essentials
Scala EE 7 Essentials
 
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
 
Cubby 2006-08-23
Cubby 2006-08-23Cubby 2006-08-23
Cubby 2006-08-23
 
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)
 
JJUG 11月ナイトセミナー CDIをはじめよう
JJUG 11月ナイトセミナー CDIをはじめようJJUG 11月ナイトセミナー CDIをはじめよう
JJUG 11月ナイトセミナー CDIをはじめよう
 

Plus de Norito Agetsuma

Java EEを補完する仕様 MicroProfile
Java EEを補完する仕様 MicroProfileJava EEを補完する仕様 MicroProfile
Java EEを補完する仕様 MicroProfileNorito Agetsuma
 
Jbatch実践入門 #jdt2015
Jbatch実践入門 #jdt2015Jbatch実践入門 #jdt2015
Jbatch実践入門 #jdt2015Norito Agetsuma
 
Tomcatの実装から学ぶクラスローダリーク #渋谷Java
Tomcatの実装から学ぶクラスローダリーク #渋谷JavaTomcatの実装から学ぶクラスローダリーク #渋谷Java
Tomcatの実装から学ぶクラスローダリーク #渋谷JavaNorito Agetsuma
 
Javaトラブルに備えよう #jjug_ccc #ccc_h2
Javaトラブルに備えよう #jjug_ccc #ccc_h2Javaトラブルに備えよう #jjug_ccc #ccc_h2
Javaトラブルに備えよう #jjug_ccc #ccc_h2Norito 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
 

Plus de Norito Agetsuma (10)

Quarkus入門
Quarkus入門Quarkus入門
Quarkus入門
 
Java EEを補完する仕様 MicroProfile
Java EEを補完する仕様 MicroProfileJava EEを補完する仕様 MicroProfile
Java EEを補完する仕様 MicroProfile
 
Jbatch実践入門 #jdt2015
Jbatch実践入門 #jdt2015Jbatch実践入門 #jdt2015
Jbatch実践入門 #jdt2015
 
Tomcatの実装から学ぶクラスローダリーク #渋谷Java
Tomcatの実装から学ぶクラスローダリーク #渋谷JavaTomcatの実装から学ぶクラスローダリーク #渋谷Java
Tomcatの実装から学ぶクラスローダリーク #渋谷Java
 
Javaトラブルに備えよう #jjug_ccc #ccc_h2
Javaトラブルに備えよう #jjug_ccc #ccc_h2Javaトラブルに備えよう #jjug_ccc #ccc_h2
Javaトラブルに備えよう #jjug_ccc #ccc_h2
 
Unixカーネルの設計 7 プロセスの制御
Unixカーネルの設計 7 プロセスの制御Unixカーネルの設計 7 プロセスの制御
Unixカーネルの設計 7 プロセスの制御
 
AeroGear & Java EE 7 で簡単プッシュ
AeroGear & Java EE 7 で簡単プッシュAeroGear & Java EE 7 で簡単プッシュ
AeroGear & Java EE 7 で簡単プッシュ
 
プロになるためのJavaScript入門読書会 レジュメ
プロになるためのJavaScript入門読書会 レジュメプロになるためのJavaScript入門読書会 レジュメ
プロになるためのJavaScript入門読書会 レジュメ
 
SQLアンチパターン読書会 レジュメ
SQLアンチパターン読書会 レジュメSQLアンチパターン読書会 レジュメ
SQLアンチパターン読書会 レジュメ
 
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”
 

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の進化に期待