祝 Java EE 7 ローンチの日本における反応
日本時間の深夜から午後に掛けて、世界に渡る Java EE 7 ローンチ・イベントがおかげさまで無事終了致しました。日本から深夜、もしくは午後にご参加頂いたエンジニアもいらっしゃいますが、本イベントにご参加頂いた皆様には、Java EE 7 の3つテーマ(HTML 5 対応、開発生産性の向上、エンタープライズ・ニーズへの対応)をご理解頂けたのではないかと思います。
また主要な統合開発環境(Eclipse, NetBeans, Intellij)も Java EE 7 へ対応する事で、今後日本におけるエンタープライズ開発の標準も Java EE 7 へ移行していく物と思われます。今回リリースされた Java EE 7 には様々なテクノロジーが含まれますが、Java EE 7 に含まれる各種機能を試された方は、是非その試された内容をブログや Wiki 等で記載して頂ければ嬉しく思います。

Java EE 7 は EE 6 に対して開発生産性を向上したバージョンであるため、本来であれば Java EE 7 を直接試していただきたいのですが、仮に Java EE にはじめて触れられる方で Java EE の全体像が理解できない方、もしくは英語が大の苦手な方は、既存の Java EE 6 の日本語書籍(Amazon : Beginning Java EE 6 GlassFish 3で始めるエンタープライズJava (Programmer’s SELECTION) [大型本]) をご参照頂き全体像をご理解頂いた上で、Java EE 6 と EE 7 の差分を抑えて頂く事も可能ですので、いずれかのやりやすい方法で Java EE 7 に触れていただければ幸いです。
最後に、Java EE 7 のローンチに関連して各種メディア、ブログ等に記載された内容を下記にご紹介します。今まで Java EE に実際に触れて来られた方も、この新しい Java EE 7 に期待している内容などが記載されていますので、是非下記の記事もご参照頂ければ幸いです。
(※ 私もブログ書いたよという方がいらっしゃいましたら是非ご連絡ください、下記に追加させて頂きます。)
オンラインメディア
- Publickey:Java EE 7対応のアプリケーションサーバ「GlassFish 4」オープンソース版が公開
- マイナビ ニュース:Oracle、Java EE 7を提供開始
- クラウド Watch : 米OracleがJava EE 7をリリース、HTML5対応アプリの構築を支援する新機能などを追加
- SourceForge.JP:「Java EE 7」が正式発表、米Oracleから初の登場
- @IT : HTML5のサポート強化や開発者の生産性を向上:Oracle、「Java EE 7」を提供開始
個人ブログ
- 武者返し.com:祝! Java EE 7リリース
- きしだのはてな:WebSocketをネタにJava EE 7正式版を試してみる
- しんさんの出張所 はてな編:JavaEE 7 登場
- Challenge Java EE !:NetBeans7.3.1でJava EE7とGlassFish4を少しのぞいてみました チラ| |д・)
- Programming Studio : GlassFish 4.0 正式リリース (GlassFish ユーザ・グループ・ジャパン副会長)
- yoshio3.com:Java EE 7 ローンチ (US 時間: 06/12 午前9時)
Java EE 7 対応関連書籍
Java EE 7 ローンチ (US 時間: 06/12 午前9時)
US 時間で 2013 年 6 月 12 日 午前 9 時より Java EE 7 のローンチ・イベントが開始します (日本では 2 回目のローンチ・イベントで 6 月 13 日 午後 1 時から参加頂けます)。Java EE 7 は、 2009 年にリリースされた Java EE 6 をベースに、4 つの新機能 (WebSocket, JSON, Batch, Concurrency Utilities for EE) と、既存の機能に対する大幅な更新 (JSF 2.2, JAX-RS, EL 3.0, JMS 2.0)を加えた、最新のエンタープライズ向け Java 標準技術です。

Java EE 7 に含まれる各種技術に触れたい場合、Java EE 7 の参照実装である GlassFish v4 を入手した上で、Java EE 7 のチュートリアルをご参照いただきお試しください。また、GlassFish v4.0 をバンドルし、 Java EE 7 の開発に対応した NetBeans 7.3.1 を入手いただく事で余計な設定は不要でいち早く Java EE 7 の開発を体験していただく事ができます。
Java EE 7 の新機能
- Web Socket API
- JSON Processing
- Batch
- Concurrency Utilities for Java EE
今日は、Java EE 7 の正式リリースを記念して、私が今まで様々な所で紹介してきた Java EE 7 のプレゼン資料をまとめ、また過去に発表した内容の中で、正式リリース時点で変更してしまった部分等も改めて見直し、最新情報にアップデートした資料を下記に共有します。全部で P165 ありますので、必要に応じて SlideShare よりダウンロードしてご参照ください。
本ブログをご参照頂いた皆様へ:
もしよろしければ、下記のアンケートにご協力頂けないでしょうか。今後の情報提供の際に役立てたいと思います。(※ アンケートにお応え頂くと他の方の結果をご覧頂けます。)
下記に Java EE 7 の技術のうち新規追加された 4 つの機能について簡単にご紹介します。
* Java API for WebSocket 1.0 (JSR-356):
WebSocket は RFC 6455 で定義された HTTP をアップグレードした TCP ベースのプロトコルで、双方向・全二重の通信が可能なプロトコルです。最新バージョンのブラウザであれば IE 10 を含む、ほぼ全てのブラウザが WebSocket に対応しています。JSR-356 は Java EE に含まれる技術ですのでアプリケーション・サーバ上で動作する WebSocket を実装する事はもちろんできますが、Java SE の環境上でも WebSocket のプログラムを実装するための API を提供しています。サーバ、クライアント共にクラスに対してアノテーション(@ServerEndpoint, @ClientEndpoint) を付加、もしくは javax.websocket.Endpoint クラスを継承したクラスを定義し実装します。クラス内には WebSocket の各ライフサイクルで必要な実装をそれぞれ、OnOpen, OnClose, OnError, OnMessage 内で実装します。
WebSocket はクライアントとサーバ間の通信において、HTTP のように通信時に余分なデータ(HTTP ヘッダ)を互いに送り合う事はなく通信コストを大幅に削減し、リアルタイム通信が必要な環境などで大きな注目を浴びている技術です。今まで、Comet, Reverse Ajax 等の技術を使って実装していたリアルタイムの情報配信システムにとっては、大幅にパフォーマンス向上が可能なWebSocket が標準の Java EE に含まれる事で、エンタープライズ環境でも安心して使う事ができます。
参考資料:
http://slideshare.net/arungupta1/websocket-10-21153123
● Java EE 7新機能の目玉「WebSocket対応」、「バッチ処理」をアルン・グプタが解説──Java Day Tokyo 2013レポート
● Java EE 7 チュートリアル : WebSocket API
● DZone : JSR 356, Java API for WebSocket
● java.net WebSocket Spec
* Java API for JSON Processing (JSR-342)
JSON-P は JSON の処理(パース、生成、クエリなど)を Java で実施するための API を提供します。実装は、ストリーミング API もしくは オブジェクト・モデル API の2種類の方法のいずれかを利用することができます。
ストリーミング API は、イベント・ベースのパーサを利用して、発生するイベントに応じて JSON の解析処理、生成処理などのプログラミングを行う事ができます。開発者はコールバックイベントではなく、次に発生するイベントの処理を実装していきます。ストリーミング API を利用するためには、javax.json.stream パッケージ内の JsonParser や JsonGenerator を利用します。
オブジェクト・モデル API はメモリ上に JSON のデータをオブジェクトのツリー構造として表現し、開発者はこのツリーに対して解析や修正を行います。この方法はとても簡単でさらに直感的に扱う事ができますが、その一方で Streaming モデルよりも若干遅く、またメモリもより消費します。オブジェクト・モデル API を利用するためには、javax.json パッケージ内の JsonReader, JSonWriter, ビルダー(JsonObjectBuilder, JsonArrayBuilder)等を利用します。
参考資料:
http://www.slideshare.net/reza_rahman/jsonp-19896185
● Java EE 7 チュートリアル:JSON
● java.net : JSON
● Java EE エキスパートグループ・メンバー(Markus Eisele):Test driving Java API for Processing JSON with GlassFish 4.0
● InfoQ :
JSON用標準JavaAPI
* Batch Application for the Java Platform (JSR-352)
バッチは、ユーザとのインタラクティブな操作が不要な処理を実行します。jBatch ではバッチ・ジョブの定義、実装方法を提供します。ジョブ仕様言語を XML で定義し 、バッチ関連アノテーション、インタフェースから構成されるビジネスロジックを実装します。またバッチ・コンテナでバッチ・ジョブの実行を管理します。
バッチ・ジョブはチャンク形式とタスク(Batchlet)形式のステップを含んでいます。
チャンク形式のステップはデータ・ソースからデータを読み込み、各データに対してビジネスロジックを適用し結果を保存します。
チャンク形式は3つの要素(入力、操作、出力)から構成されます。まず、はじめにデータ入力の部分では、データ・ソースから一度に一つのデータを読み込みます。たとえばデータベースのエントリやファイル、ディレクトリ、ログファイルに含まれるエントリ等がこれに当てはまります。次にビジネス・ロジックの適用部分では、アプリケーションで定義されたビジネス・ロジックを使用して一度に一つのデータの操作を行います。例えばデータのフィルタリング処理、データのフォーマットなどがこれに当てはまります。最後の出力部分では処理が行われたデータの保存を行います。データの入力では、javax.batch.api.chunk.ItemReader インタフェースを実装したクラスを定義します。データの処理には、javax.batch.api.chunk.ItemProcessor インタフェースを実装したクラスを定義します。出力ではjavax.batch.api.chunk.ItemWriter インタフェースを実装したクラスを定義します。
タスク形式のステップは、データ・ソースからデータを取得して処理を行うのではなく、任意のタスクを実行します。例えば、ディレクトリの作成、削除、ファイルの変更、データベース・テーブルの作成・破棄、リソース設定等がこれに当てはまります。タスク・ステップはチャンク形式とは異なり通常短時間で終わる処理を実装します。タスク形式のステップでは、javax.batch.api.chunk.Batchlet インタフェースを実装したクラスを定義します。
参考資料:
http://www.slideshare.net/arungupta1/jbatch-21153200
http://www.slideshare.net/agetsuma/batch-applicationforthejavaplatform
● Java EE 7新機能の目玉「WebSocket対応」、「バッチ処理」をアルン・グプタが解説──Java Day Tokyo 2013レポート
● Introducing JSR-352 – Batch Applications for the Java Platform
* Concurrency Utilities for Java EE (JSR-236)
Concurrency Utilities for Java EE はエンタープライズ環境における並列処理タスクの実装方法を提供します。Java EE 6 まではWeb コンテナ(JSP/Servlet)、もしくは EJB コンテナ(EJB)上から新しいスレッドを生成する事は禁止されていました。これは、これらのコンテナ上からスレッドを生成した場合、生成されたスレッドがコンテナ外部で動作しコンテナから生成されたスレッドを管理する事ができなくなるためです。Concurrency Utilities for Java EE ではコンテナ上で安心して新しいスレッドを生成する方法を提供します。
最も簡単に並列タスクを EE 環境で利用するためには、javax.enterprise.concurrent.ManagedExecutorService を利用します。ManagedExecutorService は Java SE の Concurrency Utilities で提供されるjava.util.concurrent.ExecutorService インタフェースを継承していますが ManagedExecutorService は Java EE の実行環境(つまりアプリケーション・サーバ)で実装されています。サーバ側の ManagedExecutorService の実装への参照を、自身のプログラム上で JNDI ルックアップ、もしくは @Resource アノテーションを使用してインジェクトし利用できるようにします。リソースをインジェクトした後は、Runnable, Callable インタフェースを実装したタスクを execute(), submit(), invokeAll(), invokeAny() 等のメソッドを呼び出して実行します。
参考資料:
http://www.slideshare.net/OracleMiddleJP/concurrency-utilities-for-java-ee-7
● JSR 236 スペックリード:Anthony Lai の説明資料 (PDF) : Concurrency Utilities for Java EE
● Concurrency Utilities for EE の説明(私のブログ)
● ZDNet builder : マルチコア時代のCPUリソースを有効活用–Java EE 7で進化した並列処理を理解する
● @IT : エンタープライズ環境におけるマルチスレッド/並列処理の過去・現在・未来
● DZone : Modern concurrency and Java EE
以上が Java EE 7 で提供される新機能です。Java EE 7 の参照実装である GlassFish v4 をダウンロードして頂き、Java EE 7 の新機能を是非お試しください。
※ 下記に JSF 2.2 と EL 3.0 に関して説明していますが、これらは Java EE 6 から更新された技術です。
JavaServer Faces 2.2(JSR-344)
JSF は Java EE 環境におけるデフォルトの Web 開発フレームワークで世界中で幅広く使用されています。Java EE 6 の正式リリース時には JSF 2.0 が標準で提供され、その後、JSF 2.1 がリリースされました。
JSF 2.1 では JSP ベースのページを .jspx ファイルとする事で、Facelets として扱う事ができるようなり、JSF 1.2 で実装されたコードをマイグレーションしやすいような方法を抵抗した他、プラグイン可能な Facelet のキャッシュ機能を実装しています。また ServletContainerInitializer が追加されデフォルトの設定で問題ない場合、web.xml での設定は不要となりました。
そして、Java EE 7 では JSF 2.2 としてさらに大きな変更が加わりました。
* HTML 5 への対応(Pass-througu の属性が追加)
* 画面遷移における新機能の追加
Faces Flow
* ステートレス・モードの追加
* リソース・ハンドリング機能の改善
(マルチ・テンプレート機能は次のバージョンへ持ち越されました)
/contracts, META-INF/contracts にテンプレートのリソースを配置
* その他
この中で、特筆すべき事は JSF にステートレス・モードが追加された事です。JSF は 1.x のリリース当初から JSF における View の全てのステート(状態の情報)を保持していました。これはメモリも大量に消費し、パフォーマンスも良くありませんでした。そこで JSF 2.0 からは、部分的に状態を保存する Partial State Saving の機能が追加され、JSF 1.x の頃に比べパフォーマンスを改善する事ができました。そして JSF 2.2 からはついに状態を持たないステートレス・モードが JSF 2.2 に追加されました。これは現在の流行にそう形ですが、パフォーマンスが大幅に改善しメモリの使用量も減ります。またクラスタ環境で任意のノードに対してリクエストを送信する事が可能になります。今まで JSF をパフォーマンスの観点から見送っていた方々も JSF 2.2 の stateless (<f:view transient=”true”>)モードをご使用ください。
* Expression Language 3.0 (JSR-341)
EL は Java Beans のプロパティやメソッドとのバインディングに使用する式言語で、通常、JSP, JSF のビューから CDI で実装されたバッキング・ビーンのプロパティやメソッド呼び出しなどを結びつけるために使用します。
EL 3.0 では新たな構文が追加されています。新たに Java のコレクションに対して LINQ式を記述できるようになった他、Lambda 式も EL 式内に記述できるようになりました。ただし、EL における LINQ 式はコレクションに対する操作のみが許可されているため、直接 DB を操作する事はできません。また、EL 内で記述する Lambda 式は Java SE 8 で提供される Lambda 式の文法と同一ですが、動作環境は Java SE の環境には依存しません。つまり Java SE 7 の環境上でも EL 式内においてのみ Lambda 式を記載できるようになっています。
また EL は今まで Java EE の環境でしか動作しませんでしたが、EL 3.0 では Java SE 環境上でも動作するようになりました。
最後に、本日正式リリースされた Java EE 7 は Java EE 6 をベースに、プラスαの要素をご理解いただく事で、簡単に Java EE 7 に移行する事ができます。
GlassFish v4.0 正式リリース
Java EE 7 のローンチ・イベントを直前 (日本時間:6/13 午後1時) に控え、オラクル(GlassFish コミュニティ)は本日 2013年6月10日(日本時間:6 月 11 日) Java EE 7 の参照実装で Java EE 7 の仕様に完全準拠した、アプリケーション・サーバ GlassFish v4.0 を、世界で最も早くリリースしました。
glassfish.java.net の Web サイト・デザインも一新され各種項目へのリンクがわかりやすくなっています。是非、glassfish.java.net をご覧いただき、最新の GlassFish を入手してください。
GlassFish v4.0 の管理ガイドはコチラ
GlassFish v4.0 アプリケーション開発ガイドはコチラ
The Java EE 7 Tutorial ドキュメント
1点、下記の点にご注意頂きたいのですが、今回リリースされた製品は開発者がいち早く Java EE 7 の新機能や更新された機能を試すために提供された物で、本番環境で動作させるために必要な下記の機能は、今回のリリース時では十分に動作しない可能性があります。機能としては含まれていますが、Java EE 7 で追加された新機能を利用した場合に正しく動作しない可能性がありますので、まずは、本バージョンをご利用頂き、開発環境で Java EE 7 の新機能を試してください。そして将来提供される本番環境用の製品リリースまで Java EE 7 & GlassFish の API や操作方法について慣れて準備してください。
- クラスタ環境構築
- 高可用性機能
- アップグレード機能
- 組み込みサーバ
追記:誤解が発生する可能性がございますので下記を追記しました。
本日、RIとしてリリースされたバージョンは Java EE 7 で提供される各 API (各 JSR)が正しく動作する事を主に提供されています。つまりクラスタリング・高可用性機能など本番環境で動作させる為に必要な管理機能に対する十分なテストがされていません。そこで本番環境でのご適用はお控え頂き、近い将来十分にテストされたバージョンがリリースされた後に本番環境にご適用ください。ここで申し上げた内容は OSS 版、製品版の違いはございません。OSS 版と製品版の違いは、製品に対するサポートの有無(パッチ提供等を含む)、製品版でのみ利用可能な追加機能の有無などになります。クラスタリング機能、インメモリによる高可用性機能などは OSS 版、製品版共に提供予定です。
リリースノートに記載されている注意事項の原文は下記
Note : The main thrust of the GlassFish Server Open Source Edition 4.0 release is to provide an application server for developers to explore and begin exploiting the new and update technologies in the Java EE 7 platform. Thus, the following features of GlassFish Server were not a focus on this release :
* Clusters and standalone instances
* High availability features
* Upgrade
* Embedded Server
These features are included in the release, but they may not function properly with some of the new features added in support of the Java EE 7 platform.
上記以外にもいくつか、既知の問題があります、詳細はリリース・ノートをご参照ください。
既知の問題の例:
- ubuntu 環境でエラーを発生しインストールに失敗
- 空白を含むパスを使用した場合に package-appclient スクリプトで失敗
- OSGi のクラス・ローダの問題で JDK 8 を使用した場合、ロガー・リソースバンドルのルックアップに失敗
- その他(詳しくはコチラ)
ご注意(NOTE): WebSocket with Concurrency for EE
Java EE 7 のリリースが控えておりますが、先日 Java Day Tokyo で私のセッションの中でデモした WebSocket (JSR-356) と Concurrency Utilities for EE (JSR-236) を組み合わせたデモのコードについてご紹介すると共に、実装時の注意点をご報告いたします。
下記は、実際に私が WebSocket (JSR-356) と Concurrency Utilities for EE (JSR-236) を組み合わせたコードを実装する際にハマった内容をお届けします。
コードは下記のようなコードを記載しています。
package jp.co.oracle.websocket;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorCompletionService;
import java.util.concurrent.Future;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.annotation.Resource;
import javax.enterprise.concurrent.ManagedExecutorService;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.ServerEndpoint;
import jp.co.oracle.tasks.WebSocketAIRSearchTask;
import jp.co.oracle.tasks.WebSocketHotelSearchTask;
@ServerEndpoint(value = "/asyncResult")
public class AsyncResultWebSocketEndpoint {
private static final Logger logger = Logger.getLogger(AsyncResultWebSocketEndpoint.class.getPackage().getName());
// Concurrency Utilities for EE の ManagedExecutorService をインジェクト
@Resource(name = "concurrent/DefaultManagedExecutorService")
ManagedExecutorService managedExecsvc;
// WebSocket のコネクションがオープンした際の処理
@OnOpen
public void initOpen(Session session) {
executeTasks(session);
}
// WebSocket クライアントからメッセージを受信した際の処理
@OnMessage
public void receivedMessage(String message, Session session) {
if (!message.equals("re-execute")) {
return;
}
executeTasks(session);
}
// 実際の処理内容
private void executeTasks(Session session) {
// 複数タスクの実行の際に終わった順に処理結果を取り出す
ExecutorCompletionService<String> execCompService = new ExecutorCompletionService<>(managedExecsvc);
// 複数タスクの登録
List<Future<String>> futures = new ArrayList<>();
for (int i = 0; i < 100; i++) {
WebSocketHotelSearchTask task = new WebSocketHotelSearchTask(i);
futures.add(execCompService.submit(task));
}
try {
// 終了したタスクの順番に処理結果を取得し
// 処理結果を WebSocket のクライアント・エンドポイント
// に対して処理結果を送信
for (Future<String> results : futures) {
String resultString = execCompService.take().get();
session.getBasicRemote().sendText(resultString);
}
} catch (IOException | InterruptedException | ExecutionException ex) {
logger.log(Level.SEVERE, null, ex);
}
}
}
ダミーのタスク
package jp.co.oracle.tasks;
import java.util.concurrent.Callable;
import java.util.logging.Level;
import java.util.logging.Logger;
public class WebSocketHotelSearchTask implements Callable<String> {
private static final Logger logger = Logger.getLogger(WebSocketHotelSearchTask.class.getPackage().getName());
private int counter;
public WebSocketHotelSearchTask(int counter) {
this.counter = counter;
}
// タスクの処理内容によっては時間のかかるタスクもあるため
// 半分のタスクをわざと 4 秒待たせ、タスクの登録順にタスクが
// 完了しないように作成
@Override
public String call() {
String result = "";
if (counter % 2 == 1) {
Thread.sleep(4000);
}
result = "ホテル検索タスク完了 : 終了タスクの ID" + counter;;
} catch (InterruptedException ex) {
logger.log(Level.SEVERE, null, ex);
}
return result;
}
}
今回、なぜ下記のようにタスクの一括登録を行った後に、タスクの処理が終わった順に WebSocket のクライアント・エンドポイントに対してメッセージ配信を行うコードを実装したかというと(つまり、タスクの処理コード中から WebSocket のクライアントに対してメッセージ配信をしていない)、WebSocket 側のスレッドの制限があったためです。
// 複数タスクの登録
List<Future<String>> futures = new ArrayList<>();
for (int i = 0; i < 100; i++) {
WebSocketHotelSearchTask task = new WebSocketHotelSearchTask(i);
futures.add(execCompService.submit(task));
}
try {
// 終了したタスクの順番に処理結果を取得し
// 処理結果を WebSocket のクライアント・エンドポイント
// に対して処理結果を送信
for (Future<String> results : futures) {
String resultString = execCompService.take().get();
session.getBasicRemote().sendText(resultString);
}
当初、下記のように Runnable (Callable の call() 中で実装も可)のインタフェースを実装したタスクを作成し、タスクの処理の中で WebSocket のエンドポイントに対してメッセージを配信するコードを記載しました。例えば、下記のような感じです。
public class SomeMyTask implements Runnable{
Session session;
public SomeMyTask(Session session){
this.session = session;
}
@Override
void run(){
// 何らかの処理を実施
// タスクの処理の最後に、WebSocket のクライアント・エンドポイント
// に対してメッセージを配信
session.getBasicRemote().sendText(resultString);
}
}
そして、下記のコードを書いてタスクを実行しました。
for( int i = 0 ; i < 10 ; i++ ){
SomeMyTask task = new SomeMyTask(session);
managedExecsvc.submit(task);
}
すると下記の例外が発生しました。
例外の出力内容:
| java.lang.IllegalStateException: HeapBuffer has already been disposed at org.glassfish.grizzly.memory.HeapBuffer.checkDispose(HeapBuffer.java:802) at org.glassfish.grizzly.memory.HeapBuffer.position(HeapBuffer.java:188) at org.glassfish.grizzly.nio.transport.TCPNIOAsyncQueueWriter.fillByteBuffer(TCPNIOAsyncQueueWriter.java:194) at org.glassfish.grizzly.nio.transport.TCPNIOAsyncQueueWriter.writeComposite0(TCPNIOAsyncQueueWriter.java:151) at org.glassfish.grizzly.nio.transport.TCPNIOAsyncQueueWriter.write0(TCPNIOAsyncQueueWriter.java:80) at org.glassfish.grizzly.nio.AbstractNIOAsyncQueueWriter.processAsync(AbstractNIOAsyncQueueWriter.java:458) at org.glassfish.grizzly.filterchain.DefaultFilterChain.process(DefaultFilterChain.java:110) at org.glassfish.grizzly.ProcessorExecutor.execute(ProcessorExecutor.java:77) at org.glassfish.grizzly.nio.transport.TCPNIOTransport.fireIOEvent(TCPNIOTransport.java:838) at org.glassfish.grizzly.strategies.AbstractIOStrategy.fireIOEvent(AbstractIOStrategy.java:113) at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.run0(WorkerThreadIOStrategy.java:115) at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.access$100(WorkerThreadIOStrategy.java:55) at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy$WorkerThreadRunnable.run(WorkerThreadIOStrategy.java:135) at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:564) at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.run(AbstractThreadPool.java:544) at java.lang.Thread.run(Thread.java:722) |
なぜだろうと、Grizzly のソースコードを追ってみると、既にヒープが開放されてしまっているようです。
800 protected final void [More ...] checkDispose() {
801 if (heap == null) {
802 throw new IllegalStateException(
803 "HeapBuffer has already been disposed",
804 disposeStackTrace);
805 }
806 }
当初バグかとも思ったのですが念のため、WebSocket (JSR-356) 仕様のスレッド関連部分をチェックしてみました。すると下記の 5.1 に WebSocket に関するスレッドの注意書きが記載されておりました。
| 5.1 Threading Considerations Implementations of the WebSocket API may employ a variety of threading strategies in order to provide a scalable implementation. The specification aims to allow a range of strategies. However, the implementation must fulfill certain threading requirements in order to provide the developer a consistent threading environment for their applications. Unless backed by a Java EE component with a different lifecycle (See Chapter 7), the container must use a unique instance of the endpoint per peer. [WSC-5.1-1] In all cases, the implementation must not invoke an endpoint instance with more than one thread per peer at a time. [WSC-5.1-2] The implementation may not invoke the close method on an endpoint until after the open method has completed. [WSC-5.1-3] This guarantees that a websocket endpoint instance is never called by more than one container thread at a time per peer. [WSC-5.1-4] If the implementation decides to process an incoming message in parts, it must ensure that the corresponding onMessage() calls are called sequentially, and do not interleave either with parts of the same message or with other messages [WSC-5.1.5]. |
つまり、タスクの実行自身は複数のスレッドで実行できるのですが、WebSocket のクライアント・エンドポイントへのメッセージ送信は1箇所にまとめて実装しなければならない事に気付き上記のようなコードを書いています。
個人的には、マルチスレッドから WebSocket のクライアント・エンドポイントにメッセージ送信ができるようになるとより便利になるのではないかと思いますが、皆様如何でしょう? もちろん、既に仕様は FIX して Java EE 7 のリリース時点では無理ですし、Grizzly 等サーバ側の実装も今のままだと難しい部分があるかもしれません。しかし、皆様で声を上げていけば、時期 Java EE 8 の WebSocket 1.1 当たりで、マルチスレッドからのメッセージ送信もできるかも?!しれないので、賛同して頂ける方がいらっしゃったら、まとめて報告したいなと思っております。
(仕様上ダメって断られる可能性ももちろんありますが。(^_^;))
でも、昔と違って今の Java はこういった事がスペック・リードやエキスパート・グループメンバーに伝えやすい環境なんですよ!!
JJUG として Adopt-A-JSR プログラムに参加し、日本から改善要望なども出していけるといいですね。
Java EE 7 ローンチ・イベント開催日決定
もう、すでにご存知の方も多いかと思いますが、6/12日 Java EE 7 が正式にリリースされます。これに合わせ、Java EE 7 ローンチ・イベントが 6/13(木) 日本時間の午後1時からオンラインで開催されます。Java EE 7の新機能にご興味のある方は是非ご参加下さい。本イベントは2回同じ内容が繰り返し開催される予定で1回目は日本の深夜の時間帯に実施されます。
3 年前の Java EE 6 のローンチ・イベントは日本時間の夜中に1度しか開催されなかったため、多くの日本人にとっては参加がしずらかったのですが、今回は US の現地時間で深夜までエンジニアが頑張ってくれています。こういった US のエンジニアの頑張りはとてもありがたいと共に、こうして与えられた貴重なお祭りイベントに是非日本の Java 開発者の皆様もご参加ください。
当日のスピーカーは Java 全体の開発部門のトップを務める、Hasan Rizvi の他、先日 Java Day Tokyo 2013 のために来日してくれた Cameron Purdy 、そして WebLogic/GlassFish のアプリケーション・サーバの開発部門のトップである Anil Guarといった Java EE 業界のトップ達が登場する他、
Java EE 7のスペックリードである Linda DeMichiel や日本でもおなじみとなった、Java EE のエバンジェリストである Arun Gupta も登壇します。
当日は、Java EE 7 に含まれる各種要素技術 (JSON, WebSocket, JAX-RS, JSF, Servlet, Batch, Concurrency, JMS, JPA, EL, EJB, CDI, Bean Validation, JTA, Interceptors, GlassFish の管理機能) をそれぞれ 15-20 分でご紹介する他、ライブ・チャットも用意されているので、エキスパート・グループのメンバーと情報交換をする事もできるようです。
日本人も参加しやい時間帯で開催される、このローンチ・イベントに是非、日本の Java 開発者の皆様もご参加ください。
PS.
GlassFish のコミュニティ・サイトではリリースまでのカウントダウン・タイマーが表示されています。
Java Day Tokyo 2013 の御礼について

御礼メッセージが遅くなり申し訳ございませんでした。
2013年5月14日Java Day Tokyo を開催し、日本全国より御参加頂きまして誠にありがとうございました。昨年の JavaOne Tokyo 2012 に引き続き、オラクルになって2度目の大規模な Java イベントに、昨年の JavaOne 以上にご登録を頂き、また非常に高い参加率でご来場頂きまして誠にありがとうございました。
Java Day Tokyo は JavaOne とは違い無償のイベントとして開催したため、JavaOne Tokyo とはまた違う形で開催しましたが如何でしたでしょうか。我々の至らぬ点も多々あったかと思います。皆様から頂いたフィードバック、アンケートを元に、また次回開催する場合には、今回の教訓を生かしていきたいと考えております。
今回イベント終了後、海外から参加してくれた、全エンジニアと会話をしましたが、日本のイベントは素晴らしい!!また次回開催する際には必ず参加すると言っていただきました。これもご参加頂いた皆様の思いが彼らに伝わった事による物と思います。このように皆様が盛り上がってくだされば、優秀なエンジニアを日本に招きやすくなりますし、我々としても色々な点で活動がしやすくなってまいります。かつてのように世界において日本のマーケットは大事にしなければならないと思わせる良い機会になったと強く思うとともに、ご参加頂いた皆様に大変感謝いたしております。
また、JavaOne Tokyo に引き続き、JJUG を始めとする、Java のコミュニティ・メンバーの皆様にも大変感謝いたしております。当日御発表頂きました内容は別途サイトの方へ反映されるかと思いますが、ここで改めて、各種セッションでお世話になった皆様をご紹介します。
* 基調講演
JJUG 会長の鈴木雄介さん (Twitter:@yusuke_arclamp)
* Java IDE の最新トレンド
Eclipse 竹添 直樹さん (Twitter:@takezoen)
NetBeans きしだ なおきさん (Twitter:@kis)
IntelliJ 今井 勝信さん (Twitter:@masanobuimai)
モデレータ:山本裕介さん (Twitter:@yusuke)
* 帰ってきた Java パズラー
岡崎 隆之さん (Twitter:@watermint)
橋本 吉治さん (Twitter:@hasssie)
* Java The Night
1.徳益 芳郎さん
2.千葉優輝さん、小野貴史さん
3.青江 崇さん (Twitter:@aoetk)
4.小出 洋さん (Twitter:@hirosk)
5.櫻庭 祐一さん (Twitter:@skrb)
6.末永 恭正さん(Twitter:@YaSuenag)
7.蓮沼 賢志さん(Twitter:@btnrouge)
8.太田昌文さん(Twitter:@masafumi_ohta)
9.奥 清隆さん(Twitter:@kiy0taka)
特に、千葉優輝さん、小野貴史さんは、北海道の大学に所属する現役の学生さんで、今回わざわざ北海道からこのイベントに駆けつけてくださいました。千葉さん、小野さん本当にありがとうございました。ご協力頂きました皆様、本当にありがとうございました。
最後に、
ご参加頂きました皆様、ご協力頂きました皆様、今後の日本における Java の発展のためにも、是非今後ともどうぞ宜しくお願いします。そしてまたイベントを開催する際には是非多くの Java 開発者の皆様に足をお運び頂ければ誠に幸いです。
今後ともどうぞ宜しくお願いします。
寺田
Concurrency Utilities for EE 7
本日は、Java Day Tokyo に非常に多くの Java 開発者の皆様にお集まりいただきまして誠にありがとうございました。本日私が C-4 のセッション「エンタープライズ環境における並列処理の実装方法について」で説明した資料に参考メモを付加した、参照用のバージョンを下記に公開します。
また併せて説明時に使用したデモ(CPU 256 個の環境で Java を並列処理実行させた際のデモンストレーション)動画も下記に公開します。下記のデモは内部的に単なる Σ 計算を行なっているだけなのですが、デモ動画をご覧いただくとわかるのですが、単なる逐次処理、JDK 1.0 からある昔ながらの Thread 生成方法、Concurrency Utilities を利用した場合で、どの位 CPU リソースの利用状況が変わるかを視覚的にご覧いただけるかと思います。
※ 昔 Java は遅いと言われた時代がありましたが、今の Java を未だに遅いとか言っている方は正直勉強不足ではないかと思います。本デモのように、Java VM(実行環境)は非常にハイ・パフォーマンスで、ハイ・スケーラブルな実行環境です。現実的には、256 個の CPU を使い切る場面はないかと思いますが、Java はこのように適切にプログラミングを行うと、必要に応じて CPU を全て使い切る事もできる素晴らしい実行環境です。
Concurrency Utilities for Java EE は、
今まで Servlet コンテナ(AKA Web コンテナ)、EJB コンテナで禁止されていた、スレッド生成を、安全に EE 環境にも適用できる物です。単なる非同期と並列処理の違いをご理解頂き、バックグラウンドで非同期かつ並列に実行したい複数のタスクがある場合には、このAPI はとても有用です。
今回、発表時に使用したデモの全てのソースコードを下記に公開していますので、Asyn Servlet, Async EJB, JMS&MDB を含む非同期処理、さらには非同期並列処理にご興味ある方はどうぞご参照いただければ幸いです。中には WebSocket と Concurrency の連携デモのソースコードも含まれます。
是非、ご参照頂ければ幸いです。
Java SE7API日本語版提供開始
2013 年 5 月 14 日、日本オラクルより新しい発表を行います。本日 5 月 14 日に日本語版 Java SE API ドキュメントを正式公開しました。
「Java Platform, Standard Edition 7」の最新情報を記載したドキュメント類の日本語版を本日公開しました。
公開先URL:http://www.oracle.com/technetwork/jp/java/javase/documentation/
・本日公開した「Java Platform, Standard Edition 7」の最新ドキュメントは、2011年7月に提供開始した「Java Platform, Standard Edition 7 (Java SE 7)」が提供する機能紹介、コンポーネント一覧を記載した参照資料です。Java開発者やこれからJavaプログラミング技術を習得する開発者は、この資料を参照することで、Java SE 7 が提供する各種機能を理解し、最新Java標準技術に基づいたプログラミングやアプリケーション開発に役立てることができます。
「Java Platform, Standard Edition 7」 の最新ドキュメントの構成
・「Java Platform, Standard Edition 7」の最新ドキュメントの日本語版は主に、「Java Platform, Standard Edition 7 ドキュメント」と「Java Platform, Standard Edition 7 API 仕様」の2つから構成されています。4,024のプログラム部品群(クラス)、そのクラスを集約した210のパッケージ、およびそれらに関連したドキュメント類など、合計約13,000種類のファイルが含まれます:
・ 「Java Platform, Standard Edition 7 ドキュメント」日本語版は、Java SE 7の構成要素をまとめた資料で、Java SE Development Kit (JDK)、Java SE Runtime Environment (JRE)、およびJava SEの API それぞれが提供する機能を参照できます。
公開先URL: http://docs.oracle.com/javase/jp/7/

・ 「Java Platform, Standard Edition 7 API 仕様」日本語版は、Java SE が提供するクラスやインタフェースなどの一覧を示しています。
公開先URL:http://docs.oracle.com/javase/jp/7/api/
Java Day Tokyo 2013 の Twitter ハッシュ・タグについて

Java Day Tokyo 2013 が本日午前から開催されますが、Java Day Tokyo の各セッションにおける Twitter のハッシュ・タグをオフィシャル・ページで公開していませんでした。
そこで私のブログで Java Day Tokyo 2013 のセッション毎の Twitter ハッシュ・タグを記載しました。明日は大変恐れ入りますが、下記のハッシュ・タグをご利用いただければ誠に幸いです。皆様の Tweet を心よりお待ち申し上げます。(L1 だけ大文字とさせていただけないでしょうか。)
また、会場では フリーの Wifi 環境が整っておりません、大変恐れ入りますが、モバイルの WiFi ルータをお持ちの方は大変恐れ入りますがご持参いただければ誠に幸いです。
| 10:30-12:00 | 基調講演(#jdt2103L1) | |||
| 12:20-13:10 | Ask The Experts! (#jdt2013s1) | |||
| 13:30-14:20 | ここからはじめる、JSR-356 WebSocket (#jdt2013a1) |
Raspberry Pi NightHacking (Java SE / JavaFXを楽しもう) (#jdt2013b1) |
OCJP Silver SE 7 資格試験の傾向と対策 (#jdt2013d1) |
|
| 14:35-15:25 | Java SE 8 による関数プログラミングの構文と並列処理のシンプル化 (#jdt2013a2) |
Internet of Thingsにおける Java: Small, Smart, Connected (Java ME Embedded) (#jdt2013b2) |
エスケイプ・フロム・レガシJ2EE (#jdt2013c2) |
Java IDE の最新トレンド (#jdt2013e2) |
| 15:40-16:30 | Java プラットフォームにおける Batch アプリケーション (JSR 352) (#jdt2013a3) |
Groovy, Clojure, Scala, VisageでのJavaFX活用 (#jdt2013b3) |
Device to Data Centerを実現するJava Embedded Suite (#jdt2013c3) |
OCJP Gold SE 7 資格試験の傾向と対策 (#jdt2013d3) |
| 16:45-17:35 | タブレット用の JavaFX アプリケーション開発 (#jdt2013a4) |
InvokeDynamic からNashorn のご紹介 (#jdt2013b4) |
エンタープライズ環境における並列処理の実装方法について (#jdt2013c4) |
帰ってきた Java パズラー (#jdt2013e4) |
| 18:00-20:00 | Java The Night (#jdt2013a5) | |||
Java Day Tokyo 2013 を明日にひかえて
皆様、明日はいよいよ Java Day Tokyo 2013 が秋葉原で開催されます。ご登録頂きました皆様、本当にありがとうございました。
JavaOne とは別に、日本オラクルで独自に企画・開催するこの Java のイベントに、日本全国から参加のご登録をいただきまして誠にありがとうございました。当初、JavaOne の名前が付かないこの無償イベントにどの位の皆様にご登録いただけるか心配しておりましたが、私達が想定していた以上に数多くの皆様にご登録いただけた事を大変嬉しく思うと共に、ご登録頂いた皆様に心より感謝を申し上げます。
この Java の開発者の皆様の盛り上がり、ご登録者数、御参加者数の結果が、また次のイベントにつながるかと思うと、主催者側の1人として今回のご登録者数は大変嬉しく思うとともに、皆様に大変感謝いたしております。明日は、皆様のお越しを心よりお待ち申し上げます。
さて、明日は非常に多くの皆様にご参加いただくため、当日は朝の受付も混雑が予想されます。基調講演はメイン会場の他、サテライト会場もご用意しておりますが、メイン会場でできるだけ良い席でご覧いただきたいという方は是非、朝お早めにご来場いただければ嬉しく思います。
当日の基調講演開催場所はアキバ・スクエアになります。また、このアキバ・スクエアでは、午後から始まるテクニカル・セッション A-x の枠がこの部屋を利用します。その他の午後のテクニカルセッションにつきましては、同じビルにある UDX GALLERY を B-x,C-x 枠、そして UDX GALLERY NEXT を D-x, E-x 枠 を利用します。
また、喫煙者の皆様におかれましては、ホール・会議室周辺にはないため、5F の喫煙所まで足をお運びいただければ幸いです。
基調講演が終わった後、昼食の時間帯(12:20-13:10)に「S-1 : Ask The Experts ! 」のセッションが開催されます。このセッションにご参加いただく皆様は、是非お弁当持参でご参加いただければ幸いです。また、このセッションは、US のオラクル社員に対して直接皆様からご質問が頂ける、もしくはご意見をお伝えいただく事ができる貴重な機会です。Java SE, JavaFX, Java EE それぞれのエキスパートが皆様からの貴重なご質問、ご意見をお待ちしておりますので、是非皆様お持ちよりいただければ幸いです。
午後 13:30 より、午後のセッションが本格的に始まりますが、C-1 セッションにご登録頂いていた皆様には、大変申し訳ございません。セッションを担当する予定だった者が急病となってしまい、キャンセルせざるおえない状況となってしまいました。大変恐れ入りますが、この状況をご理解いただければ誠に幸いです。
その他のセッションにつきましては、是非皆様楽しみにしていていただければ幸いです。今回、日本に来ている外人講師は全員、本場 JavaOne でも発表するような世界中で活躍しているエバンジェリストです。JavaOne インドが先週開催されていたのですが、JavaOne インドが終わった後、その足で皆日本に駆けつけてくれています。(正直、彼らにはハード・スケジュールでお願いしていて、申し訳ない気持ちも多々あるのですが)昨年の JavaOne や Java Developers Workshop 等にご参加頂いた皆様全員の(日本の Java 開発者)盛り上がり、熱狂ぶりを知っているので、こうして心よく来てくれているのではないかと思います。
今回、初来日の外人講師が2名(Stephen Chin、Jim Weaver)います。この2人は JavaFX をやっている方ならば知らない人はいないという程、世界的に有名なエンジニアで、2人とも昨年オラクルに入社されたのですが、その前は2人とも Java Champion で「Pro JavaFX2」の著者としても有名です。JavaFX にご興味のある皆様は是非、Chin-san, Jim-san にお声掛けください。

また、E-4 の「帰ってきた Java パズラー」は、私のウラ番組でなければ、私自身が一番行きたいセッションの一つなのですが、このセッションもとても楽しんでいただけると思いますので、ご興味のある方はぜひご参加ください。
最後に、”Java The Night” ですが、18:00-20:00 まで開催致しますが、是非、最後まで楽しんでいただければとおもいます。本日までベールに包んでいましたが、Java The Night では、日本の各 Java テクノロジーを代表するスーパー・エンジニア達に、1人8分で Java を使った技術でデモをしていただく、時間制限ありの LT っぽい、デモ大会を行います。Java VM, JavaFX, Java EE, GlassFish, SunSPOT, Raspbery PI など、Java を使って、もしくは Java その物に対して、いろんなデモをご覧いただけます。明日からすぐ使える技術、使ってみたいと思うような技術、これすげぇ!!といった内容がご覧いただけるかと思います。Java ってオモシロイね!!と思っていただけるよう、9人の猛者がお届けします。どうぞお楽しみになさってください。
※ 受講票は忘れずにプリントアウトしてご持参ください。事前にご登録を頂いていた場合も、再チェックに時間を要してしまうため、ご自身の受付がスムーズにできなくなる可能性がございます。
また、明日は Java の日のため、スーツ・コスプレでお越しいただいても結構ではございますが、是非 Java の正装(春の装い)でお越しください。(^_^)


