Posts filed under ‘未分類’
Java EE 7 の新機能を 45 分で 45 個ご紹介
皆様、いつも大変お世話になっております。
この度、Developers Summit 2014 (通称:デブサミ) でJava EE 7 の新機能をご紹介するセッションを持たせていただき、登壇する事になりましたのでご案内致します。
2014/2/14(金) 16:20~17:05
「45 new features of Java EE 7 in 45 minutes」
Java EE 7 は2013年6月に正式にリリースされ、2014年以降Java EE 7 に準拠したアプリケーションが続々と登場する事が予想されます。Java EE 7 は、WebSocket,JSON, Batch, Concurrencyの新機能が追 加された他、既存のAPIにも様々な改良が施されています。エンタープライズJavaの今後、とても重要になるJava EE 7の新機能を45分で45 の新機能を紹介します。
※ このセッションは、本場 JavaOne San Francisco 2013 で人気があったセッションを日本で初めて実現する物で、コンテンツは今回、日本の開発者の皆様向けに作り直して提供予定です。また、Java EE 5,6 についてある程度勉強して頂いている方が、Java EE 7 への差分をまとめて理解をする事ができるセッションです。ソースコードを交えながらご紹介いたしますので、是非ご都合のつく方はお越しください。
Java EE 7 WebSocket Mail の実装
本エントリは、Java Advent Calendar 2013 の 20日目のエントリです。
昨日、19日目は 23 才のお誕生日を迎えた、 ひらおかゆみさん (id:yumix_h) の
「JavaMailを手軽に使うライブラリ」でした。 yumix_h さんお誕生日おめでとうございます!!
明日は、@nagaseyasuhito さんです。
本エントリは、1つ前のエントリで投稿した「JSF + WebSocket で実装した IMAP Web メール・クライアント」の続きのエントリで、WebSocket の実装部についてご紹介します。
ただし、残念ながら今回はアンチパターンとしてのご紹介になります。
ポイントは、WebSocket のサーバ・エンドポイントの実装で別スレッドを立てて監視などを行ってはいけないという点です。
追記:2014 年 5 月 9 日 : Java Mail 1.5.2 のリリースによりアンチパターンではなくなりました。詳細は本エントリ最下部をご参照
WebSocket はリアルタイム通知を行うために多くの開発者に興味を持たれています。実際、このデモでは、IMPAの受信箱(INBOX)に入ってきたメッセージをユーザにいち早く、リアルタイムでお知らせするために、WebSocket を使用して通知しています。WebSocket を使う事でこのようなアプリケーションを作成する事もできます。
実際には、下記のように実装しています。まず、クライアント側の View の実装ですが、JSF の XHTML と JavaScript でそれぞれ実装します。
JSF のページ内で <h:outputScript> を指定し WebSocket のクライアント・エンドポイントの実装 JavaScript(ws-client-endpoint.js) を読み込んでいます。次に、PrimeFaces で用意されている、「Notification Bar」を使用します。「Notification Bar」は、下記 URL のサンプルでご参照頂ける通り、動的にパネルを表示させる事ができる、JSF のコンポーネントです。
http://www.primefaces.org/showcase/ui/notificationBar.jsf
このコンポーネントを使用して、WebSocket のサーバ・エンドポイントからメッセージを受信した際に、 JavaScript から PF(‘bar’).show() を実行してこのコンポーネントを表示させます。一方で、このコンポーネントを非表示にするためには、JavaScript で PF(‘bar’).hide()を呼び出す事で非表示にできます。
実際に、WebSocket のサーバに接続するためには、「リアルタイムチェック開始」ボタンを押下して接続します。「リアルタイムチェック開始」ボタンを押下すると JavaScript の connectServerEndpoint() が呼び出され、WebSocket のサーバ・エンドポイントに接続します。
<h:head>
<title>JSF-WebSocket WebMail</title>
<f:event type="preRenderView" listener="#{messageReceiveMgdBean.onPageLoad}"/>
<h:outputScript library="javascripts" name="ws-client-endpoint.js"/>
</h:head>
<h:body>
<h:form id="form">
<p:notificationBar position="top" effect="slide" widgetVar="bar" styleClass="top" style="background-color : #F8F8FF ; width: fit-content;">
<h:panelGrid columns="2" columnClasses="column" cellpadding="0">
<h:outputText value="新着メッセージ :" style="color: red;font-size:12px;" /> <p:commandButton value="閉じる" onclick="PF('bar').hide()" type="button" style="font-size:10px;"/>
<h:outputText value="Subject :" style="font-size:10px;" /><h:outputText id="wssubject" value="" style="font-size:10px;" />
<h:outputText value="From :" style="font-size:10px;" /><h:outputText id="wsfrom" value="" style="font-size:10px;" />
<h:outputText value="メッセージ・サマリー :" style="font-size:10px;" /><h:outputText id="wssummary" value="" style="font-size:10px;" />
</h:panelGrid>
</p:notificationBar>
…中略
<input id="connect" type="button" value="リアルタイムチェック開始" style="font-size:10px;" onClick="connectServerEndpoint();"/>
<input id="close" type="button" value="リアルタイムチェック中止" style="font-size:10px;" onClick="closeServerEndpoint();"/>
JavaScript の実装は下記の通りです。まず、ページのロード時には、「リアルタイムチェック中止」のボタンを非表示にし「リアルタイムチェック開始」ボタンのみ表示させています。ボタンを押下すると「connectServerEndpoint()」を呼び出しますが、ここでは、WebSocket のサーバ・エンドポイントに接続し、「リアルタイムチェック開始」、「リアルタイムチェック中止」ボタンそれぞれの表示、非表示を切り替えます。
次に、サーバ・エンドポイントからメッセージを受信した場合、onMessage() 経由で writeToScreen() を呼び出しJSON のデータを展開した後、JSF のコンポーネントに対して値を代入し、 PF(‘bar’).show()で通知バー(<p:notificationBar>)を表示させます。
var websocket = null;
function init() {
document.getElementById("close").style.display = "none";
}
function closeServerEndpoint() {
websocket.close(4001, "Close connection from client");
document.getElementById("connect").style.display = "block";
document.getElementById("close").style.display = "none";
}
function connectServerEndpoint() {
var wsUri = "ws://localhost:8080/JSF-WebSocket-Mailer/inbox-check";
if ("WebSocket" in window) {
websocket = new WebSocket(wsUri);
} else if ("MozWebSocket" in window) {
websocket = new MozWebSocket(wsUri);
}
websocket.onopen = function(evt) {
onOpen(evt);
};
websocket.onmessage = function(evt) {
onMessage(evt);
};
websocket.onerror = function(evt) {
onError(evt);
};
websocket.onclose = function(evt) {
closeServerEndpoint();
};
document.getElementById("connect").style.display = "none";
document.getElementById("close").style.display = "block";
}
function onOpen(evt) {
;
}
function onMessage(evt) {
writeToScreen(evt.data);
}
function onError(evt) {
writeToScreen("ERROR: " + evt.data);
}
function writeToScreen(messages) {
if (window.JSON)
{
var obj = JSON.parse(messages);
var subject = obj.subject;
var from = obj.address;
var summary = obj.summary;
document.getElementById('form:wssubject').innerHTML = subject;
document.getElementById('form:wsfrom').innerHTML = from;
document.getElementById('form:wssummary').innerHTML = summary;
}
PF('bar').show();
}
window.addEventListener("load", init, false);
次に、サーバ・エンドポイント側の実装ですが、サーバ側の実装は下記の3クラスから構成されています。
InboxCheck : WebSocket のサーバ・エンドポイントの実装
MessageEncoder : MessageからJSONを生成するエンコーダ
InboxCheckRunnableTask : INBOX を監視する並列処理用タスク
まず、InboxCheck ですが、このクラスが WebSocket のサーバ・エンドポイントの重要なクラスです。このクラスでは、クライアント・エンドポイントから接続された際に、IMAP サーバへ接続するためのユーザ名、パスワードを受け取り、IMAP サーバへ接続を行っています。
※ 今回、JSF のログインページで入力された、ユーザ名、パスワードをWebSocket 側でも扱えるように Session Scope に値を代入し、取り出していますが、本来 Session Scope に代入すべきではないので、別の方法 (Flash等でできれば) でユーザ名、パスワードを渡す方法を検討すべきです。今回は簡単のため、Session で扱わせて頂きました。
IMAPサーバへ接続した後、checkNewMessage() で新着メッセージを監視します。
追記:checkNewMessage() メソッドの実装は、下記の実装ではなく、Java Mail 1.5.2 でリリースされたIdleManagerクラスを使用して実装してください。詳細は本エントリの最下部に記載しています。
具体的には、下記の実装箇所で、IMAP の INBOX Folder に対して、メッセージが追加された際の処理を実装しています。
folder.addMessageCountListener(new MessageCountAdapter() {});
この内部実装では、メッセージが追加(新着メッセージが来た)された際に、最新のメッセージを取得し、その情報を WebSocket のクライアント・エンドポイントに対して配信しています。
次に、実際にメッセージが追加された事を検知するための実装を行います。これは、IMAP の IDLE (RFC 2177) 機能を使って、フォルダの変更をリアルタイムで検知します。このリアルタイム監視は、InboxCheckRunnableTask で実装し、別のスレッドで監視を行うようにします。
package jp.co.oracle.samples.websockets;
import java.io.IOException;
import java.util.Properties;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.annotation.Resource;
import javax.annotation.security.RolesAllowed;
import javax.enterprise.concurrent.ManagedThreadFactory;
import javax.inject.Inject;
import javax.mail.Folder;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Session;
import javax.mail.Store;
import javax.mail.event.MessageCountAdapter;
import javax.mail.event.MessageCountEvent;
import javax.websocket.EncodeException;
import javax.websocket.OnClose;
import javax.websocket.OnError;
import javax.websocket.OnOpen;
import javax.websocket.server.ServerEndpoint;
import jp.co.oracle.samples.mgdBean.IndexLoginMgdBean;
import jp.co.oracle.samples.tasks.InboxCheckRunnableTask;
/**
*
* @author Yoshio Terada
*/
@ServerEndpoint(value = "/inbox-check",
encoders = {MessageEncoder.class})
public class InboxCheck {
private Store store;
private static final Logger logger = Logger.getLogger(InboxCheck.class.getPackage().getName());
@Resource
ManagedThreadFactory threadFactory;
InboxCheckRunnableTask invokeCheck = null;
@Inject
IndexLoginMgdBean login;
@OnOpen
public void onOpen(javax.websocket.Session session) {
try {
initStore(login.getImapServer(), login.getUsername(), login.getPassword());
checkNewMessage(session);
} catch (MessagingException mes) {
try {
logger.log(Level.SEVERE, "Exception occured on monitoring INBOX ", mes);
session.close();
} catch (IOException ex) {
logger.log(Level.SEVERE, "Failed to close session", ex);
}
}
}
@OnClose
public void onClose(javax.websocket.Session session) {
if (invokeCheck != null) {
invokeCheck.terminateRealTimeCheck();
}
}
@OnError
public void onError(Throwable t) {
logger.log(Level.SEVERE, "Error Occured", t);
}
/* 本エントリの最下部に説明した IdleManager クラスを使用して実装してください
private void checkNewMessage(final javax.websocket.Session session) throws MessagingException {
// INBOX のフォルダを対象
Folder folder = store.getFolder("INBOX");
if (!folder.isOpen()) {
folder.open(javax.mail.Folder.READ_WRITE);
}
// フォルダのメッセージ・カウント数を監視
folder.addMessageCountListener(new MessageCountAdapter() {
@Override
public void messagesAdded(MessageCountEvent e) {
Message[] msgs = e.getMessages();
Message msg = msgs[msgs.length - 1];
try {
// WebSocket のクライアント・エンドポイントに送信
session.getBasicRemote().sendObject(msg);
} catch (IOException | EncodeException ioencx) {
logger.log(Level.SEVERE, "Failed to Send Message ", ioencx);
}
}
});
// 別スレッドでメッセージの到着を監視
newInboxCheckThreadWithRetryCount(folder);
}
private void newInboxCheckThreadWithRetryCount(Folder folder) {
invokeCheck = new InboxCheckRunnableTask(folder);
Thread runTask = threadFactory.newThread(invokeCheck);
runTask.start();
}
*/
// Store の初期化(ページのロード時)
private void initStore(String imapServer, String username, String password) throws MessagingException {
Properties props = System.getProperties();
props.setProperty("mail.store.protocol", "imaps");
Session session = Session.getDefaultInstance(props, null);
javax.mail.Store initStore = session.getStore("imaps");
initStore.connect(imapServer, username, password);
this.store = initStore;
}
}
InboxCheckRunnableTask では、IDLE 機能が有効か無効かをチェックし、IDLE 機能が有効な場合、idle()で新着メッセージの到着を待ち受けます。idle() はメッセージが1通到着すると処理が終了しますので、スレッドの終了メソッドが呼び出されるか、何らかの例外が発生するまで、無限ループで繰り返し呼び出します。
一方で、IDLE 機能が無効なサーバに接続する場合は(Yahooなど)、idle() で待ち受けできませんので、自身で定期的にポーリングを行っています。
package jp.co.oracle.samples.tasks;
import com.sun.mail.imap.IMAPFolder;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.mail.Folder;
import javax.mail.MessagingException;
/**
*
* @author Yoshio Terada
*/
/* 本エントリの最後に記載した IdleManager で実装してください。
public class InboxCheckRunnableTask implements Runnable {
private final static int MAIL_CHECK_IDLE_TIME = 20000;
private Folder folder;
private static final Logger logger = Logger.getLogger(InboxCheckRunnableTask.class.getPackage().getName());
volatile boolean isRunnable = true;
public InboxCheckRunnableTask(Folder folder) {
this.folder = folder;
}
private void executeCheckForIdleDisable() throws InterruptedException, MessagingException {
Thread.sleep(MAIL_CHECK_IDLE_TIME);
int count = folder.getMessageCount();
}
public void terminateRealTimeCheck() {
isRunnable = false;
}
@Override
public void run() {
boolean idleIsAvailable = true;
while (isRunnable) {
// IMAPFolder のインスタンスで isIdleEnable が true の時実行
if (folder instanceof IMAPFolder) {
IMAPFolder ifolder = (IMAPFolder) folder;
if (idleIsAvailable) {
try {
ifolder.idle();
} catch (javax.mail.FolderClosedException fce) {
logger.log(Level.SEVERE, "IMAP Folder closed:", fce);
isRunnable = false;
} catch (MessagingException ex) {
if (ex.getMessage().contains("IDLE not supported")) {
idleIsAvailable = false;
} else {
logger.log(Level.SEVERE, "IMAP Folder & Something error occured;", ex);
isRunnable = false;
}
}
} else {
try {
executeCheckForIdleDisable();
} catch (InterruptedException | MessagingException ime) {
logger.log(Level.SEVERE, "Some error occured on executeCheckForIdleDisable() : ", ime);
isRunnable = false;
}
}
} else {
logger.log(Level.SEVERE, "THis is not IMAP Folder.");
isRunnable = false;
}
}
}
*/
}
最後に、JavaMail の Message から JSON の文字列を生成するエンコーダを作成します。このエンコーダを作成する事で、Message オブジェクトから、JSON に変換してクライアント・エンドポイントに対してメッセージを送信できるようになります。ここでは、Java EE 7 の標準に含まれる JSON-P を使用して実装しています。
session.getBasicRemote().sendObject(msg);
package jp.co.oracle.samples.websockets;
import java.io.IOException;
import java.io.StringWriter;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.json.Json;
import javax.json.JsonArrayBuilder;
import javax.json.JsonObject;
import javax.json.JsonWriter;
import javax.mail.Address;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.internet.InternetAddress;
import javax.websocket.EncodeException;
import javax.websocket.Encoder;
import javax.websocket.EndpointConfig;
import jp.co.oracle.samples.msgutil.MessageDumpUtil;
/**
*
* @author Yoshio Terada
*/
public class MessageEncoder implements Encoder.Text<Message> {
private final static int SUMMARY_SIZE = 80;
private static final Logger logger = Logger.getLogger(MessageEncoder.class.getPackage().getName());
@Override
public String encode(Message msg) throws EncodeException {
try {
// Address[] から JSon 配列を作成
Address[] addresses = msg.getFrom();
JsonArrayBuilder array = Json.createArrayBuilder();
for (Address adres : addresses) {
InternetAddress iAddress = (InternetAddress) adres;
array.add(iAddress.toUnicodeString());
}
// メッセージ・サマリを取得・作成
MessageDumpUtil dumpUtil = new MessageDumpUtil();
String msgSummary = dumpUtil.getText(msg);
if (!msgSummary.isEmpty() && msgSummary.length() > SUMMARY_SIZE) {
String tmp = msgSummary.replaceAll("(\r|\n)", "");
msgSummary = tmp.substring(0, SUMMARY_SIZE);
msgSummary = msgSummary + " ......";
}
//JSon オブジェクトを生成
JsonObject model = Json.createObjectBuilder()
.add("subject", msg.getSubject())
.add("address", array)
.add("summary", msgSummary)
.build();
//JSon オブジェクトから JSon 文字列を生成
StringWriter stWriter = new StringWriter();
try (JsonWriter jsonWriter = Json.createWriter(stWriter)) {
jsonWriter.writeObject(model);
}
return stWriter.toString();
} catch (MessagingException | IOException ex) {
EncodeException ee = new EncodeException(msg, "Encode failed ", ex);
logger.log(Level.SEVERE, null, ex);
throw ee;
}
}
@Override
public void init(EndpointConfig config) {
}
@Override
public void destroy() {
}
}
上記のようにして、IMAP サーバの受信箱(INBOX)に新着メッセージが来た時点で通知を行う事ができます。しかし、このようなアプリケーションを一般公開する大規模なサービスとして実装すべきではありません。元々、WebSocket をサポートするサーバ・エンジンは大量のアクセスに対し少ないスレッドで処理を行うように、NIO で実装されている事が多いかと想定します。
GlassFish (Grizzly) の場合:
Grizzlyの概要 : C10K問題に対応するGlassFish(Grizzly)
Grizzlyの概要 2 : Java New I/Oで実装されたサーバその他、Jetty でも古くからNIOに対応しています。
今回作成した私の WebSocket で通知するアプリは、監視を行うために、新しく1つのスレッドを作成し、スレッド内で変更を監視するように実装しています。つまり、IMAP の受信箱(INBOX) の監視を行うために、ユーザ毎に新しくスレッドを生成しています。監視を行う為に別のスレッドを起こして無限ループ内で特定のイベントを監視するプログラムはよくあるかと想定しますが、そのようなアプリケーションに WebSocket は向きません。仮に ManagedExecutorService に変更し、コネクション・プールを使用しても問題は同じです。スレッド・プール数の最大までスレッドが生成されると終了です。
せっかく、サーバ・エンジンが NIO で実装して大量のアクセスに対して、少数のスレッドで処理を裁くことができるように実装されていても、個々のユーザ、もしくはリクエスト毎に、アプリケーション側でスレッドを生成すると、アプリケーション・レベルでC10K 問題が発生します。具体的には、100 人サーバに接続してきた場合に、100 スレッドが生成され、1000 人接続してきた場合、1000 スレッドが必要になります。
アクセス数が限られる環境では、こうした実装もありかもしれませんが、大規模に展開するサービスでは、リアルタイムで何らかの監視を行うために、個々にスレッドを生成するような実装はやめた方がよいと思います。WebSocket はリアルタイム監視などにもでき、簡単に実装できますと私も説明をしていますが、サーバ側の実装は十分にご検討頂いた後、作成してください。
追記:2014 年 5 月 9 日
上記の実装後、Java Mail のスペックリードに上記を解決するために、NIO を使って実装できる API を新たに作成して欲しい旨要望を出しておりました。その結果、Java Mail 1.5.2 より実験的に、IdleManager クラスが導入されました。これにより上記で実装した idle() メソッドの代わりに IdleManager で実装する事で、多くのスレッドを生成しなくてもよくなりサーバ側での C10K 問題を解決できます。詳しくは下記 IdleManager の API とそこに記載されているサンプルをご覧ください。
https://javamail.java.net/nonav/docs/api/com/sun/mail/imap/IdleManager.html
実際には微調整が必要ですが下記のような実装になります。
@Resource
ManagedExecutorService es;
private void checkNewMessage(final javax.websocket.Session session) throws MessagingException, IOException {
Properties props = session.getProperties();
props.put("mail.event.scope", "session"); // or "application"
props.put("mail.event.executor", es);
//javax.mail.Session
Session mailSession = Session.getInstance(props, null);
// シングルトン EJB より IdleManager を取得
final IdleManager idleManager =
imapIdleManager.getSingleIdleManager(mailSession, es);
//final IdleManager idleManager = new IdleManager(mailSession, es);
// IMAP Server へ接続
javax.mail.Store initStore = mailSession.getStore("imaps");
initStore.connect("imap-server.yoshio3.com", "USERNAME", "PASSWORD");
Folder folder = store.getFolder("INBOX");
folder.open(Folder.READ_WRITE);
folder.addMessageCountListener(new MessageCountAdapter() {
public void messagesAdded(MessageCountEvent ev) {
Folder folder = (Folder)ev.getSource();
Message[] msgs = ev.getMessages();
System.out.println("Folder: " + folder +
" got " + msgs.length + " new messages");
// process new messages
idleManager.watch(folder); // keep watching for new messages
}
});
idleManager.watch(folder);
}
※ JJUG CCC の HoL で実施した WebSocket のハンズオンは、JMS を使用して単一のMDB でキューやトピックを監視しメッセージ配信を行っているため、上記のような問題はありません。
たかがレルムされどレルム GlassFish で始める詳細 JDBC レルム
この記事は「 GlassFish Advent Calendar 2013」 の10日目として新たに書き下ろしたものです。昨日は蓮沼さんによる「GlassFish付属のJava DBについて」でした。
幸運にも、昨日 12/09 に蓮沼さんが GlassFish に付属している Java DB について詳しくご紹介してくださったので、今日はその流れ?!というわけではありませんが、GlassFish に付属の Java DB(他のDBにも利用できます) を使用して、Java EE 標準の認証・認可方法をご紹介します。
Realm (レルム) は古くから Java 標準の認証・認可を行なうための機能として多くの環境で利用されてきましたが、やや環境構築や設定が大変という事もあって、レルムを使用せず独自の認証システムを構築される事もいらっしゃるようです。しかし、Java EE コンテナが提供する認証・認可機能を正しく理解し設定やプログラミングを行なえば、より安全で柔軟なプログラムを簡単に実現できるようになります。
また、この認証・認可の機能は Java EE に含まれるフレーム・ワーク全体に対して適用が可能なため、今回の資料では動作確認に JavaServer Faces を利用してを行ないますが、JSFに限らず、JAX-RS でも EJB でも、その他のフレームワークでも全ての Java EE フレームワークに適用できますのでとても重要です。
非常に古くからある機能のため、既にご存知の方やご適用頂いている方も多いかと思いますが、「たかがレルムされどレルム」で Java EE の中でも重要な概念の一つと考えています。最近、Java EE を始めた方や、これから Java EE を始める方に、本ブログ・エントリが有用な情報になれば誠に幸いです。Web アプリケーションに対してどこからどのように認証・認可などの設定を進めればよいか分からない方はどうぞご覧ください。
本ブログエントリは、環境構築手順をできるだけ詳細にご紹介し、これさえ見れば JDBC レルムの環境構築がある程度できるという資料になるようにエントリを書いてみました。当初はブログのエントリ中に JDBC レルムに関する説明を書こうと考えましたが、非常に長い内容になりましたので、途中でブログで記載するのはあきらめ PDF で資料を作りなおしました。PDF であればダウンロードしプリント・アウトした後にゆっくりご確認頂けるので、よりよいかと想定しています。是非、本資料を有効活用をして頂ければ幸いです。
限られた時間の中で急ピッチで作成しましたので、手順を端折って実装した所もあります(例えばユーザ登録、削除の確認画面など)。しかし、全体的な設定手順や実装方法の概要は掴めるかと思いますので、ご参考ください。
本資料でご紹介したコードは下記にアップしております。コードだけを参照されたい場合は、下記へアクセスしてください。
https://github.com/yoshioterada/JDBC-Realm-Sample
※ 下記に公開する PDF 資料中のプロジェクト名、パッケージ名は適切ではありません。プロジェクト名、パッケージ名等は適宜ご修正ください。元々、次のブログ・エントリで記載する内容とマージして一つの資料としてまとめたかったのですが、時間の関係上とボリュームの関係で、本 PDF には JDBC レルムの部分までしか記載できませんでした。
そこで、JDBC Realm のハンズオン・ラボの資料としてはプロジェクト名、パッケージ名などが適切ではない名前が記載されています。上記 GitHub ではプロジェクト名、パッケージ名をリファクタリングした後のコードをアップしておりますので、併せてご参照ください。
最後に、認証や認可用の設定やコードを行なうと、jUnit 等のテスト連携が困難になると予想される方もいらっしゃるかもしれません。
EJB を実装されている場合には jUnit 等の単体テストで、組み込み可能 EJB コンテナを利用できます。
この組み込み可能な EJB コンテナで認証・認可まで含めたテストケースを実施したい場合、GlassFish では下記のクラスを利用する事で、EJB プログラムに対するログイン認証・認可の権限チェックを行なうことができるようになります。
GlassFish v3.x の場合:
$GLASSFISH_HOME\glassfish\modules
com.sun.appserv.security.ProgrammaticLogin
GlassFish v4.0 の場合 (パッケージ名が代わりました。)
$GLASSFISH_HOME\glassfish\modules\security-ee.jar
com.sun.enterprise.security.ee.auth.login.ProgrammaticLogin
例えば、jUnit のコード中で下記のようなコードを書く事ができます。
char[] passwd = “password”.toCharArray();
ProgrammaticLogin progLogin = new ProgrammaticLogin();
progLogin.login(“admin”, passwd , “jdbc-realm”, true);
最後に、今回は DBを使用しましたが、LDAPでも、SSO を実現するような製品群でもレルムは利用可能です。また少ない設定変更でレルムの切り替えももできますので、是非レルムをご理解いただきご利用ください。
Java EE and GlassFish Server Roadmap Updateについて
本日、The Aquariumで Java EE と GlassFishの今後のロードマップが発表されました。
この中で GlassFish は Java EE 5 より Java EE の参照実装として提供されており、今年の Java EE 7 のローンチ・イベントにおきましても GlassFish v4.0 を Java EE 7 の参照実装として提供した事を報告しています。また、次期 Java EE につきましても検討を始めた所です。GlassFish はこの Java EE の参照実装という位置づけにおいて今後も開発を進めてまいります。
一方で、GlassFish v4 以降の商用サポートを終了する発表もなされました。ここでご注意頂きたいのは、GlassFish という製品自身や OSS のプロジェクトがなくなるわけでは決してありません。
(※ また、GlassFish v3.1.x 系のサポートは Extended Support まで含めると 2019/03 まで継続提供されます。)
(補足:GlassFish v4.0 用は OSS 版のみが提供されており商用サポート製品 Oracle GlassFish Server は提供されていませんでした。)
GlassFish は今後も Java EE の参照実装 OSSプロダクトとして残りますし、定期的に 修正:必要に応じて バグ FIXなどのアップデートも提供予定です。実際 GlassFish v4.1を来年リリースする予定で動いております。
また、今後も Java EE の参照実装として提供されるのは GlassFish で、Java EE の最新機能をいち早くお試しいただけるのも GlassFish です。
商用サポートの観点で、GlassFishは今後商用サポートの提供は行われず、WebLogic 側で提供します。サポートの観点で、契約を結んでいただいたお客様に対して提供していた製品個別のお問い合わせや、パッチの提供は GlassFish v4.0 移行 以降 行いませんが、OSSとしてバグ登録パッチ提供等は今後もできます。
またテクニカルの面ではJava EE準拠アプリケーションの場合、WebLogicとGlassFishは配備記述子レベルで互換性を持たせるよう実装していますので、WebLogicへの移行は容易です。GlassFishで開発、テストを実施しWebLogicへ配備といった事も可能になります。
つまり、無償で利用可能な OSS Tomcat の代わりに OSS版 GlassFish を使用していた方には殆ど影響は無いと想定しますし、今後も Tomcat に対し Java EE の参照実装として優位点、機能的優位点は代わりません。
OSS版GlassFishを商用サポートがあるから、将来に備え無償でご利用されてきた方は、開発時、テスト時は GlassFishをご利用いただき、商用サポートが必要になった時点で WebLogic などをご検討いただければ誠に幸いです。
既存のお客様でライセンス契約を締結いただき、大規模に展開していただいているお客様におかれましては、弊社営業より個別にご訪問、ご説明をさせていただく事になるかと想定します。その際、ライセンス・マイグレーションなどもご説明させていただく事になるかと想定します。
最後に、少なくとも私は今後も、Java EE 関連のセミナーにおいて、デモの実行環境として、もしくはJava EE の機能説明に参照実装としての GlassFishを使用しますし、それを止めなさいとはオラクル本社から一切言われておりませんし、その位置づけは変わっておりません。Java EEの参照実装であり、OSS製品としての GlassFish は今後も啓蒙活動で使用してまいります。
Java EEの参照実装としての GlassFish を今後もどうぞ宜しくお願いします。
Java EE 7 HoL on JJUG CCC
2013 年 11 月 9 日に JJUG CCC 2013 Fall がベルサール西新宿で開催されますが、13:15 – 15:05 まで「R5-1 Java EEハンズオン」を実施します。今日はそのハンズオンで実施する内容についてご紹介します。
2013年11月 11日追記:JJUG CCC で実施したハンズオンの資料を下記に公開しました。また、本プロジェクトの全ソースコードは下記より参照できます。
https://github.com/yoshioterada/JavaEE7-HoL/
HoL の資料は Step by Step で記載したためページ数が多いですが、実装コード量はとても少ないです。
本 HoL では Java EE 7 に含まれる技術だけを使ってリアルタイムの情報配信をするアプリケーションを作成します。WebSocket のサンプルというとチャットのようなアプリケーションは数多くありますが、WebSocket はアイディア次第でとてもおもしろい物を作れるだけでなく、実際にビジネスで即使えるような物も作れます。
ただ、WebSocket を本番環境で大規模に扱うためには負荷も考慮しなければなりません。基本的には Java EE 7 に準拠したアプリケーション・サーバ1台で WebSocket アプリケーションを動作させた場合、そのサーバに接続するクライアントにのみしか状況発信、共有などができないため、おのずと接続数に限界が生じます。実際には接続数ではなく、情報配信の部分がボトルネックとなり接続数を制限せざるおえない状況になるでしょう。
それでは、単純に台数を増やしてクラスタ構成を組めば良いと考えるかもしれませんがそんなに簡単にはいきません。なぜならば JSR-356 の WebSocket ではサーバ・エンドポイントに接続するクライアントの管理は自身でする事になっており、インスタンスをまたいで接続しているクライアントの情報を管理するのはとても大変だからです。
例えば、Collection に WebSocket のクライアント・エンドポイントの情報(全クライアント情報)を入れたとして、その情報をインスタンス間で交換するのはデータ量も多くナンセンスです。また、ある一つのインスタンスで受信したメッセージを他の全インスタンスに共有させるのも、インスタンスの増加の度にコードを修正しなければならなくなるので現実的ではありません。
そこでこうした WebSocket のクラスタリングを実現するために、外部のメッセージ・プロバイダ(MQ 関連製品)を使用します。メッセージ・プロバイダにメッセージをキューイングし、アプリケーション・サーバの各インスタンスがキューを監視していれば、キューにデータが入ってきた時点でそのメッセージを取り出し処理をする事ができます。
実際には、内部的には JMS の Publish-Subscriber を利用しています。Web アプリケーションで1人が JMS のトピックに対して配信したメッセージを、各インスタンス上で稼働する MDB が同一トピックをサブスクライブしており、メッセージが入ってきた事を検知した後、全 WebSocket クライアント・エンドポイントに対してメッセージを配信を行います。
また、Web アプリケーションと WebSocket 側の実装パッケージをを分ける事によって、上記の概念図に示すように、よりセキュアに情報発信側と受信側を分けて運用する事もできるようになります。だれでもが WebSocket サーバに接続する全クライアントに情報配信ができようなシステムは危険ですよね。
そこで、今回は上記のような概念図を念頭に、簡単なアプリケーションを構築し、GlassFish のクラスタリング構成を作成します。実際にクラスタ環境で WebSocket を動かしている動画を下記に示します。
※ 今回は Load Balancer や Firewall の部分は対象範囲外とします。
最後に、
今回のハンズオンは少し応用するだけで、スポーツ・ニュースの配信サイトで行われているようなリアルタイムの試合経過速報等をとても簡単にさらに効率良く提供する事ができるようになります。またそれ以外にもお客様にリアルタイムの情報をいち早くお届けしたいニーズがあればすぐにご利用いただけるでしょう。
今回このようなアプリケーションを作成する HoL を実施しますので楽しみにしておいてください。
また HoL を元に大規模 WebSocket リアルタイム情報配信を是非ご検討ください。
HoL で必要なのは事前準備としては JDK 7 u45 以降のインストールと NetBeans 7.4 (GlassFish バンドル版)以降のインストールをしていただくだけです。それ以外は一切必要ございません。
それぞれ、下記より御入手ください。
※ Java SE 8 の HoL も両方参加される方は JDK 7,8 共にインストールが必要ですが、本 HoL では JDK 7 を使用して行います。
● http://www.oracle.com/technetwork/java/javase/downloads/index.html
● https://netbeans.org/downloads/index.html
(Java EE : 203 MB版 もしくは、すべて : 220 MB 版)
※ さて、これから説明、配布用の資料を作成しよう。(^_^;)
2013年11月 11日追記:JJUG CCC で実施したハンズオンの資料を下記に公開しました。
JavaOne 2013 Report & Java EE 7 & Avatar & Java Puzzlers
2013年 10 月 15 日(火) にJava Festa in 札幌 2013 が開催されました。今日は、JavaFesta で発表した3つのセッションの資料を下記に公開します。
世界が注目する Java EE 7 の最新動向(Project Avatarの情報も含む)
PS.
JavaFesta は今年で10回目となるそうですが、今年を持って JavaFesta という名前のイベントは終了するとの事でした。元 Sun のメンバーとして、Sun の頃から非常に多くの先輩や同僚がこの札幌の地で発表されてきて、私もこの場に2度程立たせていただきましたが、それをとても光栄に思っております。Java という名前のつくイベントが一つ無くなってしまう事を少し寂しくも思いますが、事務局の皆様のご意向を伺いとても納得できるものでした。札幌 IT の今後のさらなる繁栄、そして札幌の地から日本全国、世界に対して情報発信をしていきたいという思いから Java だけではなくそれをとりまく IT 技術全般のノウハウが必要で、そうした取り組みをしていきたいという事、そして名前を変えて新たなステージに立ちたいという思想はとても素晴らしい事だと思います。
JavaFesta 事務局の皆様、最後の JavaFesta に朝から夕方まで Java のセッションをご用意して頂きまして誠にありがとうございました。
そして、10年間本当にお疲れ様でした。
JavaOne ストラテジー・キーノートのまとめ
まとめ:
今年の、JavaOne のテーマは昨年に引き続き、「MAKE THE FUTURE JAVA」でしたが、今年の JavaOne のもう一つのテーマは「Internet Of Things」ではないかと思います。昨今 Java というと、エンタープライズでの適用が多いかと想定しますが、Java はエンタープライズ用途だけではなく、幅広くインターネットに接続する全てのデバイスに Java を適用できる、そのような時代がやってくるのではないかと思わせるような基調講演でした。Java EE 7 は今年の 6 月に正式リリースし次の Java EE 8 のリリースに向けて準備をまさに始めた所です。そして、来年の春にリリース予定の Java SE 8 についても機能 FIX し、興味のある開発者はいますぐ、お試し版を利用できるようになっています。しかし、Java SE や Java EE のようなプラットフォームだけではなく、今組み込みデバイス用の Java にも大きな変化が生まれようとしています。今年の JavaOne では、Internet Of Things (組み込みのデバイス) に向けての Java の取り組みを大きく紹介した内容となっていました。今まで組み込みというと、同じ Java の開発者でも敷居が高そうと思われた方もいらっしゃるかと思いますが、来年登場する Java SE 8 以降は、Java SE 8 のノウハウを使い、Raspberry PI や Lego Mindstorm なども制御できるようになります。こうした取り組みは大学・研究機関で色々な研究用途で使用して頂きたいですし、さらに製造業などでも是非実用化を目指していただきたいと思っております。

今年で JavaOne は Sun の頃から数え通算 18 回目の開催となります。また、4年ぶりに JavaOne がモスコーン・センターに帰ってきました。今年の JavaOne は Oracle の Java プロダクト・マネージメントのバイス・プレジデントPeter Utzschneiderが取りまとめました。

Peter は冒頭で、今年は、昨年の JavaOne よりもイベント規模を大きくし、そして昨年よりも良いイベントにしたいと考えていると語りました。実際、今年の JavaOne には世界 92 カ国から参加頂いています。JavaOne は開発者による、開発者のためのイベントで 5 日間で 400 以上のテクニカルセッションが提供されます。このプログラムを決定するにあたって、コンテンツの選定委員は量や質を十分に検討し、選定は非常に難航した事もつげました。

また、今年は単にセッションを行うだけではなく、より多くのコミュニティの活動を行います。例えば、展示会場で開催される、Codegarten に参加してください、そこではご自身の Java のコードの改善方法についてエキスパートが教えてくれます。また、スケジュールを確認し都合が合えば Raspberry Pi チャレンジにも参加してみてくださいと語りました。

まず、Peter は昨年と同様、Java に関する進捗のアップデートを行いました。コミュニティにおいては、OpenJDK コミュニティの参加者が1年間で10%増加し、また、Java の開発者によって新しい Java ユーザグループも作成され Java のコミュニティが世界中で広がってきました。テクノロジーの分野では、今年 Java EE 7 を正式にリリースする事ができました。オラクルの運営(Stewardship)においては、Java のエバンジェリストチームや、OTN の活動によって各種イベントや参加メンバーが増えてきています。また、コミュニティ・メンバーの協力やチームの活躍によって Java Magazine の発行も継続して行っています。
これらを通じ、今年は Java にとって良い1年だったと言えます。
* 9 Million Java Developers Worldwide
* #1 Choice for Developers
* #1 Development Platform
* 3 Billion Mobile Phones Run Java
* 100 Percent of Blu-ray Disc Players Ship with Java
* 97 Percent of Enterprise Desktops Run Java
* 5 Billion Java Cards in Use
* 7 Billion Java Cards Sold
* 89% of desktops run java
* 125 million TV devices run java
* 5 of top 5 OEMs ship java

我々にとって重要な事は未だ、世界の中で Java は No.1 の開発プラットフォームである事です。Java は巨大なコミュニティを形成しており、Java をベースとして持つ開発者も多数います。そして、巨大なインフラストラクチャや、インターネット・デバイスもまた Java で稼働しています。
今日のキーノートで皆様に提供する内容は、将来を築きあげていくための信じられないほど多くの基礎知識を提供します。今年の JavaOne のテーマは昨年と同様、将来の Java を築き(Make The Future Java)上げる事ですが、それらの内容を今日ここでご覧頂くことができます。
我々は、Make The Future Java について今一度考えなければなりません。昨年を振り返ってみると、我々はやり残した作業があり、それらに対応していく必要があります。今、IT 業界は、非常に多くの技術革命や、非常に大きな変革を迎えています。そしてそれらは多くの課題が存在し、それらを解決する事が今後大きな機会を得る事になります。それを、皆様と一緒に解決していきたいと考えています。
我々自身は、Java をより良く、さらに強く、より堅牢に、そして今後 10 年間の使われ続けるプラットフォームとして適切に築きあげる事です。

インターネットにおいて、毎月、毎週、毎日、毎時間、1 分間でモバイルとソーシャルを組み合わせると、信じられないほど大量のデータが作成されています。人々はそれを共有したり作ったり、そのための新しいサービスや新しいアプリケーションを作成しています。これらを実現するためには大量のインフラが必要になりますが、多くが Java プラットフォーム上で稼働しています。そして、多くの人々は今これらのインフラを電気や水のような通常インフラと同様に扱っています。また、皆様は日々、信じられないほどのデータ取り扱っています。
過去データを扱うためには、リアルタイム性、フィルタリング、ファイルの大小などを検討し取り扱っていましたが、今全く新しいパラダイムが利用できるようになっています。例えば BigData や FastData なども利用できます。また、BI(Business Intelligence)や解析を通じて全てをバックアップできます。
また、データの配置場所、データ自身の寿命等も考えなければなりません。
データ自身が生命の源となり、開発者はそれらのデータを活用して革新的な新しいアプリケーションを構築できるようになります。

また、これらにモバイルやソーシャルを組み合わせて操作すると新たな事も発生します。
見積もりは色々とありますが、デバイスが今後数年間で、インターネットに接続するデバイス数は、100億〜500億と見積もられています。10 億としてもとても巨大な数です。そしてこれらのデバイスの多くは組み込み分野に存在し、ムーアの法則に従い、より安価になりますが、一方でパワフルになってきます、そして最も重要な事はインターネットに接続できる事です。これが IoT(Internet Of Things)なのです。
今まさに、業界全体が大きな変革が行われおり、Java の開発者にとって大きな変化がおき、大きなコミュニティが形成されようとしています。
我々が現在使用する全てのモバイルデバイスは、相互に接続する事ができリモートから制御もできます。ます。そして将来的には、我々が住む物理的な世界(家電製品や様々な物理的な物)をインターラクティブに制御できるようになるでしょう。
また、クラウドベースでの開発へ本格的にシフトし始めました。
数年前はどのクラウド環境で動作させるのかを議論していました。要求・要望に対する選択、インフラを気にせずに簡単にプロビジョニングできるか否か、アプリケーション開発に集中できるか否かを検討すると当然の事に思えます。また、クラウドベースへ移行する際に、セキュリティや、どのようにしてコンテナ・ベースから、サービス・ベースに移行できるか、それぞれ再度考えなければなりません。また、移植性も考えなければなりません。どのようにしてアプリケーションを物理的なサーバからクラウド環境へ移行するのか。また異なるクラウド環境への移植が可能かどうかも検討しなければなりません。
まとめると、今、IT 業界は信じられないほどの大きな変革が必要になってきます。2013 年の JavaOne では我々の業界を取り巻く変革についてご紹介します。
3年前のオラクルの Stewardship において、Java SE 7/EE 7 に関するメジャーなアップデートの発表を行いました。そして、Java を前進させる事(Moving Java Forward)を発表しました。この中で、IT 業界をとりまく世界では、dizzying(めまいがするような)変化がおきています。我々オラクルは Java の開発者が将来にわたって適用できる技術を身につけるために必要な事を提供しますと強調した。この作業に関して、どうぞご一緒に参加してください。
ここで、今年の JavaOne の最初のデモをご紹介します。皆様は恐らく気付いていないと思いますが、皆様ご自身がこのデモに参加しています。


ここに表示される図は、この会場にお集り頂いている皆様で、パートナー企業の一社である日立コンサルティング・ユーロテック(Hitachi Consulting and Eurotech)が作成したデモですが、モスコーンの会場入り口のドアにセンサーがつけてあり、通過する人を記録しています。そして参加者皆様の来場状況を示すデモです。このデモは、人間か犬かを判別し、入場か退場かも判別します。そして、これはゲートウェイ上で稼働する Java SE ベースのアプリケーションで作成されています。
計算が完了した後、そのデータはクラウド上でアップロードされ、分析と BI(Business Intelligence)アプリケーションを起動し、集計結果を Java ベースのアプリケーションで表示しています。このデモの重要なポイントはいくつかありますが、既存の Java の構成部品を利用し、洗練されたデモを作成する事ができ、また異なる技術を組み合わせ、全ての小型のデバイスからクラウドベースにオープンスタンダードの技術だけを利用してできるという事です。
このデモは、ほんの数週間で実装され、まさに Java の素晴らしさを証明するデモになりました。

ここで、Peter から Nandini Ramani, Vice President of Engineering, Java Client
and Embedded Platforms を壇上に迎え入れました。Nandini はまず、世界における Java 適用状況を歴史を振り返り紹介しました。Java は様々な範囲のデバイスで動作します。以前はそれぞれのデバイス用に特化し、カスタマイズした Java VM の実装を行ってきました。そして、Java はそれぞれの分野において成功してきました。しかし、それぞれの実装は分岐していき年を重ねる毎にどんどん独立して動作するようになっていきました。我々はプラットフォームの視点で考えると、統一されたプラットフォームがとても重要と考えています。

統一プラットフォームは、API と言語仕様の視点で考えなければなりません。Java SE 7 を見てみると3つの実装(CLDC, CDC, Java SE)が存在します。それらは、Java 構文の観点では共通事項がありますが、多くの部分で様々な違いが存在します。CDC、CLDC の存在はプラットフォームとしてはは正しいと考えています。また、言語の視点では、CLDC は今なお Java 1.3 の言語仕様で、CDC は Java 1.4.2 をベースにしています。つまり Java ME は Java SE がバージョン 5, 6, 7 で得てきたような進化や革命に追随できていませんでした。そこで、将来我々は、Java ME と Java SE の統一したプラットフォームを提供する予定で考えています。実際に統一プラットフォームを構築するためには、非常に多くの事を実施しなければなりません。そこで、まず我々は Java SE 8 で CDC の置き換えとなるコンパクト・プロファイルを提供します。

また、API の観点では、Java ME 8 で、NIO, 新しいコレクションのようなライブラリを利用できるようにします。言語の観点では Java ME 8 から、皆様になじみのある構文(アノテーション、ジェネリクス、string in switchのような構文)を使用できるようにします。
つまり、Java MEと Java SE を API と言語の視点で共通部分を増やしていき、複雑な実装の部分を抽象化し、簡単に開発ができる点にフォーカスします。これによって開発者は、ご自身のスキルセットをJava ME, Java SE といったプラットフォームによる区別をなくし、1人の Java 開発者が組み込みからデスクトップまで同じノウハウで共有できるようになります。

組み込み分野における上位レイヤについて紹介します。現在、ARM, freescale, QUALCOMM, Rasbery PI, gemalto, ST など、チップセット提供企業と共にに作業をしています。組み込み分野では、現在開発は断片的です。なぜなら非常に多くのベンダーが存在し、非常に多くのチップセットが存在し、またそれらは、それぞれ別の OS やデバイス・ドライバを使用しています。つまり全てのデバイスを同じように稼働させる事は困難である事を皆知っています。だからそれぞれに特化し開発が必要で断片的になります。一方で、それらのベンダーの多くは、Internet Of Thing を実現する為には、オープン・スタンダードな標準のプラットフォームが必要と考えています。そこで、市場に投入するために Java が合理的な選択肢になっているのです。ARM, freescale, QUALCOMM 等は今年の JavaOne でスポンサー企業として名を連ねていますが、freescale に関しては最終日のコミュニティ・キーノートの基調講演で発表してくれます。そこで何故 Java がそれらの IoT デバイスにとって意味があるのかが語られるでしょう。また、皆様は、デモ・展示会場に是非お越しください。そこで彼らが何をしているのかを是非尋ねてみてください。その時に何故、こうした事に意味があるのかが理解できるでしょう。今年の、Java ME 3.2.0 のリリース以降、ME プラットフォームのポーティングが行われています。Java SE Embedded 同様 Java ME も Rasbery PI のような大きなプラットフォームで利用できます。また、いくつかのパートナーで SDK をリリースして、とても簡単に入手、利用ができるようになっています。これには全ての Java Development Kit が含まれます。

ここで、Nandini は gemalto のワイヤレス・モジュールを観客に見せ、gemalto は Java ME を大々的にサポートしている事を紹介しました。我々は、様々なチップセット用、様々なプラットフォーム用に、積極的に Java ME のリリースを行っています。また、それを実現するために、今年の 8月に Oracle Java Platform Integrator Program を正式リリースしました。このプログラムでは基本的に2つの内容をパートナーに対して提供します。一つ目は、現在まだ、サポートをしていないプラットフォームに対して、簡単に Java SE Embedded をポーティングをできるようにする事です。2つ目は、ご自身のライブラリを使って、例えば、ヘルスケアや、製造、スマートフォン、ファクトリ・オートメーションなど市場のニーズに応えるために、プラットフォームを拡張できる機会を与える事です。
エコシステムを包容(Embrace)し、パートナーにとって必要な機能を、パートナー自身で実装できるような仕組みを提供します。これは大きな一歩です。
コミュニティからのフィードバックは如何ですか?我々は、Java エバンジェリスト・チームを通じてたくさんのコミュニティに対する支援活動を行っており、彼らを通じてたくさんの、積極的なフィードバックを得ています。

ここで、Nandini はサンディエゴで開催されたQualcomm Uplinq conference の Uplinq ハッカソンで最優秀賞を受賞した APX ラボの Andrew Sugaya 氏を壇上に招き入れました。通常、JavaOne の基調講演に招く方は何ヶ月もかけて調整をしますが、Andrew とは数日間をかけて登壇して頂く事を調整しました。それほど Andrew が実装した内容は素晴らしいものでした。

APX ラボではヘッドフォンやワイヤレス・デバイスを作成しています。Qualcomm の Uplinq conferenceでは朝 10:00に開場に集まって朝食をとりイベントを開始します。このハッカソンには4つのカテゴリが存在していて、私は、”Connected to Home experience” のカテゴリに参加しました。それは、まさに Internet of Things を表すカテゴリでした。最初に黒い箱を手に入れました。それは開発プラットフォームとして全ての機能が含まれるものでしたが、その黒い箱はとても強力で、その使い方について最初は理解ができませんでした。幸運にも、私は実装において Java ME を選択し約 7 時間で実装することができました。最初に、部屋の温度データを取得し、そのデータをクラウド上のサーバ側に送信します、サーバ側でデータの解析をし、家の電球の色を変更しるような物を作成しました。彼は言いました。今回は電球を使用しましたが、今や何でもできます、トースターでも、ビールのジョッキ、今座っている椅子でさえ将来的にはつながるのです。

彼は、それまで Java での開発を経験した事はありましたが、 Java ME を使用した経験はありませんでした。しかしJava ME を使うととても簡単に実装できることを理解し、Java ME を選択しました。
ご参考:
http://www.apx-labs.com/company/press/andrew-wins-hackathon/

我々は、プラットフォームの統合、エコシステム、Andrew の経験などについて語ってきました。我々は重要な事を伝えなければなりません、来年の春には Java SE 8 がリリースされますが、Java SE 8 にはたくさんの機能が含まれています。重要な機能には、Lambda 式の対応やJavaScript エンジンの Nashornが重要です。Nashorn は、JSR 292: Supporting Dynamically Typed Languages on the JavaTM Platform を利用した物ですが、これらの詳細は、テクノロジー・キーノートでも紹介されるでしょう。そして、Java SE 8 の先の将来については、Java 9 で Project Jigsaw を導入し、モジュール化が可能なプラットフォームを提供する予定です。また、Java SE 9 以降になるかと思いますが、Java で GPU を制御する Project Sumatra 等も今 OpenJDK の元で開発をはじめています。これらにご興味がある場合、是非、OpenJDK にアクセスして、チェックアウトしてください。

最後にまとめますと、これからの Java は下記のようなロードマップで提供予定です。Java SE 8 のリリース時には Java ME 8 も同時にリリースをする予定です。テストプレビューがダウンロードできるようになっていますので、入手して試していただきフィードバックをください。
最後に、モスコーン・センターに帰ってきた事をとても喜んでいますと語って Nandini は壇上を去りました。

次に、Peter は Cameron Purdy, VP of Cloud Application for Oracle を壇上に招き入れました。Cameron にとって今年は、とてもお忙しい年だと思いますが、Java EE 7 の正式リリース大変おめでとうございます。2年前の JavaOne で私たちは Java EE 7 で何を含めるかを話しました。そして昨年は、Java EE 7 で含まれる機能について紹介しました。そして、今年ついに Java EE 7 をリリースできました。これも、パートナー、業界団体、コミュニティ、そして我々の開発チームの成果です、皆様に大変感謝しています。


ここで、Java EE 7 のメジャーなテーマについて今一度振り返って説明をしてください。最初に、私たちは Java EE 7 では Java の中でもエンタープライズの側面にフォーカスしています。今回、エンタープライズ・ニーズへの対応としてバッチ処理を含めています。また開発生産性の向上も実現しています。Java EE 7 ではとても開発がかんたんになる仕組みを取り入れています。例えば、CDI (Context Dependency Injection)ですが、Java EE 6 につづいて全ての Java EE のプラットフォームで利用できるように改善しています。これによって開発生産性の向上が多いに見込まれます。

また、Java EE 7 の中でもっとも重要なテーマとして HTML 5 のサポートがあげられます。実際とても素晴らしい技術が含まれています。WebSocket,RESTful のサポートなどがあげられます。これらは、通常の Web ベースのアプリケーション開発が可能です。

それでは、Java EE のアプリケーションが、現在のクラウド・ベースのアプリケーション開発への適用については如何でしょうか?
2年前の時点で Java EE 7 のメインテーマとしてクラウドを取り上げておりクラウド環境におけるアプリケーション開発に関する部分を盛り込む予定でした。タイミング的な問題から、Java EE 7 のテーマは HTML 5 対応に変更したわけですが、現在の Java EE 7 でも非常に多くの機能がクラウド環境で利用可能です。
まず、新しいセキュリティ・ロールがあげられますが、クラウドにおけるセキュリティを提供します。また DB などのデータソースの設定も簡単にできるようデフォルトのリソースが利用可能になっています。また標準で DB スキーマを生成する仕組みなども提供され、テーブル作成と同時に事前にデータを取り込む事もできます。
また、一つのアプリケーションから他のアプリケーションに対して RESTful Web サービスを通じて簡単に利用する事もできます。また、JSF では表面的なアプリケーションの開発が可能で、マルチテナントに対応したアプリケーションの開発も容易にできるようになっています。

既にあなた達は、将来的に含める機能について検討していると思いますが、その一部を共有していただけないでしょうか。
Java EE は Java EE 5 以降、Java EE 6, Java EE 7 とエンタープライズアプリケーションにおける簡単開発にフォーカスしてきました。そして、これらの技術間の関連性は今後も継続します。今実際に我々が検討している技術をいくつかあげるとするならば、JCache,JSON-Binding等があげられますが、EE 業界や、コミュニティ、パートナーから、素晴らしいサポートを頂いて、Java EE 業界が何をしているか関連性をたしかめながら検討していきます。

Java EE 7 のローンチの際は、非常に多くの方がイベントに参加し、動画を参照し、実際にダウンロードをしてくださいました。Java EE 7 のお披露目は成功をおさめることができました。

Java EE 7 の開発に並行して実施されていたと想定しますが、2年前の JavaOne で Cameron はもう一つのプロジェクトを紹介しましたが、その進捗について教えてください。2年前に Project Avatar というプロジェクトを発表しました。その時は、とても多くの情報が掲載されましたが、Avatar はいつ出てくるのか
質問をされる事もありました。Avatar の概要は次の通りです。

まず、単純な、HTML 5 対応の Java EE のアプリケーションを作成します。例えば Java EE 7 のWebSocketなどのプログラミングモデルです。次に、従来は、DB に対してリクエスト、レスポンス型の問い合わせを行っていました、もちろんそれも利用できますが、新たに、NoSQL データベースをサポートし、データベース側からライブ情報や変更通知等をアプリケーションに送るような実装もできるようになります。つまり、今までのリクエスト・レスポンス型のアプリケーションではなくイベントによる通知、検知などが行えるようになります。また、Avatar は Java SE 8 上で動作する JavaScript エンジンの Nashorn とも共同動作できるようになっています。Avatar 自身は Java EE コンテナ上で稼働し、既存のJava EE のアプリケーションに対して、Node.js の開発スタイル等を取り込んで、既存の Java EE アプリケーションを拡張できるようになっています。つまり Node.js のアプリケーションがアプリケーション・サーバ上で動作する事になるのです。

今年、ここでご紹介している内容は、プレ・アナウンスメントではなく、正式な公開情報です。本日、ただいまより、Project Avatar をオープン・ソース化し皆様に提供します。これは全く新しいオープンソースプロジェクトです。

Project Avatar のオープンソース化の発表後、Cameron は壇上を去りました。

Peter は最後に下記のようにまとめました。皆様は、いつも Java に関するテクノロジーの情報を探していらっしゃるかと思いますが、OTN の Java の Web サイトから情報を入手してください。また、それ以外にも Twitter, FaceBook などからも情報を入手できます。ぜひ、これらのサイトにアクセスして情報を得たり、またそれらに参加をしてください。

今日、Nandini や Cameron Purdy が話しをした内容をみた時、この業界に大きな変化がおこっている事がご理解いただけるでしょう。今日参加して頂いた事を心より感謝します。ファンタスタティックな週をお迎えください。

JavaOne 2013 コミュニティー・キーノートのまとめ
今年の Java コミュニティ・キーノートは、エンタープライズ環境で利用が多い現在の Java において、Java エコシステムは、エンタープライズの利用にとどまらず、幅広い分野で Java が利用されている事、利用できる事を学ぶ機会を開発者に与えました。
冒頭で、Senior Director, Product Management, Java Platform Groupの Donald Smith から過去の振り返りを行いました。2 年前の JavaOne では Moving forward Javaがテーマでした。その後、Java SE 7 が正式リリースし、我々は Java のエコシステムを再構築してきました。2012 年のテーマはイノベーションで、Java をコアな場所で採用する、例えば、クラウドや、BigData, IoT に対応させていく事でした。そこで鍵となるのがオープン・コミュニティでした。

今年は、過去の2回とは趣向を変え、さらにテーマを拡大させていきます。Java は過去ご紹介してきたような ISV(独立系ソフトウェア企業)の要望だけでなく、エンドユーザやアプリケーション開発者のニーズをかなえていきます。Java エコシステムにおいて、現在、様々な方が色々な分野で Java を適用しています。今年はそれら世界中の開発者が Java で実施している内容についてご紹介します。これによって、現在の Java エコスシステムを理解できます。
その前に、若干今年の JavaOne を振り返ります。ここでSenior Java Developer Community Manager (Twitter ID : @java) のTori Weldtが壇上に招かれました。Tori はOTN (Oracle Technology Network)を取りまとめていますが、OTN としてJavaOne に参加した事を誇りに思い、世界中にいらっしゃる、Java の開発者コミュニティを支援することを誇りに思っていますと語りました。また、Tori は今年の JavaOne で、テクニカル・セッション以外に実施されたイベントについていくつか紹介しました。

Toriはまず、始めにRaspberry Pi チャレンジについて紹介しました。これはRaspberry PI のハッキングを行うイベントで、参加した開発者はテクニカル・セッションの受講を欠席してまで参加された方々でしたが、参加した開発者は皆、参加した事に大変満足していたと報告しました。参加者はRaspberry PI について深い知識を持たなくても参加でき、エキスパートと共に協力してプロジェクトを作成していきました。期間中には7個のプロジェクトが完了しましたが、中にはとてもすばらしい物がいくつか作成されました。例えば、Google Glass のアプリケーションとして作成したアプリケーションは、Raspberry PI と心拍計と連動し、心拍計をつけた人の心拍数をリアルタイムでモニタリングし、Google Glass 上に表示するといった内容でした。

[Heart of Glass の動画]
また、モンスター・トラックの車に Raspberry PI を搭載したプロジェクトも、基調講演のまさに直前に完成したとの事でした。Raspberry PI を搭載したトラックは、クラウド上に情報を持たせる物で、完成品を MTaaS (Monster Truck As a Service)と命名しました。これは、直接トラックを操作するのではなく、iPhone の加速時計を利用し操作し、データを Amazon クラウドのデータ・サービスに保持されるという物でした。
このRaspberry PIチャレンジには、日本人技術者 (Twitter ID : @tomo_taka01 さん)も参加され、その内容がこちらのブログで公開されています。
Raspberry PI チャレンジの内容をご紹介した後、Donald Smithから3つの新しい発表を行いました。
● Raspberry PI OEM 契約の締結
オラクルは、Raspberry PI の OEM 契約の同意書にサインしました。これにより、Java SE が含まれるRaspberry PIのイメージを http://raspberrypi.org から入手可能となりました。今回の契約締結は世界中の何百万もの Raspberry PI の開発者にとってとても有益で、簡単に Raspberry PI上で Java が扱えるようになっています。

● ブラウザ上の Java バージョンのモニタリング・サービスの提供開始
この jcountdown.com で提供されるサービスは、Javaチャンピオンと、JUG リーダ、Adopt OpenJDK プログラムのジョイントプロジェクトで、ブラウザ上で利用されている Java のバージョン情報をトラッキングし最新バージョンへのアップグレードを支援するサービスです。エンドユーザがいつも常に最新の Java と、Javaテクノロジーを利用できるようにするためのサービスです。上記サイトには Java SE 7 へアップグレードするための 64 個の理由を記載したプレゼンテーション・コンテンツのリンクも記載されています。

OpenJDK コミュニティにモバイル決済企業が新しく参加
サンフランシスコに本社を構えるモバイル決済企業の Square 社が OpenJDK コミュニティに参加する事を発表しました。Square 社は、コミュニティと共に、Java 言語、JavaVMやコアライブラリの拡張に貢献する事を発表しました。低電力はとても重要ですが、特にSquare 社のCTO Bob Lee は、低電力で利用可能な暗号化技術の分野で貢献すると報告しました。

その他、OTN ラウンジで実施した Codegartenオープンソース・プロジェクトの内容も発表しました。これは既存のJava API に対して、参加したエンジニアが集まりその場で改善を施す内容です。例えば、JSR 354 の JodaタイムやMoney に対する改善、GEB を Arquillian に統合、JSON-B ライブラリのリリースの準備等をおこないました。

また、JavaOne の開催前に、JavaコミュニティによるJava コミュニティのテーマを決めるコンテストを実施しましたが、その優勝者とその内容も発表されました。コンテストの趣旨としてマニアックで面白いJava のスローガンを募集した内容で、Daniel Ellmerer さんが優勝し、JavaOne のフリー・パスをゲットしました。このコンテストは、ブラジルの SouJava, ロンドン LJC、iJUG によるオーガナイズで実施されました。

2013 Javaコミュニティのトップ5テーマ
- Java is the Community
- One Java to Rule Them All
- The World runs on Java Technology
- Java Collecting New Garbage since 1995
- Java: from the First Cup to the Last line of Code
これらの発表後、昔のJavaOne を彷彿させる Tシャツ投げのイベントがDonald より提案され、世界中の Java のキーマンや、Java Champion, James Gosling などが会場前方に集まりTシャツ投げを実施しました。そして何と私も急遽Tシャツ投げイベントに、投げる側の人間として加わらせて頂きました。(^_^;)

次に、Donald に代わってJava Platform グループ、Product management ,Vice President の Henrik Stahl が壇上に上がり、コミュニティ・キーノートを続けました。Henrik は壇上に上がるまではスーツでしたが、「Java はビジネスの場じゃないからスーツを脱がなければね!!」と観客に伝え、壇上でTシャツ姿となりキーノートを始めました。このHenrik の立ち振る舞いに、Java開発者は彼に大喝采を浴びせました。

Java エコシステムは、様々な分野で適用できますが、Henrikは大きく 5 つのセグメント領域(教育、安全、環境、宇宙、海洋)にわけ、Javaの利用事例紹介をはじめました。

まずJava の教育について、Henrik はBeJUG, Devoxx(4kids), Parleys, playpass.be の創設者でJava Champion でもある Stephan Janssen を壇上に招きました。ここで、Stephan Janssen は Devoxx における子供用の1日セミナーの開催をビデオを使って報告しました。セミナーを開催した理由は、彼の 11 歳の子供が、「父さん僕プログラミングをやりたいんだよ」と尋ねてきたのがきっかけでした。子供の願いをかなえようと自身の母国語で書かれたプログラミング言語の書籍を探しましたが見つからなかったため、無いのであれば、自分がイベントを開催し教える事が一番良いのではないかと考えました。この子供用のイベントは当初は参加者も少なかったようですが、現在では多くの子供達が参加しています。

「世界中に存在する JUG でこのような子供向けのイベントに興味がある方はどうか、私に連絡を取って欲しい、コンテンツも、教え方も、場合によってはハードウェアも提供したいと考えています。是非、ご自身の国でもこのような子供向けのイベントを開催してください。」と語り締めくくりました。
次に、Henrik はOracle Academy Vice President, Alison Derbrenwick Millerを壇上に招きました。オラクル・アカデミーは3つの軸を柱にコンピュータ・サイエンスの教育をグローバルに展開しています。
- オラクル・ボランティア
- オラクル・ギビング
- オラクル・アカデミー

オラクルは、大学生など若い学生に接触するのはとても重要な事だと考えています。一方で、オラクル・アカデミーの部門にいる社員数は世界中の子供達の数に比べ圧倒的に少ないためDevoxx 4 KIDS のように世界中の JUG の協力が必要と考えています。Java だけではありませんが、オラクルはこのような支援をしてくれるコミュニティに対して年間2700 億円の支援を行っています。このような内容に興味を持っていただく場合、Twitter,FaceBookもしくはオフィシャル・サイトにアクセスしてメールをしてくださいと語りました。
● https://twitter.com/OracleAcademy
● https://www.facebook.com/oracleacademy
● http://academy.oracle.com
次に、Henrik はJavaOne開催至上、最年少の登壇者Aditya Guptaを壇上に招き入れました。彼は、まだほんのわずか10 歳の少年で、父は Java EE のエバンジェリストとして世界的にも有名な Arun Gupta でした。Henrik は今回彼を Minecraft のハッカーとして壇上に招き入れました。

「Henrik はどんな事をしているの?」と尋ねた所、彼は冒頭、「昨年の冬、僕のゲームが壊れたんだけど、どうやったら jar ファイルを直せるの?」と父に尋ねました、なぜなら、そのゲームはJavaで作られていて jar ファイルが壊れてしまったためでした。その直し方を父に教えてもらった後、プログラミングに興味を持ち、Minecraft のコードをデコンパイルしたり、ゲームのパラメータを修正したり、ゲームの振る舞いを変更(メソッドの記載内容を修正して)するような事をしています。基調講演では実際に、Eclipse を使い 400以上の自身が書いたコードの内、ゲーム振る舞いを変更するための内容を参加者に分かりやすく紹介しました。彼の素晴らしい発表にJavaOne の参加者はスタンディング・オベーションで拍手を送りました。

その他、基調講演では様々な分野で適用される Java エコシステムについて紹介しました。
安全
- Java SE Embedded を使用したLego Mindstormsでのロボット制御 (http://java.com/legomindstorms) by Stephen Chin
- Java 制御し自律走行する車の研究プロジェクト by Java Champion : Allison Paul Perrone ご参照(
http://openj.dk/2013/09/09/my-day-at-the-iihs-test-track-with-perrone-robots-javaone-preview/)
環境
- 電気消費量の減少のため、家庭の電気消費量の監視・通知システム by Opower : Drew Hylbert,(Vice President, Technology and Infrastructure)ご参照(http://opower.com/)
適用範囲・宇宙
- NASA MMS ミッション(地上からの衛生管理システム)by AI Solutions : Sean Philips (Sr. Software Engineer)
- ゴールドマン・サックスにおける Java コミュニティへの貢献 by Goldman Sachs : Mike Marzo (Technology Fellow)
海洋
- Liquid Robotics の海洋センサーの制御 by Liquid Robotics : James Gosling (Chief Software Architect)

最後に、今年のJava のコミュニティ・キーノートでは、世界中のエンジニアが親として子供に母国語でプログラミング言語を教えている内容や、ほんのわずか10歳の子供が Java プログラミングを実施しゲームを改造している内容など日本の一エンジニアとしてはとても刺激を受けました。こうした子供向け、学生向けの教育は非常に重要で日本でも業界の垣根を超えて実施すべきではないかと思います。

また、Java の適用範囲は単なるエンタープライズ分野にとどまらず、ゲーム、ロボット、電気消費量計測、自動車制御などあらゆる場面で利用ができる事が紹介されました。これらの発表を受けて Java エコシステム全体像を把握でき、Java はまだまだ楽しい事がいっぱいできると感じられる内容でした。組み込み分野に精通していない開発者も、Java さえ理解していれば、Raspberry PIや Lego Mindstorms 等、組み込み・ロボット制御等で利用できるようになる他、こういったデバイスがJavaと共にインターネットに接続される、IoT (Internet of Things) 時代が到来していると感じられる基調講演でした。

GlassFish コミュニティセッション&楽天株式会社の事例
9/22(日) AM 9:15 – 11:15 にGlassFish Community: The Foundation for Opportunityが開催されました。
このセッションは、GlassFish の利用者にが今後の方向性について理解したり世界における GlassFish の利用事例を把握するためにセッションです。このセッションをとりまとめたのは Arun Gupta と共に、US Oracle で Java EE や GlassFish のエバンジェリストを勤める Reza Rahman と Sun の頃から GlassFish のプロダクト・マネージャを勤めているJohn Clingan でした。

まず、冒頭で John Clingan よりJava EE の歴史を過去から現在にわたって説明しました。2013年6月に正式リリースされた Java EE 7 について詳しく触れ、改めて Java EE 7 の3つのテーマである「開発生産性の向上」、「HTML 5 対応」、「エンタープライズニーズへの対応」を説明しました。説明中では、Java EE 7 に含まれる各テクノロジーについてそれぞれ下記のような概要を示しました。
JAX-RS ではクライアント用の API や非同期用の API が追加された他、標準の JSON ライブラリも追加されました、これは現在 20 以上ある Java 用の JSONライブラリに対し、
標準の JSON ライブラリを提供した物でストレーミングAPI,オブジェクトモデルを提供しています。また開発生産性の向上として、アノテーション・ベースで POJO(Plain Old Java Object) による開発がよりすすみ、開発容易性も向上している他、Java でメッセージングを扱う JMS においてもメッセージ送信におけるコード記述量が大幅に削減される事が説明されました。
また、ビューの開発テクノロジーとして提供される JSF(JavaServer Faces)については、Java EE 6 で導入された CDI(context dependency injection)が、今後 Java EE にとってより重要になり、JSF のデータ・バインディングやイベント処理などでは CDI を使うべきだという事も強調されました。
Java EE 7 のローンチ・イベントを 2013年6月 にオンラインで開催しましたが、このローンチ・イベントの参加者数も発表されました。ローンチ・イベントのコンテンツは、イベント終了後も、オンラインで視聴できるようになっていますが、当日の参加者数とイベント終了後にコンテンツを参照した開発者数は、1ヶ月で延べ1万人以上にのぼることが発表されました。
また、世界ではローンチ後、既に Java EE 7 に関連した書籍は 14 冊も提供されている事を示しました。

また、Java EE のチュートリアルも Java EE 7 に対応した内容が提供されており、すでに、世界では Java EE 7 の情報が豊富にあり、いつでも Java の開発者は Java EE 7 の詳細な情報を得られる状況になっている事を報告しました。
また、Java EE 7 は正式リリース後3ヶ月を経過していますが、この間 Java EE のダウンロード数は、Java EE SDK, GlasFish、OpenMQ など関連製品も含め、総ダウンロード数は 150 万を超えている事も報告しました。
さらに、Java EE 7 に準拠したアプリケーション・サーバは GlassFish 以外にも既に登場している事も報告しました。過去、Java EE 6 に準拠したアプリケーション・サーバは、正式リリース以降、15 以上ありましたが、Java EE 7 では、リリース以降3ヶ月で、参照実装の GlassFish 以外に、TmaxSoft も対応し、Java EE 7 への対応は EE 6 に比べより進む事が期待されている点についても述べられました。
開発環境としては、NetBeans, Eclipse, Intellij 等がすでに Java EE 7 の開発に対応し、GlassFish v4 も利用できるようになっています。さらに Oracle Enterprise
Manager も GlassFish を管理できるようになっている事を報告しました。
Java EE の将来について、Java EE 7 以降、NoSQL, HTML 5 対応の拡張、PaaS, キャッシュなどを含める事を現在検討していますが、それ以外にも、JSON-B(JSONバインディング)、Web アプリケーションの配備により柔軟性を持たせるための新しい設定、また CDI の利用範囲をさらに広げる点、Adopt A JSR プログラムへの適用、透明性を持った開発をより進めるといった内容も報告されました。
ロードマップは、本番環境への適用が可能となる GlassFish v4.1は 2014 年中にリリースされる事を報告した。
最後に、
GlassFish v4.0 をご利用頂き、バグを見つけたり、機能拡張のご要望がある場合、Issue Tracker やメーリング・リストなどを通じてご報告ください。皆様のフィードバックがとても重要ですとして締めくくった。開場からは、早速 Java EE のテストの容易性・標準化についても要望があがった。
その後、Q&A に応えるためプロダクト・マネージメントの Vice President Mike Lehmann も加わり参加者からの生の質問に応えていきました。
これらの中でも、印象的だったのは、Java EE 7/GlassFish のローンチ以降の世界的な盛り上がりは Java EE 6 ローンチ時に比べ、素晴らしい勢いで増え Java の開発者の皆様に幅広く浸透していっている事を感じ、とても興味深く、幸せに感じるといった Mike Lehmannの言葉でした。また、Java EE/GlassFish はオラクルのビジネスにとっても、とても重要である点も強調されました。
これらの質疑・応答を終えた後、GlassFish の世界的な事例について報告がありました。
********************************************************************
橋山 牧人 – Rakuten Ichiba Development Department, Rakuten, Inc.
David Heffelfinger ー Ensode Technology LLC,
Jaromir Hamala – Consultant, C2B2 CONSULTING LIMITED
Kerry Wilson – Software Engineer, Vanderbilt Univ Medical Center
********************************************************************
合計 126 インスタンスで楽天市場を運用する楽天株式会社

この中でも特に特筆すべきは、楽天株式の事例です。楽天株式会社より、楽天におけるGlassFishの適用事例について橋山 牧人氏から報告がありました。橋山氏は Web アプリケーションのエンジニアとして楽天に4年間勤め、現在楽天市場におけるお買い物カートのチェックアウトのシステムの開発に携わっています。現在、楽天市場では GlassFish v3.1.2.2 を3つのクラスタ構成を構築し運用されており、1つのクラスタあたり 42 インスタンス、つまりトータルで 126 インスタンスで運用している報告がありました。これは日本国内における大規模事例というだけでなく、世界的にみても最大級の事例といっても過言ではないでしょう。

橋山氏は、GlassFish を採用した理由を次のように語りました。
選択理由は2つあり、一つはGlassFish がJava EE の参照実装であることがポイントだったと語りました。2007 年の頃に JAX-WS の新機能を評価したのですが、その時標準でその新機能をサポートしていたのが GlassFish だけであった事からGlassFish を採用したと語っていました。またもう一つの理由として、GlassFish の管理のしやすさが挙げられると語りました。楽天では EC のサービスを提供するために24 時間 365日、巨大なクラスタを管理
しています。その際、GlassFish は巨大なクラスタを管理するために、強力な管理コンソールをを持っているため、管理コストが大幅に削減できたと語りました。
一方で、GlassFish コミュニテイの一員としても活躍している点を報告しました。過去 GlassFish v2 が持っていたバグに対して複数のパッチを提供してき GlassFish の品質改善にも寄与している点をあげました。具体的な一例として、GlassFish v2 の JSESSIONID に起因したバグのパッチを提供し、提供したパッチが次のバージョンに実際に含まれた点なども報告しました。
その後、実際にどのような所で GlassFish が使われているのか説明しました。楽天では GlassFish を楽天市場のチェックアウト部分の機能を動作させるための環境で使用しています。チェックアウト機能は SOA の サービス・バスのような振る舞いをし、15 以上の外部 API をマッシュアップして呼び出し、クライアントにサービスを提供しています。これはステートフルで管理されており、セッション情報をサーバ・サイドで保存しますが、パフォーマンスを向上するために、GlassFishと Oracle Coherence を組み合わせる事でパフォーマンス向上をはかっている点なども説明しました。

また、楽天市場における、巨大トラフィックへ対応するために、GlassFish の内部構造を正しく理解し、実際にパフォーマンス・ボトルネックがどこにあるのか、CPU が高負荷になった際に、どの部分に影響が発生しているのかを解析した経験もある事をあかしました。調査の結果、ワーカ・スレッドを少くする事で、パフォーマンスが大幅に改善した事なども報告しました。
こうした、日々の様々な努力を積み重ね、楽天セール時の巨大トラフィックをさばく環境を築き上げ、現在では、ピーク時12,000 トランザクション/分を達成し、負荷テスト時では 20,000 トランザクションが利用可能となっているという。
楽天において、Glassfish は信頼性と可用性があり大規模 EC サイトを構築できていると語りました。
※ 楽天市場のお買い物カートのチェックアウト・システムのように非常にミッション・クリティカルな環境で GlassFish が適用されている事は、本当に使えるのだろうか?と思われていた方にとって、とても貴重な情報だと思います。日本での発表に先駆けて、本場 JavaOne で世界のエンジニアに対して英語でご紹介いただいた楽天株式会社、そして橋山氏に心より感謝しています。橋山さん、ありがとうございました。
日本もすごい事をやっているんだという事を世界に対して示す事ができたのではないかと思います。
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 を使用した場合、ロガー・リソースバンドルのルックアップに失敗
- その他(詳しくはコチラ)


