NetBeans8 とGlassFish v4 - 日本オラクル | Integrated … ·  · 2015-04-15Java EE 7...

123
NetBeans8 GlassFish v4.1 ではじめる Java EE 7 ハンズオン・ラボ Version 1.2

Transcript of NetBeans8 とGlassFish v4 - 日本オラクル | Integrated … ·  · 2015-04-15Java EE 7...

Page 1: NetBeans8 とGlassFish v4 - 日本オラクル | Integrated … ·  · 2015-04-15Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1 3 1.0 はじめに Java EE 7 は Java ...

NetBeans8 と GlassFish v4.1

ではじめる

Java EE 7 ハンズオン・ラボ

Version 1.2

Page 2: NetBeans8 とGlassFish v4 - 日本オラクル | Integrated … ·  · 2015-04-15Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1 3 1.0 はじめに Java EE 7 は Java ...

Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1

2

Table of Contents

1.0 はじめに ............................................................................................................ 3

2.0 NetBeans と GlassFish の動作確認 .................................................................. 6

3.0 JavaServer Faces アプリケーションの作成 ................................................. 13

4.0 JMS アプリケーションの作成 .......................................................................... 37

5.0 WebSocket アプリケーションの作成 ............................................................... 50

6.0 GlassFish クラスタ環境の構築と動作確認 .................................................... 69

ボーナス演習:jBatch アプリケーションの作成 .................................................. 86

参考資料・補足 ..................................................................................................... 120

Page 3: NetBeans8 とGlassFish v4 - 日本オラクル | Integrated … ·  · 2015-04-15Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1 3 1.0 はじめに Java EE 7 は Java ...

Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1

3

1.0 はじめに

Java EE 7 は Java EE 6をベースに3つの新しいテーマ(開発生産性の向上、

HTML 5対応、エンタープライズ・ニーズへの対応)を提供し、4つの新機能が追

加されました。本ハンズオン・ラボでは新機能の一つである WebSocketにフォーカ

スをあて、より現実的な WebSocket アプリケーションの構築を行います。本ハン

ズオン・ラボを終了することで、セキュアでより大規模な WebSocket アプリケー

ションの構築ができるようになります。

本ハンズオン・ラボでは、図の右側に位置する情報提供者が入力したデータを、メ

ッセージ・プロバイダを通じて一元管理し、WebSocket のサーバ・エンドポイント

に接続する全情報受信者に対して同一メッセージを配信するアプリケーションを作

成します。本アプリケーションは複数台のマシンから構成されるクラスタ環境に対

応します。

図 1:ハンズオン・アプリケーションの概念図

本ハンズオン・ラボは Java EE 7 に含まれる下記の技術を使用します。

Java Message Service 2.0 (JSR 343)

JavaServer Faces 2.2 (JSR 344)

Enterprise Java Beans(JSR 345)

o Singleton EJB

o Message-Driven Bean

Contexts and Dependency Injection 1.1 (JSR 346)

Java API for WebSocket 1.0 (JSR 356)

Batch Applications for the Java Platform (JSR 352)<ボーナス演習>

Page 4: NetBeans8 とGlassFish v4 - 日本オラクル | Integrated … ·  · 2015-04-15Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1 3 1.0 はじめに Java EE 7 は Java ...

Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1

4

これらの API を使用することでより大規模でセキュアな WebSocketアプリケー

ションの構築ができます。

なお、この演習で Java コードや HTML の入力が多い部分については、この PDF

ファイルから随時コピー・ペーストを行って下さい。

必須ソフトウェア

最新の JDK 8 を入手してインストールしてください。

http://www.oracle.com/technetwork/java/javase/downloads/index.ht

ml

下図は Java SE 8u40のダウンロードページですが、ご利用時点でリリ

ースされている最新の Java SE 8 をご利用下さい。

図 2:JDK のダウンロード

Page 5: NetBeans8 とGlassFish v4 - 日本オラクル | Integrated … ·  · 2015-04-15Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1 3 1.0 はじめに Java EE 7 は Java ...

Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1

5

NetBeans 8.0.2 以降を入手してインストールしてください。NetBeans

のダウンロードサイトより「Java EE」もしくは「すべて」のパッケー

ジを選択し「ダウンロード」ボタンを押下してください。「Java EE」、

「すべて」を選択した場合、本ハンズオンの動作に必要な GlassFish

v4.1 がバンドルされています。 http://netbeans.org/downloads/

図 3:GlassFish バンドル版のダウンロード

なお、NetBeansインストール時に、GlassFish v4.1 をインストールす

るか否かを選択するダイアログが表示されるので、下図のようにインス

トールするように選択して下さい。

図 3B:NetBeans インストール時の GlassFish インストール指定

Page 6: NetBeans8 とGlassFish v4 - 日本オラクル | Integrated … ·  · 2015-04-15Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1 3 1.0 はじめに Java EE 7 は Java ...

Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1

6

2.0 NetBeans と GlassFish の動作確認

NetBeans をインストールしたのち、アイコンをダブル・クリックし NetBeans

を起動してください。起動すると下記のような画面が表示されます。

図 4:NetBeans の起動画面

ここで、NetBeans と GlassFish が正しく連携できているかを確認するため、

新しくプロジェクトを作成してください。メニューから「ファイル (F)」→

「新規プロジェクト(W)...」を選択してください。

図 5:新規プロジェクト作成

Page 7: NetBeans8 とGlassFish v4 - 日本オラクル | Integrated … ·  · 2015-04-15Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1 3 1.0 はじめに Java EE 7 は Java ...

Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1

7

「新規プロジェクト(W)...」を選択すると下記のウィンドウが表示されます。

「カテゴリ(C) :」より「Java Web」を選択し、「プロジェクト(P):」より

「Webアプリケーション」を選択し「次 >」ボタンを押下してください。

図 6:新規プロジェクト作成

「次 >」ボタンを押下すると下記のウィンドウが表示されます。「プロジェク

ト名:」に「WebSocket-HoL」と入力し「次 >」ボタンを押下してください。

図 7:新規 Web アプリケーション

Page 8: NetBeans8 とGlassFish v4 - 日本オラクル | Integrated … ·  · 2015-04-15Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1 3 1.0 はじめに Java EE 7 は Java ...

Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1

8

「次 >」ボタンを押下すると下記の画面が表示されます。「コンテキスト・パ

ス(P):」の変更は今回不要なので、そのまま「次 >」ボタンを押下してくださ

い。

図 8:新規 Web アプリケーション

「次 >」ボタンを押下すると、下記のウィンドウが表示されます。使用するフ

レームワークとして「JavaServer Faces」を選択し、最後に「終了(F)」ボタン

を押下してください。

図 9:新規 Web アプリケーション

Page 9: NetBeans8 とGlassFish v4 - 日本オラクル | Integrated … ·  · 2015-04-15Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1 3 1.0 はじめに Java EE 7 は Java ...

Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1

9

「終了(F)」ボタンを押下すると下記の画面が表示されます。

図 10:プロジェクト作成完了画面

今回作成するアプリケーションに必要なライブラリをプロジェクトに追加しま

す。

はじめにプロジェクトをマウスで選択してください。選択したのち、右クリッ

クし「プロパティ」を選択してください。

図 10-A:ライブラリの追加

Page 10: NetBeans8 とGlassFish v4 - 日本オラクル | Integrated … ·  · 2015-04-15Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1 3 1.0 はじめに Java EE 7 は Java ...

Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1

10

選択すると、下記のウィンドウが表示されます。ここで「カテゴリ(C):」より

「ライブラリ」を選択し、右側にある「ライブラリの追加(L) ...」ボタンを押下

してください。

図 10-B:プロジェクトプロパティのライブラリ画面

ボタンを押下すると下記のウィンドウが表示されます。ここでは「Java EE 7

APIライブラリ」を選択して「ライブラリの追加」ボタンを押下して下さい。

図 10-C:ライブラリの追加画面

Page 11: NetBeans8 とGlassFish v4 - 日本オラクル | Integrated … ·  · 2015-04-15Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1 3 1.0 はじめに Java EE 7 は Java ...

Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1

11

ボタンを押下すると下記のウィンドウが表示されます。「コンパイル時ライブラ

リ」に「Java EE 7 API ライブラリ」が追加されていることを確認し、「OK」ボタン

を押下して下さい。

図 10-D:プロジェクトプロパティのライブラリ画面(ライブラリ追加後)

新規プロジェクトを設定したので、このプロジェクトを実行します。プロジェ

クトを実行するために、「図 11:NetBeans ツールバー」に示す NetBeans のツ

ールバーより、「プロジェクトを実行(F6)」ボタンを押下してください。

図 11:NetBeans ツールバー

Page 12: NetBeans8 とGlassFish v4 - 日本オラクル | Integrated … ·  · 2015-04-15Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1 3 1.0 はじめに Java EE 7 は Java ...

Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1

12

もしくは、NetBeans のメニューから「プロジェクトを実行(R)」を選択し実行

してください。

プロジェクトを実行するとブラウザが自動的に起動しデフォルトのページが表

示されます。

図 13:NetBeans の実行結果

図 12:NetBeans プロジェクトの実行

Page 13: NetBeans8 とGlassFish v4 - 日本オラクル | Integrated … ·  · 2015-04-15Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1 3 1.0 はじめに Java EE 7 は Java ...

Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1

13

3.0 JavaServer Faces アプリケーションの作成 本章より実装をはじめていきます。

まず、情報提供者が Web アプリケーションに対して情報を登録する画面を

JavaServer Faces(以降 JSF) で実装します。

JSF は Webアプリケーションを構築するための標準 Web フレームワークで、

Visual Basic や JavaFXなどのリッチクライアント開発に取り入れられている

コンポーネント指向開発を取り入れています。

図 15:JSF の内部アーキテクチャ

図 14:JSF アプリケーションの概念図

Page 14: NetBeans8 とGlassFish v4 - 日本オラクル | Integrated … ·  · 2015-04-15Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1 3 1.0 はじめに Java EE 7 は Java ...

Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1

14

JSF は MVCアーキテクチャに基づき実装を行うことが可能で、JSFの実行環境

が提供する FacesServlet が MVC におけるコントローラの役割を担います、

FacesServlet は事前設定ファイル (faces-config.xml) を読み込み、クライア

ントからのリクエストに対して適切な処理へマッピングする役割を持っていま

す。開発者は基本的に、コントローラである FacesServlet に対して設定ファ

イルの修正以外、特に処理を追加実装する必要はありません。開発者が JSF の

アプリケーションで実際に実装する箇所はビューとモデル部分になり、ビュー

は Facelets(xhtml)と EL式、モデルは Context Dependency Injection (以降

CDI) を用いて実装します。

Faceletsでは HTMLで提供されている HTMLタグと1対1で対応する独自タグを

xhtmlファイル中に記載していきます。例えばテキスト・フィールドを表す

HTMLタグは<INPUT TYPE=”TEXT” value=””>ですが、Faceletsでは

<h:inputText id=”***” value=””/>で表します。

図 16:Facelets タグの利用例

ご参考:JSF 2.2 で利用可能な Facelets タグの一覧は下記に記載されています。

https://docs.oracle.com/javaee/7/javaserver-faces-2-2/vdldocs-facelets/

Faceletsタグを用いて画面デザインを作成し、画面デザイン完了後、画面の入

力データ等をプログラム内で扱えるように致します。

Page 15: NetBeans8 とGlassFish v4 - 日本オラクル | Integrated … ·  · 2015-04-15Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1 3 1.0 はじめに Java EE 7 は Java ...

Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1

15

図 17:Facelets + EL 式と CDI のバインディング

テキスト・フィールド内に入力された値をプログラム内で取得するためには、

Facelets内に定義する EL 式(上記の図では #{indexManage.message}と記載

されている箇所)を用いて、CDIで実装したクラス (上記の図では

IndexPageMgdBean クラス)にバインディング(結びつけ)します。

画面デザインに示すような HTMLのテキスト・フィールドを表現するために

Faceletsでは<h:inputText />タグを定義します。ここでタグ内の value に記

載する箇所 ”#{indexManage.message}” が EL 式で、@Namedのアノテーショ

ンを付加した CDIのクラス (IndexPageMgdBean) にバインドし、ドットで連結

し、フィールド (message) にバインドしています。

バインドされた値を取得するためには CDIで別途定義するゲッター・メソッド

(上記の場合 getMessage() メソッド)を呼び出し取得することが可能です。

このように JSF は HTMLコンポーネントの値を、POJO の Java クラスに対して

バインドして簡単にデータを取り出す仕組みを提供し Webアプリケーションの

簡易化をはかっています。JSFは、実装内部ロジックは多少複雑ですが、Webア

プリケーションの開発者にその内部アーキテクチャの複雑さを隠蔽し、かんた

んに開発ができる仕組みを提供しています。

本ハンズオンでは JSF の Facelets タグと EL式、CDI を利用して簡単な JSF

アプリケーションの作成を行います。このハンズオンではかんたんに実装する

ために、画面遷移、入力データ検証、Ajax 化などは行いません。ユーザから入

力されたデータをサーバ側で受けて処理をする JSFアプリケーションを作成し

ます。

Page 16: NetBeans8 とGlassFish v4 - 日本オラクル | Integrated … ·  · 2015-04-15Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1 3 1.0 はじめに Java EE 7 は Java ...

Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1

16

まず、JSFの管理対象 Beanを Context Dependency Injection (以降 CDI)で実

装するため CDI を有効にします。次に JSFのパラメータで日本語データを扱う

ことができるように、GlassFish で UTF-8 の文字コードを扱う設定を行います。

はじめにプロジェクトをマウスで選択してください。選択したのち、右クリッ

クし「新規...」→「その他...」を選択してください。

選択すると下記のウィンドウが表示されます。ここで「カテゴリ(C):」より

「コンテキストと依存性の注入」を選択し、「ファイル・タイプ(F):」より

「beans.xml (CDI 構成ファイル)」を選択し、「次 >」ボタンを押下してくだ

さい。

図 18:CDI の有効化

Page 17: NetBeans8 とGlassFish v4 - 日本オラクル | Integrated … ·  · 2015-04-15Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1 3 1.0 はじめに Java EE 7 は Java ...

Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1

17

図 19:新規ファイル

ボタンを押下すると下記のウィンドウが表示されます。ここではデフォルトの

設定のまま「終了(F)」ボタンを押下してください。

図 20:New beans.xml (CDI 構成ファイル)ウィンドウ

ボタンを押下すると「構成ファイル」配下に下記の beans.xml ファイルが自動

的に生成されます。

Page 18: NetBeans8 とGlassFish v4 - 日本オラクル | Integrated … ·  · 2015-04-15Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1 3 1.0 はじめに Java EE 7 は Java ...

Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1

18

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://xmlns.jcp.org/xml/ns/javaee"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee

http://xmlns.jcp.org/xml/ns/javaee/beans_1_1.xsd"

bean-discovery-mode="annotated">

</beans>

ここで、デフォルトで記載されている「bean-discovery-

mode="annotated"」の箇所を bean-discovery-mode="all" 1に修正し

てください。修正後は下記になります。

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://xmlns.jcp.org/xml/ns/javaee"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee

http://xmlns.jcp.org/xml/ns/javaee/beans_1_1.xsd"

bean-discovery-mode="all">

</beans>

次に、GlassFish で UTF-8 の文字エンコードを扱う設定を行います。プロジェ

クトをマウスで選択し右クリックし「新規」→「その他...」を選択してくださ

い。

1 bean-discovery-mode は “all”, “annotated”, “none” のいずれかを指定できます。

annotated を指定した場合、アノテーションが付加されたクラスに対してのみイ

ンジェクション可能です。all を指定した場合、全てのクラスに対してインジェ

クション可能となります。

図 21:新規 GlassFish ディスクリプタの作成

Page 19: NetBeans8 とGlassFish v4 - 日本オラクル | Integrated … ·  · 2015-04-15Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1 3 1.0 はじめに Java EE 7 は Java ...

Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1

19

「カテゴリ(C):」より「GlassFish」を選択し、「ファイル・タイプ(F):」より

「GlassFishディスクリプタ」を選択し「次 >」ボタンを押下してください。

図 22:新規 GlassFish ディスクリプタの作成

ボタンを押下すると下記のウィンドウが表示されます。ここではデフォルトの

設定のまま「終了(F)」ボタンを押下してください。

図 23:新規 GlassFish ディスクリプタの作成

Page 20: NetBeans8 とGlassFish v4 - 日本オラクル | Integrated … ·  · 2015-04-15Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1 3 1.0 はじめに Java EE 7 は Java ...

Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1

20

ボタンを押下すると下記の画面が表示されますが、「OK」ボタンを選択します。

図 23-A:新規 GlassFish ディスクリプタの作成時のエラーダイアログ

「OK」ボタンを選択すると下記の画面が表示されます。ここで「XML」ボタンを押

下してください。

押下すると下記の XMLファイルが表示されます。

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE sun-web-app PUBLIC

"-//Sun Microsystems, Inc.//DTD GlassFish Application Server

3.0 Servlet 3.0//EN"

"http://www.sun.com/software/appserver/dtds/sun-web-app_3_0-

0.dtd">

<sun-web-app error-url="">

<class-loader delegate="true"/>

<jsp-config>

<property name="keepgenerated" value="true">

<description>Keep a copy of the generated servlet class'

java code.</description>

</property>

</jsp-config>

</sun-web-app>

図 24:sun-web.xml の編集画面

Page 21: NetBeans8 とGlassFish v4 - 日本オラクル | Integrated … ·  · 2015-04-15Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1 3 1.0 はじめに Java EE 7 は Java ...

Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1

21

ここで、GlassFish でデフォルトで UTF-8 文字エンコードを扱うために、

<parameter-encoding default-charset="UTF-8" /> の1行を追加し

てください。追加すると下記になります。

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE sun-web-app PUBLIC "-//Sun Microsystems, Inc.//DTD

GlassFish Application Server 3.0 Servlet 3.0//EN"

"http://www.sun.com/software/appserver/dtds/sun-web-app_3_0-

0.dtd">

<sun-web-app error-url="">

<class-loader delegate="true"/>

<jsp-config>

<property name="keepgenerated" value="true">

<description>Keep a copy of the generated servlet class'

java code.</description>

</property>

</jsp-config>

<parameter-encoding default-charset="UTF-8" />

</sun-web-app>

以上で、CDI と UTF-8 の文字エンコードが利用可能になりました。

プロジェクトの「構成ファイル」ディレクトリ配下を確認すると下記のファイ

ルが含まれていることを確認してください。

図 25:構成ファイルの確認

Page 22: NetBeans8 とGlassFish v4 - 日本オラクル | Integrated … ·  · 2015-04-15Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1 3 1.0 はじめに Java EE 7 は Java ...

Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1

22

次に、JSF ページのバックエンド処理を行う、「JSF 管理対象 Bean」を CDI 管

理対象 Beanとして作成します。プロジェクトを選択し、右クリックした後、

「新規」→「その他...」を選択してください。

選択すると、下記のウィンドウが表示されます。ここで「カテゴリ(C):」より

「JavaServer Faces」を選択し、「ファイル・タイプ(F):」より「JSF管理対

象 Bean」を選択した後、「次 >」ボタンを押下してください。

図 26:新規 JSF バッキングビーンの作成

図 27:新規 JSF 管理対象ビーン

Page 23: NetBeans8 とGlassFish v4 - 日本オラクル | Integrated … ·  · 2015-04-15Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1 3 1.0 はじめに Java EE 7 は Java ...

Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1

23

ボタンを押下すると下記のウィンドウが表示されます。ここで、「クラス名

(N):」に「IndexPageMgdBean」を入力し、「パッケージ(K):」に

「jp.co.oracle.cdis」、「スコープ:」を「dependent」から「request」に変

更し、最後に「終了(F)」ボタンを押下してください。

ボタンを押下すると下記のコードが自動的に生成されます。

/*

* To change this license header, choose License Headers in

* Project Properties.

* To change this template file, choose Tools | Templates

* and open the template in the editor.

*/

package jp.co.oracle.cdis;

import javax.inject.Named;

import javax.enterprise.context.RequestScoped;

/**

*

* @author **********

*/

@Named(value = "indexPageMgdBean")

@RequestScoped

public class IndexPageMgdBean {

/**

* Creates a new instance of IndexPageMgdBean

*/

public IndexPageMgdBean() {

}

}

図 28:New JSF 管理対象 Bean

Page 24: NetBeans8 とGlassFish v4 - 日本オラクル | Integrated … ·  · 2015-04-15Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1 3 1.0 はじめに Java EE 7 は Java ...

Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1

24

ここで、CDI 管理対象 Beanのデフォルト名を変更します。@Named(value =

“indexPageMgdBean”)と記載されている箇所を、@Named(value =

“indexManage”)に修正してください。また、情報提供者から入力された文字

をプログラムにバインド(結びつけ)する変数を定義します。「private

String message;」を定義してください。

/*

* To change this license header, choose License Headers in

* Project Properties.

* To change this template file, choose Tools | Templates

* and open the template in the editor.

*/

package jp.co.oracle.cdis;

import javax.inject.Named;

import javax.enterprise.context.RequestScoped;

/**

*

* @author **********

*/

@Named(value = "indexManage")

@RequestScoped

public class IndexPageMgdBean {

private String message;

/**

* Creates a new instance of IndexPageMgdBean

*/

public IndexPageMgdBean() {

}

}

Page 25: NetBeans8 とGlassFish v4 - 日本オラクル | Integrated … ·  · 2015-04-15Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1 3 1.0 はじめに Java EE 7 は Java ...

Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1

25

次に、NetBeans のメニューより「リファクタリング」→「フィールドをカプセ

ル化...」を選択してください。

図 29:フィールドのカプセル化

選択すると下記のウィンドウが表示されます。ここで、「カプセル化するフィ

ールド一覧(L):」から「取得メソッドを作成」、「設定メソッドを作成」のそ

れぞれに含まれる「getMessage」、「setMessage」にチェックし「リファクタ

リング(R)」ボタンを押下してください。

図 30:フィールドをカプセル化

Page 26: NetBeans8 とGlassFish v4 - 日本オラクル | Integrated … ·  · 2015-04-15Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1 3 1.0 はじめに Java EE 7 は Java ...

Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1

26

ボタン押下すると下記のコードが自動的に生成されます。

/*

* To change this license header, choose License Headers in

* Project Properties.

* To change this template file, choose Tools | Templates

* and open the template in the editor.

*/

package jp.co.oracle.cdis;

import javax.inject.Named;

import javax.enterprise.context.RequestScoped;

/**

*

* @author **********

*/

@Named(value = "indexManage")

@RequestScoped

public class IndexPageMgdBean {

private String message;

/**

* Creates a new instance of IndexPageMgdBean

*/

public IndexPageMgdBean() {

}

/**

* @return the message

*/

public String getMessage() {

return message;

}

/**

* @param message the message to set

*/

public void setMessage(String message) {

this.message = message;

}

}

上記のバインド変数を定義する事により、Expression Language(EL) 式を通じ

て、JSF のページ内からデータ参照、データ設定ができるようになります。2

次に、データが入力された際に行う実際の処理を実装します。ここではページ

内でボタンを一つ用意しボタンが押下された際に処理する内容を実装します。

今回は、JSF の振る舞いを簡単に理解するために、ボタンを押下された際に

2 JSF の Facelets でデータ・バインドに EL 式 #{indexManage.message}を定義できるようになり

ます。例えば、テキスト・フィールドで message を参照、設定するためには、JSF タグ

<h:inputText id="textField" value="#{indexManage.message}"/>を記入します。

Page 27: NetBeans8 とGlassFish v4 - 日本オラクル | Integrated … ·  · 2015-04-15Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1 3 1.0 はじめに Java EE 7 は Java ...

Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1

27

pushSendButton()メソッドを呼び出し、入力された文字をそのまま標準出力に

表示する処理を実装します。クラスに対して下記のメソッドを追加してくださ

い。3

public String pushSendButton() {

System.out.println(getMessage());

return "";

}

実装した全ソースコードは下記となります。

package jp.co.oracle.cdis;

import javax.inject.Named;

import javax.enterprise.context.RequestScoped;

/**

*

* @author *********

*/

@Named(value = "indexManage")

@RequestScoped

public class IndexPageMgdBean {

private String message;

/**

* Creates a new instance of IndexPageMgdBean

*/

public IndexPageMgdBean() {

}

/**

* @return the message

*/

public String getMessage() {

return message;

}

/**

* @param message the message to set

*/

public void setMessage(String message) {

this.message = message;

}

public String pushSendButton() {

System.out.println(getMessage());

return "";

}

}

3 JSF のページからこのメソッドを実行するためには、ボタンタグで action に EL 式を定義しま

す。<h:commandButton value="Send Message" action="#{indexManage.pushSendButton()}"/>

ボタンが押下された際に pushSendButton()メソッドが実行されます。またアクションを実行し

た際、そのメソッドの戻り値が画面遷移先を表します。メソッドの返り値を空文字「””」として

いるのは本処理を実行した後、画面遷移を行わないため空文字「””」としています。

Page 28: NetBeans8 とGlassFish v4 - 日本オラクル | Integrated … ·  · 2015-04-15Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1 3 1.0 はじめに Java EE 7 は Java ...

Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1

28

次に、管理者が接続するページを JSFの Faceletsで作成します、プロジェクト

を選択したのち、右クリックし「新規」→「その他...」を選択してください。

選択すると下記のウィンドウが表示されます。ここで「カテゴリ(C):」より

「その他」を選択し、「ファイル・タイプ(F):」から「フォルダ」を選択して

「次 >」ボタンを押下してください。

図 32:新規フォルダの作成

図 31:新規 Web ページの作成

Page 29: NetBeans8 とGlassFish v4 - 日本オラクル | Integrated … ·  · 2015-04-15Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1 3 1.0 はじめに Java EE 7 は Java ...

Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1

29

ボタンを押下すると下記のウィンドウが表示されます。ここで「フォルダ名

(N):」に「admin」、「親フォルダ(R)」に「web」を記載し、最後に「終了(F)」

ボタンを押下してください。

図 33:New フォルダ作成

ボタンを押下すると、プロジェクトの「Webページ」ディレクトリ配下に

「admin」ディレクトリが作成されます。

図 34:ディレクトリ構成

Page 30: NetBeans8 とGlassFish v4 - 日本オラクル | Integrated … ·  · 2015-04-15Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1 3 1.0 はじめに Java EE 7 は Java ...

Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1

30

次に、作成した「admin」ディレクトリをマウスで選択した後、右クリックして

ください。右クリックした後「新規」→「その他...」を選択してください。

図 35:新規 Web ページ作成

選択すると下記のウィンドウが表示されます。ここで「カテゴリ(C) :」より

「JavaServer Faces」を選択し、「ファイル・タイプ(F) :」から「JSF ページ」

を選択し「次>」ボタンを押下してください。

図 36:新規 JSF ページの作成

Page 31: NetBeans8 とGlassFish v4 - 日本オラクル | Integrated … ·  · 2015-04-15Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1 3 1.0 はじめに Java EE 7 は Java ...

Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1

31

ボタンを押下すると下記のウィンドウが表示されます。ここで、「ファイル

名:」に「index」を入力し、最後に「終了(F)」ボタンを押下してください。

図 37:New JSF ページ

ボタンを押下すると自動的に下記のファイルが生成されます。

<?xml version='1.0' encoding='UTF-8' ?>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0

Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-

transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml"

xmlns:h="http://xmlns.jcp.org/jsf/html">

<h:head>

<title>Facelet Title</title>

</h:head>

<h:body>

Hello from Facelets

</h:body>

</html>

Page 32: NetBeans8 とGlassFish v4 - 日本オラクル | Integrated … ·  · 2015-04-15Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1 3 1.0 はじめに Java EE 7 は Java ...

Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1

32

次に、プロジェクトを実行した際に、この作成したページがデフォルトで表示

されるようにプロジェクトの設定を修正します。プロジェクトの「構成ファイ

ル」ディレクトリ配下に存在する「web.xml」ファイルをダブル・クリックして

ください。

ダブル・クリックすると「web.xml」ファイルの設定ウィンドウが表示されます。

ここで「ソース」ボタンを押下すると下記のような画面が表示されます。

図 39:web.xml の設定画面

図 38:構成ファイルの修正

Page 33: NetBeans8 とGlassFish v4 - 日本オラクル | Integrated … ·  · 2015-04-15Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1 3 1.0 はじめに Java EE 7 は Java ...

Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1

33

ここで、XML要素 <welcome-file> の項目を、下記のように修正し admin 配下

の index.xhtml が呼び出されるように修正してください。

<welcome-file-list> <welcome-file>faces/admin/index.xhtml</welcome-file>

</welcome-file-list>

上記設定完了後、プロジェクトを実行すると、デフォルトで adminディレクト

リ配下の index.xhtml が呼び出されるようになります。

それでは、実際に Web ページを作成していきます。今回は、JSFの Facelets

で作成する画面のイメージは下記になります。

図 40:設定完了後の実行画面

図 41:画面完成イメージ

Page 34: NetBeans8 とGlassFish v4 - 日本オラクル | Integrated … ·  · 2015-04-15Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1 3 1.0 はじめに Java EE 7 は Java ...

Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1

34

上記の画面で、「Send Message」のボタンが押下された際、テキスト・フィー

ルドに入力された文字列をサーバ側に送信するコードを実装します。admin フ

ォルダにある自動生成された index.xhtmlファイルを下記のように修正してく

ださい。

<?xml version='1.0' encoding='UTF-8' ?>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"

"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml"

xmlns:h="http://xmlns.jcp.org/jsf/html">

<h:head>

<title>Message Transfer Admin Console</title>

</h:head>

<h:body>

<h:form>

<h:inputText id="textField"

value="#{indexManage.message}"/>

<h:commandButton value="Send Message"

action="#{indexManage.pushSendButton()}"/><br/>

</h:form>

</h:body>

</html>

実装した後、NetBeans のプロジェクトを実行してください。

図 42:NetBeans プロジェクトの実行

Page 35: NetBeans8 とGlassFish v4 - 日本オラクル | Integrated … ·  · 2015-04-15Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1 3 1.0 はじめに Java EE 7 は Java ...

Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1

35

プロジェクトを実行すると下記の画面が表示されます。

テキスト・フィールドに「こんにちは」と入力し「Enter」キー、もしくは

「Send Message」ボタンを押下してください。

図 43:実行画面

Page 36: NetBeans8 とGlassFish v4 - 日本オラクル | Integrated … ·  · 2015-04-15Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1 3 1.0 はじめに Java EE 7 は Java ...

Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1

36

実行後、NetBeans の「GlassFish 4.1」のコンソールを確認すると「こんにち

は」の文字列が表示されている4ことを確認できます。

図 45:GlassFish コンソールの確認

以上で JSFの Faceletsによるアプリケーションの作成は完了です。JSFでは上

記のように、CDIと EL式を組み合わせることで、かんたんにユーザの入力をサ

ーバ側で取り扱えます。

4 本来は Web アプリケーションのため標準出力ではなく Web 画面上に結果を

表示すべきですが、今回はボタン action の動作確認を簡単にするため標準出力

に結果を表示しています。

図 44:アプリケーションの実行

Page 37: NetBeans8 とGlassFish v4 - 日本オラクル | Integrated … ·  · 2015-04-15Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1 3 1.0 はじめに Java EE 7 は Java ...

Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1

37

4.0 JMS アプリケーションの作成

次に、情報提供者が JSFのアプリケーションで入力した文字を Java Message

Service (以降 JMS)を利用してメッセージ・プロバイダ5に送信し、送信された

文字列を取り出すアプリケーションを実装します。今回、メッセージ・プロバ

イダとして GlassFish v4.1にバンドルされている OpenMQ を利用します。6そこ

で別途メッセージ・プロバイダをインストールする必要はありません。JMS の

アプリケーションを実際に作成していく前に JMSの仕組みについて簡単に紹介

します。JMS は Java 用の Message Oriented Middleware(MOM) の APIを提供

し、メッセージを送受信するための機能を提供します。

図 46:JMS アプリケーションの概念図

JMS のアプリケーションを実際に作成していく前に JMS の仕組みについて簡単

に紹介します。JMS は Java 用の Message Oriented Middleware(MOM) の API

を提供し、メッセージを送受信するための機能を提供します。JMSを利用する

事でシステム間の疎結合を実現することができます。JMSでは下記に示す2種

類の実装モデル(Point-to-Point, Publish/Subscriber)を提供しています。

5 JMSのインターフェースを実装した MOMの実行環境で、メッセージプロバイダとして Apache

ActiveMQ, OpenMQ などがある。 6 GlassFish v4.1 は「Full Java EE Platform」をインストールした場合、Open MQ

(https://mq.java.net/) が GlassFish にバンドルされています。今回は GlassFish にバンドル

されている Open MQをメッセージ・プロバイダとして利用します。Open MQ 5.0.1 より、Open

MQ 単体で WebSocket をサポートしていますが、今回は Java EE アプリケーションとして実装

するため GlassFish 経由で OpenMQ を使用します。

Page 38: NetBeans8 とGlassFish v4 - 日本オラクル | Integrated … ·  · 2015-04-15Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1 3 1.0 はじめに Java EE 7 は Java ...

Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1

38

Point To Point では、送信側と受信側で1対1の関係を持ち、メッセージ・プ

ロバイダ上に存在する、Queue を通じてメッセージをコンシュマーにメッセー

ジを届けます。1対 1と記載していますが、実際には送信側は複数のプロデュ

ーサーがメッセージを送信する事も可能です。一方で受信側は必ず1になりま

す。このモデルではメッセージがコンシュマー(受信側)に届くまで、もしく

はメッセージ自身の有効期限が切れるまでメッセージは Queue に残り続けます。

図 48:Publish/Subscriber モデル

図 47:Point to Point モデル

Page 39: NetBeans8 とGlassFish v4 - 日本オラクル | Integrated … ·  · 2015-04-15Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1 3 1.0 はじめに Java EE 7 は Java ...

Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1

39

一方で、Publish/Subscriber モデルでは送信側と受信側で 1対多の関係を持つ

事ができます。メッセージの送信者であるパブリッシャはメッセージ・プロバ

イダに存在する Topic に対してメッセージを送信します。Topicに対してパブ

リッシュされたメッセージは複数のクライアントがメッセージを受信する事が

できるようになります。送信側は受信側の台数やシステム構成等を意図する事

なく Topic に配信することができ、また受信側は、実際のパブリッシャ(送信

側)を意識する事なく興味のあるメッセージを受信できます。

今回のアプリケーションは、大規模環境を想定しクラスタ環境における複数の

インスタンスで同一メッセージを受信できるようにするため、

Publish/Subscriber のモデルを使用して実装します。このモデルを使用する事

でシステムに対する負荷が増大した場合もソースコードに一切手を加えること

なく、クラスタのインスタンスを追加するだけシステムを柔軟に拡張できるよ

うになります。

Page 40: NetBeans8 とGlassFish v4 - 日本オラクル | Integrated … ·  · 2015-04-15Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1 3 1.0 はじめに Java EE 7 は Java ...

Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1

40

次に、JMS アプリケーションの作成方法7について説明します。

まず、アプリケーション・サーバ側でメッセージ・プロバイダ(OpenMQ)に対す

る接続ファクトリと宛先の設定を行います。

GlassFish v4.1 で JMS リソースで Topic用の「接続ファクトリ」を作成する

ためには、コマンドプロンプトから下記の asadminコマンドを実行します。8

(実際は、下記のコマンドは 1行で実行します。)

> asadmin create-jms-resource --restype

javax.jms.TopicConnectionFactory jms/topicCon

Connector resource jms/topicCon created.

Command create-jms-resource executed successfully.

つづいて、Topic の物理的な「宛先リソース」を作成します。下記のコマンド

を実行してください。(実際は、下記のコマンドは 1 行で実行します。)

> asadmin create-jms-resource --restype

javax.jms.Topic --property Name=phisicaltopic jms/inforegtopic

Administered object jms/inforegtopic created.

Command create-jms-resource executed successfully.

7 JMSのアプリケーションは、Java EE 環境だけでなく Java SE 環境でも実装する事ができま

す。 8 asadmin コマンドは GlassFish のインストール・ディレクトリ配下の bin ディレクトリに存

在します。GlassFish を C:\glassfish-4.1 にインストールした場合 C:\glassfish-4.1\bin に

存在します。

図 49:メッセージ・プロバイダの設定

Page 41: NetBeans8 とGlassFish v4 - 日本オラクル | Integrated … ·  · 2015-04-15Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1 3 1.0 はじめに Java EE 7 は Java ...

Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1

41

下記のコマンドを実行し、接続ファクトリである「jms/topicCon」と宛先リソ

ースである「jms/inforegtopic」が表示されることを確認してください。

> asadmin list-jms-resources

jms/inforegtopic

jms/__defaultConnectionFactory

jms/topicCon

Command list-jms-resources executed successfully.

以上でメッセージ・プロバイダの JMSリソースの作成は終了です。

次のページに進んで下さい。

--------------------------------------------------------------------

【参考情報】

JMSリソースを asadminコマンドで設定する方法以外に、GlassFish の管理コ

ンソールを使用して下記のように GUI で設定を行うことも可能です。管理コン

ソールで JMS リソースを作成する方法は、当資料の「参考資料・補足」にある

「JMSリソースの GUIによる設定方法」をご参照下さい。

( すでに asadmin コマンドで JMS リソース設定が完了している場合、この「JMS

リソースの GUI による設定方法」の手順を実施する必要はありません。)

なお、GlassFish の管理コンソールは、ブラウザより下記 URLを指定すること

でアクセスできます。

http://localhost:4848

URLを指定すると、下記のページが表示されます。

図 50:GlassFish 管理コンソール

--------------------------------------------------------------------

Page 42: NetBeans8 とGlassFish v4 - 日本オラクル | Integrated … ·  · 2015-04-15Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1 3 1.0 はじめに Java EE 7 は Java ...

Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1

42

アプリケーション・サーバの設定が完了したので、アプリケーションの実装を

行います。

Java EE コンテナ上で JMSのアプリケーションを実装する場合、アプリケーシ

ョン・サーバのリソースをインジェクトして実装を行います。 i

図 51:JMS アプリケーションの構築概念図

現在、アプリケーション・サーバ上で設定されている内容は下記です。

設定項目 設定値

JMS 接続ファクトリ jms/topicCon

JMS 宛先 jms/inforegtopic

上記設定内容を元にプログラム側から JMSリソースをインジェクトしてメッセ

ージ・プロバイダに存在する Topic の宛先(jms/inforegtopic)に対してメッセ

ージをパブリッシュ9する実装を行います。JSFのマネージド Beanとして実装

した IndexPageMgdBean クラスに対して下記のコードを追加してください。

package jp.co.oracle.cdis;

import javax.annotation.Resource;

import javax.inject.Named;

import javax.enterprise.context.RequestScoped;

import javax.inject.Inject;

import javax.jms.JMSConnectionFactory;

import javax.jms.JMSContext;

import javax.jms.Topic;

9 メッセージのパブリッシュはメッセージ送信を意味します。

Page 43: NetBeans8 とGlassFish v4 - 日本オラクル | Integrated … ·  · 2015-04-15Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1 3 1.0 はじめに Java EE 7 は Java ...

Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1

43

@Named(value = "indexManage")

@RequestScoped

public class IndexPageMgdBean {

@Inject

@JMSConnectionFactory("jms/topicCon")

JMSContext context;

@Resource(mappedName = "jms/inforegtopic")

Topic topic;

private String message;

public IndexPageMgdBean() {

}

public String getMessage() {

return message;

}

public void setMessage(String message) {

this.message = message;

}

public String pushSendButton() {

context.createProducer().send(topic, getMessage());

return "";

}

}

メッセージのパブリッシュ(送信用)のコードは以上です。

JMSContextは Java EE 7 から追加されたクラスで、このクラスを利用すること

で JMSアプリケーションの実装がとてもかんたんになります。JMSContext を利

用できるようにするために、アプリケーション・サーバで設定したリソース名

を使用して@JMSConnectionFactory と@Injectアノテーションでインジェクトし

ます。また Topic に対する「JMS宛先リソース」を@Resource アノテーションで

インジェクトします。

メッセージを送信するためには、JMSContext#createProducer()メソッドを呼び

出して JMSProducer クラスのオブジェクトを生成し、メッセージを送信します。

上記のように、Java EE 7に含まれる JMS 2.0 ではメッセージ送信(Queue,

Topi共に)に必要な実装コードはとても短く、またとてもかんたんに実装でき

ます。

Page 44: NetBeans8 とGlassFish v4 - 日本オラクル | Integrated … ·  · 2015-04-15Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1 3 1.0 はじめに Java EE 7 は Java ...

Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1

44

続いてメッセージ受信用のコードを Message-Driven Bean (MDB) として実装し

ます。プロジェクトを選択したのち、右クリックし「新規」→「その他...」を

選択してください。

選択すると下記のウィンドウが表示されます。ここで「カテゴリ(C):」より

「Enterprise JavaBeans」を選択し、「ファイル・タイプ(F):」より「メッセ

ージ駆動型 Bean」を選択し「次 >」ボタンを押下してください。

図 53:新規メッセージ駆動型 Bean の作成

図 52:新規メッセージ駆動型 Bean の作成

Page 45: NetBeans8 とGlassFish v4 - 日本オラクル | Integrated … ·  · 2015-04-15Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1 3 1.0 はじめに Java EE 7 は Java ...

Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1

45

ボタンを押下すると下記のウィンドウが表示されます。ここで「EJB名(N):」

に「MessageListenerMDBImpl」を入力し、「パッケージ(K) :」に

「jp.co.oracle.ejbs」を選択してください、また「サーバの宛先(S):」の部分

で「jms/inforegtopic」を選択し最後に「次 >」ボタンを押下してください。

ボタンを押下すると下記のウィンドウが表示されます。ここではデフォルトの

設定のまま「終了(F):」ボタンを押下してください。

図 54:New メッセージ駆動型 Bean の作成

図 55:New メッセージ駆動型 Bean の作成

Page 46: NetBeans8 とGlassFish v4 - 日本オラクル | Integrated … ·  · 2015-04-15Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1 3 1.0 はじめに Java EE 7 は Java ...

Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1

46

ボタンを押下すると下記のコードが自動生成されます。

/*

* To change this license header, choose License Headers in Project

* Properties.

* To change this template file, choose Tools | Templates

* and open the template in the editor.

*/

package jp.co.oracle.ejbs;

import javax.ejb.ActivationConfigProperty;

import javax.ejb.MessageDriven;

import javax.jms.Message;

import javax.jms.MessageListener;

/**

*

* @author ***********

*/

@MessageDriven(activationConfig = {

@ActivationConfigProperty(propertyName = "destinationType",

propertyValue = "javax.jms.Topic"),

@ActivationConfigProperty(propertyName = "destinationLookup",

propertyValue = "jms/inforegtopic"),

@ActivationConfigProperty(propertyName =

"subscriptionDurability", propertyValue = "durable"),

@ActivationConfigProperty(propertyName = "clientId",

propertyValue = "jms/inforegtopic"),

@ActivationConfigProperty(propertyName = "subscriptionName",

propertyValue = "jms/inforegtopic")

})

public class MessageListenerMDBImpl implements MessageListener {

public MessageListenerMDBImpl() {

}

@Override

public void onMessage(Message message) {

}

}

コードを下記のように修正してください。下記の MDB は、メッセージ・プロバ

イダに存在する、Topic (jms/inforegtopic) を

サブスクライブ(購読)し、Topic にテキスト・メッセージがパブリッシュ(送

信)された場合、onMessage ()でそのメッセージを消費(受信)し、受信した

メッセージを標準出力に出力しています。

package jp.co.oracle.ejbs;

import java.util.logging.Level;

import java.util.logging.Logger;

import javax.ejb.ActivationConfigProperty;

import javax.ejb.MessageDriven;

import javax.jms.JMSException;

import javax.jms.Message;

import javax.jms.MessageListener;

Page 47: NetBeans8 とGlassFish v4 - 日本オラクル | Integrated … ·  · 2015-04-15Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1 3 1.0 はじめに Java EE 7 は Java ...

Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1

47

import javax.jms.TextMessage;

@MessageDriven(activationConfig = {

@ActivationConfigProperty(propertyName = "destinationType",

propertyValue = "javax.jms.Topic"),

@ActivationConfigProperty(propertyName = "destinationLookup",

propertyValue = "jms/inforegtopic"),

@ActivationConfigProperty(propertyName =

"subscriptionDurability", propertyValue = "Durable"),

@ActivationConfigProperty(propertyName = "clientId",

propertyValue = "${com.sun.aas.instanceName}"),

@ActivationConfigProperty(propertyName = "subscriptionName",

propertyValue = "jms/inforegtopic")

})

public class MessageListenerMDBImpl implements MessageListener {

private static final Logger logger =

Logger.getLogger(

MessageListenerMDBImpl.class.getPackage().getName());

public MessageListenerMDBImpl() {

}

@Override

public void onMessage(Message message) {

TextMessage textMessage = (TextMessage) message;

try {

String text = textMessage.getText();

System.out.println(text);

} catch (JMSException ex) {

logger.log(Level.SEVERE, "recieve message failed :", ex);

}

}

}

※ソースコードの補足10

上記でメッセージ受信の実装は完了です。

10 MDBの activationConfig の設定で clientId", propertyValue =

"${com.sun.aas.instanceName}の項目があります。これはクラスタ環境で、複数台のマ

シンで運用する場合、clientId に対して固有の名前を割り当てる必要があるため GlassFish

固有の設定を使用しています。実際にはインスタンス名がここに代入されます。

また、subscriptionDurability の値がデフォルトで durable となっており NetBeans の自

動生成コードのバグと思われます。実際には Durable ですので変更してください。

Page 48: NetBeans8 とGlassFish v4 - 日本オラクル | Integrated … ·  · 2015-04-15Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1 3 1.0 はじめに Java EE 7 は Java ...

Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1

48

ここで GlassFish が起動している場合、再起動を行います。

NetBeans画面下部の「出力」で、「GlassFish Server 4.1」タブを選択します。

下記の「サーバーを停止」の×印アイコンが選択できる場合、起動状態になって

います。その場合、×印アイコンを選択して GlassFish を停止して下さい。

GlassFishが停止していることを確認し、プロジェクトを実行してください。

図 56:NetBeans プロジェクトの実行

Page 49: NetBeans8 とGlassFish v4 - 日本オラクル | Integrated … ·  · 2015-04-15Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1 3 1.0 はじめに Java EE 7 は Java ...

Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1

49

実行すると、下記の画面が表示されます。テキスト・フィールドに文字列を入

力し「Enter」キーを押下するか、もしくは「Send Message」ボタンを押下して

ください。

NetBeans の「出力」ウィンドウの「GlassFish Server 4.1」タブを選択すると

GlassFish のログが出力されています。ボタンを押下すると、JSFの Web ペー

ジに入力した文字と同じ文字がログに出力されます。同じ文字が表示されてい

ればメッセージ・プロバイダを通じて、メッセージの送受信が正常に行われて

います。

図 58:GlassFish のログ出力

以上で、JSF と JMS のアプリケーションの連携は完了です。

図 57:Web ページに文字列を入力

Page 50: NetBeans8 とGlassFish v4 - 日本オラクル | Integrated … ·  · 2015-04-15Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1 3 1.0 はじめに Java EE 7 は Java ...

Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1

50

5.0 WebSocket アプリケーションの作成

次に、WebSocket アプリケーションを作成します。

WebSocket は HTTPをアップグレードした TCPベースのプロトコルで、双方

向・全二重の通信ができます。また WebSocketプロトコルの仕様は RFC 6455

で定義され、APIは W3Cによって定義されています。

図 59:WebSocket について

WebSocketはライフサイクル(コネクションの接続・切断、メッセージ受信、

エラー発生)を持ち、それぞれのサイクルに対応した実装を行います。

Java EE 7 では JSR 356 として「Java™ API for WebSocket」が新たに追加され、

下記に示すアノテーションを使ってかんたんに WebSocket のエンドポイントの

図 60:WebSocket のライフサイクル

Page 51: NetBeans8 とGlassFish v4 - 日本オラクル | Integrated … ·  · 2015-04-15Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1 3 1.0 はじめに Java EE 7 は Java ...

Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1

51

実装ができます。アノテーションは、クライアント側の実装かサーバ側の実装

化を識別するために用意された、クラスに付加する(@ServerEndpoint,

@ClientEndpoint11)アノテーションと、WebSocketの各ライフサイクルに対応

するメソッドに付加する(@OnOpen, @OnClose, @OnMessage, @OnError)アノテー

ションが用意されています。@PathParam のアノテーションは特別で、RESTful

Webサービスのように、WebSocket のリクエスト URIパスの一部をパラメータと

して扱う為に指定するアノテーションです。

図 61:WebSocket のアノテーション

今回のアプリケーションはサーバ・エンドポイント(サーバ側)の実装行いま

す。JSR 356 の APIを使用して簡単に WebSocketのサーバ・エンドポイントが

実装できることを確認してください。

11 Java EE はサーバ・サイドのテクノロジーを取り扱いますが、JSR 356 準拠の実行環境はク

ライアント側の実装も提供します。クライアントの API を利用することで、JavaFX 等の Javaク

ライアントから WebSocket サーバ・エンドポイントへ接続するアプリケーションも実装できる

ようになります。

Page 52: NetBeans8 とGlassFish v4 - 日本オラクル | Integrated … ·  · 2015-04-15Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1 3 1.0 はじめに Java EE 7 は Java ...

Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1

52

この WebSocket アプリケーションは、まず「情報受信者(クライアント・エン

ドポイント)」が WebSocketのサーバ・エンドポイントに接続し、サーバ側で

「情報受信者」の接続・切断情報を管理します。次に、前章で実装した MDB が

メッセージ・プロバイダの Topic を監視し、メッセージを受信した際に接続さ

れている全情報受信者に対して情報を発信します。

図 62:WebSocket アプリケーションの概念図

まず、WebSocket のサーバ・エンドポイントを作成します。プロジェクトをマ

ウスで選択し右クリックしてください。次に「新規」→「その他...」を選択し

てください。

選択すると下記のウィンドウが表示されます。「カテゴリ(C):」より「Web」を

選択し、「ファイル・タイプ(F):」より「WebSocket エンドポイント」を選択

して「次 >」ボタンを押下してください。

図 63:WebSocket サーバ・エンドポイントの作成

Page 53: NetBeans8 とGlassFish v4 - 日本オラクル | Integrated … ·  · 2015-04-15Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1 3 1.0 はじめに Java EE 7 は Java ...

Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1

53

ボタンを押下すると下記のウィンドウが表示されます。ここで「クラス名(N):」

に「InfoTransServerEndopoint」を入力し、「パッケージ(K):」に

「jp.co.oracle.websockets」、「WebSocket URI(U):」に「/infotrans」を入

力した後、最後に「終了(F)」ボタンを押下してください。

図 65:New WebSocket エンドポイント

図 64:WebSocket エンドポイントの作成

Page 54: NetBeans8 とGlassFish v4 - 日本オラクル | Integrated … ·  · 2015-04-15Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1 3 1.0 はじめに Java EE 7 は Java ...

Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1

54

ボタンを押下すると下記のコードが自動的に生成されます。

/*

* To change this license header, choose License Headers in Project

* Properties.

* To change this template file, choose Tools | Templates

* and open the template in the editor.

*/

package jp.co.oracle.websockets;

import javax.websocket.OnMessage;

import javax.websocket.server.ServerEndpoint;

/**

*

* @author ***********

*/

@ServerEndpoint("/infotrans")

public class InfoTransServerEndpoint {

@OnMessage

public String onMessage(String message) {

return null;

}

}

今回のアプリケーションでは WebSocket サーバ・エンドポイントでは接続・切

断の管理だけをおこない、クライアントからメッセージの受信は行わないため

@OnMessageのアノテーションが付加されたコードは不要で削除してください。

その代わりに@OnOpen, @OnCloseのメソッドを実装してください。

package jp.co.oracle.websockets;

import javax.websocket.OnClose;

import javax.websocket.OnOpen;

import javax.websocket.Session;

import javax.websocket.server.ServerEndpoint;

@ServerEndpoint("/infotrans")

public class InfoTransServerEndpoint {

@OnOpen

public void initOpen(Session session) {

System.out.println("接続");

}

@OnClose

public void closeWebSocket(Session session) {

System.out.println("切断");

}

}

Page 55: NetBeans8 とGlassFish v4 - 日本オラクル | Integrated … ·  · 2015-04-15Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1 3 1.0 はじめに Java EE 7 は Java ...

Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1

55

次にこのサーバ・エンドポイントに接続する HTML ファイルを作成します。まず、

プロジェクト作成時に自動生成された「index.xhtml」ファイルを削除します。

対象のファイルを選択し右クリックしてください。メニューより「削除」を選

択してください。

※ ここで削除するファイルは、admin/index.xhtml ではありません。

削除を選択すると下記のダイアログ・ウィンドウが表示されます。ここで「は

い」ボタンを押下してください。

図 66:既存ファイルの削除

図 67:オブジェクト削除の確認

Page 56: NetBeans8 とGlassFish v4 - 日本オラクル | Integrated … ·  · 2015-04-15Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1 3 1.0 はじめに Java EE 7 は Java ...

Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1

56

次に、HTMLファイルを作成します。プロジェクトを選択し右クリックしてくだ

さい。次に「新規」→「その他...」を選択してください。

選択すると下記のウィンドウが表示されます。「カテゴリ(C):」より「HTML5」

を選択し、「ファイル・タイプ(F):」より「HTMLファイル」を選択し「次 >」

ボタンを押下してください。

図 69:新規 HTML ファイルの作成

図 68:新規 HTML ファイルの作成

Page 57: NetBeans8 とGlassFish v4 - 日本オラクル | Integrated … ·  · 2015-04-15Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1 3 1.0 はじめに Java EE 7 は Java ...

Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1

57

ボタンを押下すると下記のウィンドウが表示されます。「ファイル名(N):」に

「client-endpoint」を入力し、「フォルダ(L):」に「web」を入力した後最後

に「終了(F)」ボタンを押下してください。

ボタンを押下すると下記のコードが自動生成されます。

<!DOCTYPE html>

<!--

To change this license header, choose License Headers in Project

Properties.

To change this template file, choose Tools | Templates

and open the template in the editor.

-->

<html>

<head>

<title>TODO supply a title</title>

<meta charset="UTF-8">

<meta name="viewport" content="width=device-width">

</head>

<body>

<div>TODO write content</div>

</body>

</html>

図 70:新規 HTML ファイルの作成

Page 58: NetBeans8 とGlassFish v4 - 日本オラクル | Integrated … ·  · 2015-04-15Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1 3 1.0 はじめに Java EE 7 は Java ...

Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1

58

上記コードを WebSocketサーバ・エンドポイントに接続するコードに修正しま

す。HTMLに下記のコードを実装してください。下記のコードは WebSocket のサ

ーバ・エンドポイントを示す下記の URLに接続し、

「ws://localhost:8080/WebSocket-HoL/infotrans」WebSocket の各ライフサイ

クルの実装を JavaScriptで実装しています。また WebSocket のサーバ・エンド

ポイントに接続されている時は、「Connect」ボタンを非表示にし、

「DisConnect」のボタンを表示します。逆に切断されている時は、

「DisConnect」ボタンを非表示にし、「Connect」ボタンを表示しています。

<!DOCTYPE html>

<html>

<head>

<title>WebSocket RealTime Infomation Transfer</title>

<meta http-equiv="Content-Type" content="text/html; charset=UTF-

8"/>

<style type="text/css">

table,td,th {

width: 700px;

font-size: medium;

border-collapse: collapse;

border: 1px black solid;

}

</style>

<script language="javascript" type="text/javascript">

var websocket = null;

var numberOfMessage;

function init() {

numberOfMessage = 0;

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";

document.getElementById("server-port").disabled = false;

}

function connectServerEndpoint() {

var host = document.getElementById("server-port").value;

var wsUri = "ws://" + host + "/WebSocket-HoL/infotrans";

if ("WebSocket" in window) {

websocket = new WebSocket(wsUri);

} else if ("MozWebSocket" in window) {

websocket = new MozWebSocket(wsUri);

} else {

websocket = new WebSocket(wsUri);

}

websocket.onopen = function(evt) {

onOpen(evt);

};

websocket.onmessage = function(evt) {

onMessage(evt);

};

websocket.onerror = function(evt) {

Page 59: NetBeans8 とGlassFish v4 - 日本オラクル | Integrated … ·  · 2015-04-15Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1 3 1.0 はじめに Java EE 7 は Java ...

Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1

59

onError(evt);

};

websocket.onclose = function(evt) {

closeServerEndpoint();

};

document.getElementById("connect").style.display = "none";

document.getElementById("close").style.display = "block";

document.getElementById("server-port").disabled = true;

}

function onOpen(evt) {

;

}

function onMessage(evt) {

writeToScreen(evt.data);

numberOfMessage++;

}

function onError(evt) {

writeToScreen("ERROR: " + evt.data);

}

function writeToScreen(messages) {

var table = document.getElementById("TBL");

var row = table.insertRow(0);

var cell1 = row.insertCell(0);

cell1.style.color = "WHITE";

var textNode = document.createTextNode(messages);

var z = numberOfMessage % 2;

if (z == 1) {

cell1.style.backgroundColor = "#669900";

} else {

cell1.style.backgroundColor = "#ED9B09";

}

cell1.appendChild(textNode);

}

window.addEventListener("load", init, false);

</script>

</head>

<body>

<h2>WebSocket RealTime Infomation Transfer Sample

Application!</h2>

サーバ接続ポート番号:<input id="server-port" type="text"

value=""/>

<input id="connect" type="button" value="Connect"

onClick="connectServerEndpoint();">

<input id="close" type="button" value="DisConnect"

onClick="closeServerEndpoint();">

<br/>

<TABLE BORDER="1" ID="TBL">

</TABLE>

</body>

</html>

上記のコードを修正した後、NetBean のプロジェクトを実行してください。

Page 60: NetBeans8 とGlassFish v4 - 日本オラクル | Integrated … ·  · 2015-04-15Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1 3 1.0 はじめに Java EE 7 は Java ...

Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1

60

図 71:NetBeans プロジェクトの実行

NetBeans 実行したのち、ブラウザより下記の URLにアクセスしてください。ア

クセスすると下記の画面が表示されます。

http://localhost:8080/WebSocket-HoL/client-endpoint.html

次に、「サーバ接続ポート番号」に「localhost:8080」と入力し、「Connect」、

「DisConnect」のボタンを数度押下してください。ボタンを押下した際、

GlassFish Server 4.1 のログを確認するとボタンの押下の度に「接続」、

「切断」メッセージが繰り返し出力されている事が確認できます。

図 73:GlassFish のログ確認

図 72:WebSocket クライアント・エンドポイント

Page 61: NetBeans8 とGlassFish v4 - 日本オラクル | Integrated … ·  · 2015-04-15Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1 3 1.0 はじめに Java EE 7 は Java ...

Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1

61

次に、WebSocket のクライアント・エンドポイントの情報をアプリケーション

内で一元管理する Singleton EJB を作成します。プロジェクトを選択し右クリ

ックしてください。次に「新規」→「その他...」を選択します。

選択すると下記のウィンドウが表示されます。ここで「カテゴリ(C):」より

「Enterprise JavaBeans」を選択し、「ファイル・タイプ(F):」より「セッシ

ョン Bean」を選択し「次 >」ボタンを押下してください。

図 75:新規 Singleton EJB の作成

図 74:新規 Singleton EJB の作成

Page 62: NetBeans8 とGlassFish v4 - 日本オラクル | Integrated … ·  · 2015-04-15Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1 3 1.0 はじめに Java EE 7 は Java ...

Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1

62

ボタンを押下すると下記のウィンドウが表示されます。ここで「EJB名(N):」

に「ClientManageSinglEJB」、「パッケージ(K):」に「jp.co.oracle.ejbs」が

記入されている事を確認し、「セッションのタイプ:」のラジオボタンに「シン

グルトン」を選択し、最後に「終了(F)」ボタンを押下してください。

図 76:New セッション Bean

ボタンを押下すると自動的に下記のコードが生成されます。

/*

* To change this license header, choose License Headers in Project

* Properties.

* To change this template file, choose Tools | Templates

* and open the template in the editor.

*/

package jp.co.oracle.ejbs;

import javax.ejb.Singleton;

import javax.ejb.LocalBean;

/**

*

* @author *********

*/

@Singleton

@LocalBean

public class ClientManageSinglEJB {

// Add business logic below. (Right-click in editor and choose

// "Insert Code > Add Business Method")

}

Page 63: NetBeans8 とGlassFish v4 - 日本オラクル | Integrated … ·  · 2015-04-15Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1 3 1.0 はじめに Java EE 7 は Java ...

Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1

63

今回、このシングルトンの EJB ではアプリケーションの起動時に EJBを初期化

するため、クラスに対して @Startup を付加しています。この EJBでは

WebSocketのクライアント・エンドポイントから接続された際にクライアント

の Session 情報をコレクションに追加し(addClient)、切断された際にコレク

ションから削除(removeClient)します。全クライアント情報は Set<Session>

peers に含まれ、接続済みの全 WebSocket クライアント・エンドポイントに対

してメッセージを同期で送信するために sendMessage()メソッドを実装してい

ます。

package jp.co.oracle.ejbs;

import java.io.IOException;

import java.util.Collections;

import java.util.HashSet;

import java.util.Set;

import java.util.logging.Level;

import java.util.logging.Logger;

import javax.ejb.Singleton;

import javax.ejb.LocalBean;

import javax.ejb.Startup;

import javax.websocket.Session;

@Singleton

@LocalBean

@Startup

public class ClientManageSinglEJB {

private static final Logger logger =

Logger.getLogger(

ClientManageSinglEJB.class.getPackage().getName());

public ClientManageSinglEJB(){}

private final Set<Session> peers =

Collections.synchronizedSet(new HashSet<Session>());

public void addClient(Session session) {

peers.add(session);

}

public void removeClient(Session session) {

peers.remove(session);

}

public void sendMessage(String message){

for(Session session : peers){

try {

session.getBasicRemote().sendText(message);

} catch (IOException ex) {

logger.log(Level.SEVERE,

"Failed to send the message to Client :", ex);

}

}

}

}

Page 64: NetBeans8 とGlassFish v4 - 日本オラクル | Integrated … ·  · 2015-04-15Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1 3 1.0 はじめに Java EE 7 は Java ...

Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1

64

WebSocket のクライアント・エンドポイントの管理を行う Singleton EJB を作

成したので、WebSocketのサーバ・エンドポイント側のコードも修正します。

WebSocket のサーバ・エンドポイント側の実装を下記のように修正してくださ

い。

下記では@EJB のアノテーションで ClientManageSinglEJB をインジェクトして

います。クライアントと接続した場合、ClientManageSinglEJB #addClient()メ

ソッドを呼び出し、切断時に ClientManageSinglEJB #removeClient()メソッド

を呼び出し、クライアント・エンドポイントを EJB で一元的に管理しています。

package jp.co.oracle.websockets;

import javax.ejb.EJB;

import javax.websocket.OnClose;

import javax.websocket.OnOpen;

import javax.websocket.Session;

import javax.websocket.server.ServerEndpoint;

import jp.co.oracle.ejbs.ClientManageSinglEJB;

@ServerEndpoint("/infotrans")

public class InfoTransServerEndpoint {

@EJB

ClientManageSinglEJB clManager;

@OnOpen

public void initOpen(Session session) {

clManager.addClient(session);

}

@OnClose

public void closeWebSocket(Session session) {

clManager.removeClient(session);

}

}

また、MDBでメッセージを受信した際に、接続済みの全 WebSocketのクライア

ント・エンドポイントに対してメッセージを配信するために、MDBの実装を下

記のように修正してください。

下記では、@EJB のアノテーションで ClientManageSinglEJB をインジェクトし

ています。メッセージ・プロバイダの Topicよりメッセージを受信した際に、

ClientManageSinglEJB#sendMessage()メソッドを呼び出しています。

package jp.co.oracle.ejbs;

import java.util.logging.Level;

import java.util.logging.Logger;

import javax.ejb.ActivationConfigProperty;

import javax.ejb.EJB;

import javax.ejb.MessageDriven;

import javax.jms.JMSException;

import javax.jms.Message;

import javax.jms.MessageListener;

import javax.jms.TextMessage;

@MessageDriven(mappedName = "jms/inforegtopic", activationConfig = {

@ActivationConfigProperty(propertyName = "

Page 65: NetBeans8 とGlassFish v4 - 日本オラクル | Integrated … ·  · 2015-04-15Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1 3 1.0 はじめに Java EE 7 は Java ...

Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1

65

destinationType", propertyValue = "javax.jms.Topic"),

@ActivationConfigProperty(propertyName = "subscriptionDurability",

propertyValue = "Durable"),

@ActivationConfigProperty(propertyName = "clientID",

propertyValue="${com.sun.aas.instanceName}"),

@ActivationConfigProperty(propertyName = "subscriptionName",

propertyValue="TESTSubScription")

})

public class MessageListenerMDBImpl implements MessageListener {

private static final Logger logger = Logger.getLogger(

MessageListenerMDBImpl.class.getPackage().getName());

@EJB

ClientManageSinglEJB clManager;

@Override

public void onMessage(Message message) {

TextMessage textMessage = (TextMessage) message;

try {

String text = textMessage.getText();

clManager.sendMessage(text);

} catch (JMSException ex) {

logger.log(Level.SEVERE, "onMessage() failed", ex);

}

}

}

上記のコードを修正した後、NetBeans のプロジェクトを実行してください。

図 77:NetBeans プロジェクトの実行

Page 66: NetBeans8 とGlassFish v4 - 日本オラクル | Integrated … ·  · 2015-04-15Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1 3 1.0 はじめに Java EE 7 は Java ...

Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1

66

プロジェクトを実行すると下記の画面が表示されます。ここではそのまま何も

せずにこの画面を保持したまま、別のブラウザもしくはブラウザの新規タブを

開いてください。

図 78:プロジェクトの実行画面

Page 67: NetBeans8 とGlassFish v4 - 日本オラクル | Integrated … ·  · 2015-04-15Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1 3 1.0 はじめに Java EE 7 は Java ...

Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1

67

別のブラウザもしくは別のタブを開き下記の URLにアクセスしてください。

その後、「サーバー接続ポート番号」に「localhost:8080」を入力して「Connect」

ボタンを押下してください。

http://localhost:8080/WebSocket-HoL/client-endpoint.html

図 79:クライアント・エンドポイントへ接続

Page 68: NetBeans8 とGlassFish v4 - 日本オラクル | Integrated … ·  · 2015-04-15Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1 3 1.0 はじめに Java EE 7 は Java ...

Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1

68

ボタンを押下した後、index.xhtml の画面より“こんにちは”と入力し「Send

Message」ボタンを押下するか「Enter Key」を押下してください。メッセージ

を送信すると WebSocketのクライアント・エンドポイント側で入力した文字が

表示されます。

図 80:アプリケーションの実行

以上で全アプリケーションの実装と動作確認は完了です。

Page 69: NetBeans8 とGlassFish v4 - 日本オラクル | Integrated … ·  · 2015-04-15Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1 3 1.0 はじめに Java EE 7 は Java ...

Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1

69

6.0 GlassFish クラスタ環境の構築と動作確認

次に、WebSocket アプリケーションを大規模環境で運用するためにクラスタ環

境を構築しクラスタ環境でアプリケーションを動作させます。

今回はハンズオンとしてかんたんに実装・検証できることを目的としてプロジ

ェクトを作成したため、情報提供者側の JSFアプリケーションと、情報受信者

側の WebSocket アプリケーションを同一アプリケーションとして作成しました。

下記のハンズオンでは、1つの GlassFish クラスタを作成し、クラスタ内に複

数のインスタンスを作成し、クラスタ環境でアプリケーションの動作確認を行

います。

図 81:大規模クラスタ環境の構築概念図

補足

本アプリケーションは MQを介してメッセージの送受信を行うため、情報提供者

側、情報受信者側それぞれを別のアプリケーションとして作成し、全く別の

GlassFishサーバ・インスタンスに対して配備することも可能です。情報提供

者側のアプリケーションは DMZ内のセキュリティに保護された環境に存在する

GlassFishサーバ・インスタンスに配備し、情報受信者側のアプリケーション

は外部ネットワークから接続可能な GlassFishのサーバ・インスタンスに配備

する事でよりセキュアなメッセージ配信システムを構築することもできます。

下記に示すハンズオンを正しく理解したのち、応用してセキュアな環境を構築

してください。

Page 70: NetBeans8 とGlassFish v4 - 日本オラクル | Integrated … ·  · 2015-04-15Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1 3 1.0 はじめに Java EE 7 は Java ...

Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1

70

まず、ブラウザで GlassFishの管理コンソールに接続12してください。

http://localhost:4848

接続したのち、左ペインより「クラスタ」を選択してください。選択すると下

記の画面が表示されます。ここで「新規...」ボタンを押下してください。

図 82:GlassFish クラスタの作成

12 asadmin のコマンドを使って構築する事もできますが、ここでは、かんたんに設定するた

めに、GUIの管理コンソールを使用して環境構築を行います。

Page 71: NetBeans8 とGlassFish v4 - 日本オラクル | Integrated … ·  · 2015-04-15Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1 3 1.0 はじめに Java EE 7 は Java ...

Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1

71

ボタンを押下すると下記の画面が右ペインに表示されます。ここで「クラスタ

名:」に「my-cluster」を入力し、「作成するサーバ・インスタンス(0)」の

「新規...」ボタンを2度押下してください。ボタンを押下すると「インスタン

ス名」、「重み」の入力項目、「ノード」のコンボボックスが2行表示されま

すので、1行目に「instance1」、「100」、「localhost-domain1」を2行目に

「instance2」、「100」、「localhost-domain1」をそれぞれ入力し、最後に

「OK」ボタンを押下してください。

図 83:GlassFish 新規クラスタ

Page 72: NetBeans8 とGlassFish v4 - 日本オラクル | Integrated … ·  · 2015-04-15Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1 3 1.0 はじめに Java EE 7 は Java ...

Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1

72

ボタンを押下すると、右ペインに下記の画面が表示されます。

図 84:GlassFish クラスタの作成完了

ここで「Select」にチェックし「クラスタの起動」ボタンを押下してください。

ボタンを押下すると下記の確認ダイアログ・ウィンドウが表示されますので、

「OK」ボタンを押下してください。

図 85:クラスタ起動確認ダイアログ・ウィンドウ

Page 73: NetBeans8 とGlassFish v4 - 日本オラクル | Integrated … ·  · 2015-04-15Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1 3 1.0 はじめに Java EE 7 は Java ...

Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1

73

クラスタが正常に起動すると右ペインに下記の画面が表示されます。ここで

「instance1」、「instance2」がそれぞれ「稼働中」と表示されていることを

確認してください。

図 86:GlassFish クラスタ起動完了

Page 74: NetBeans8 とGlassFish v4 - 日本オラクル | Integrated … ·  · 2015-04-15Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1 3 1.0 はじめに Java EE 7 は Java ...

Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1

74

次に、既存の JMSリソースをクラスタ環境でも利用できるように設定変更して

いきます。

左ペインの「JMSリソース」ツリーを展開し、「接続ファクトリ」から

「jms/topicCon」を選択してください。選択すると下記の画面が表示されます。

図 87:JMS 接続ファクトリの編集

次に、右ペインより「ターゲット」タブを選択してください。選択すると右ペ

インに下記の画面が表示されます。

図 88:JMS リソース・ターゲットの設定

Page 75: NetBeans8 とGlassFish v4 - 日本オラクル | Integrated … ·  · 2015-04-15Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1 3 1.0 はじめに Java EE 7 は Java ...

Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1

75

ここで「ターゲットの管理...」ボタンを押下してください。押下すると下記の

画面が表示されます。ここで「使用可能なターゲット:」より「my-cluster」

を選択し、「追加 >」ボタン、もしくは「すべてを追加 >>」ボタンを押下して

ください。「選択したターゲット:」に「my-cluster」が含まれていることを確

認し、最後に「保存」ボタンを押下してください。

図 89:JMS リソース・ターゲットの管理

ボタンを押下すると下記の画面が表示されます。

図 90:JMS 接続ファクトリ・リソースの設定完了

Page 76: NetBeans8 とGlassFish v4 - 日本オラクル | Integrated … ·  · 2015-04-15Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1 3 1.0 はじめに Java EE 7 は Java ...

Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1

76

次に、左ペインの「JMSリソース」ツリーを展開し、「宛先リソース」から

「jms/inforegtopic」を選択してください。選択すると下記の画面が表示され

ます。

図 91:JMS 宛先リソースの設定

次に、右ペインより「ターゲット」タブを選択してください。選択すると下記

の画面が表示されます。

図 92:JMS 宛先リソースのターゲット

Page 77: NetBeans8 とGlassFish v4 - 日本オラクル | Integrated … ·  · 2015-04-15Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1 3 1.0 はじめに Java EE 7 は Java ...

Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1

77

ここで「ターゲットの管理...」ボタンを押下してください。押下すると下記の

画面が表示されます。ここで「使用可能なターゲット:」より「my-cluster」

を選択し、「追加 >」ボタン、もしくは「すべてを追加 >>」ボタンを押下して

ください。「選択したターゲット:」に「my-cluster」が含まれていることを確

認し、最後に「保存」ボタンを押下してください。

ボタンを押下すると下記の画面が表示されます。

図 93:JMS 宛先リソース・ターゲットの管理

図 94:JMS 宛先リソース設定完了

Page 78: NetBeans8 とGlassFish v4 - 日本オラクル | Integrated … ·  · 2015-04-15Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1 3 1.0 はじめに Java EE 7 は Java ...

Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1

78

最後に、既存のデプロイ済の「WebSocket-HoL」アプリケーションをクラスタ環

境でも利用できるように設定変更してください。

左ペインの「アプリケーション」ツリーを展開し、「WebSocket-HoL」を選択し

てください。選択すると下記の画面が表示されます。

次に、右ペインより「ターゲット」タブを選択してください。選択すると下記

の画面が表示されます。

図 95:クラスタ環境におけるアプリケーションの有効化

図 96:アプリケーション・ターゲット管理

Page 79: NetBeans8 とGlassFish v4 - 日本オラクル | Integrated … ·  · 2015-04-15Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1 3 1.0 はじめに Java EE 7 は Java ...

Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1

79

ここで「ターゲットの管理...」ボタンを押下してください。押下すると下記の

画面が表示されます。ここで「使用可能なターゲット:」より「my-cluster」

を選択し、「追加 >」ボタン、もしくは「すべてを追加 >>」ボタンを押下して

ください。「選択したターゲット:」に「my-cluster」が含まれていることを確

認し、最後に「保存」ボタンを押下してください。

ボタンを押下すると下記の画面が表示されます。

図 97:アプリケーション・ターゲットの管理

図 98:クラスタ環境におけるアプリケーションの有効化

Page 80: NetBeans8 とGlassFish v4 - 日本オラクル | Integrated … ·  · 2015-04-15Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1 3 1.0 はじめに Java EE 7 は Java ...

Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1

80

アプリケーションがクラスタ環境で有効になりましたので、クラスタの各イン

スタンスに接続しアプリケーションが正常に動作しているか確認を行ってくだ

さい。動作確認を行うために、まずクラスタ内の各インスタンスがどのポート

番号で HTTPリクエストを待ち受けているかを確認します。左ペインの「クラス

タ」ツリーを展開し、「my-cluster」を選択してください。選択すると下記の

画面が表示されます。

ここで「インスタンス」タブを選択してください。選択すると下記の画面が表

示されます。ここで「instance1」のリンクを選択してください。

図 99:GlassFish クラスタの各インスタンスの詳細確認

図 100:クラスタ化されたサーバ・インスタンス一覧

Page 81: NetBeans8 とGlassFish v4 - 日本オラクル | Integrated … ·  · 2015-04-15Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1 3 1.0 はじめに Java EE 7 は Java ...

Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1

81

リンクを選択すると下記の画面が表示されます。ここで「プロパティ」タブを

選択してください。

「プロパティ」タブを選択すると下記の画面が表示されます。ここで

「HTTP_LISTENER_PORT」と記載されている変数名の「現在の値」を確認してく

ださい。

図 102:インスタンスのシステム・プロパティ

図 101:インスタンスの一般情報

Page 82: NetBeans8 とGlassFish v4 - 日本オラクル | Integrated … ·  · 2015-04-15Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1 3 1.0 はじめに Java EE 7 は Java ...

Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1

82

同様に、「instance2」の HTTPリスナーポート番号を調べてください。

上記のシステムでは、「instance1」に「28080」が「instance2」に「28081」

が設定されてました。

ブラウザで、各インスタンスに接続し稼働していることを確認してください。

http://localhost:28080

http://localhost:28081

それぞれのインスタンスで、下記のように正常に表示されていることを確認し

てください。

図 103:GlassFish のクラスタ化されたインスタンスの動作確認

Page 83: NetBeans8 とGlassFish v4 - 日本オラクル | Integrated … ·  · 2015-04-15Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1 3 1.0 はじめに Java EE 7 は Java ...

Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1

83

各インスタンスの HTTPポート番号が分かりましたので、WebSocketアプリケー

ションに接続してください。ここで、「サーバ接続ポート番号」に一つのブラ

ウザでは「localhost:28080」を、そしてもう一つのブラウザには

「localhost:28081」と入力しそれぞれ「Connect」ボタンを押下してください。

図 104:情報受信者用の画面の表示

Page 84: NetBeans8 とGlassFish v4 - 日本オラクル | Integrated … ·  · 2015-04-15Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1 3 1.0 はじめに Java EE 7 は Java ...

Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1

84

次に、情報提供者側の JSFのアプリケーションを別のブラウザ、もしくはタブ

で表示してください。

http://localhost:28080/WebSocket-HoL/

もしくは、

http://localhost:28081/WebSocket-HoL/

図 105:情報提供者用の画面表示

全ての画面を表示したのち、情報提供者用の画面から文字を入力してください。

情報受信者用の画面に同じ文字が表示されることを確認できます。

図 106:クラスタ環境でのアプリケーション実行

Page 85: NetBeans8 とGlassFish v4 - 日本オラクル | Integrated … ·  · 2015-04-15Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1 3 1.0 はじめに Java EE 7 は Java ...

Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1

85

今回、GlassFish のクラスタ環境で WebSocketアプリケーションを作成しまし

た。ステップバイステップで HoL 資料を作成しているためページ数は多くなっ

ていますが、実際のコード記述量は決して多くありません。

JMSと組み合わせることでクラスタ環境でもアプリケーションの変更は一切な

く WebSocket アプリケーションを大規模に展開できることがわかりました。今

回は、リアルタイムのメッセージ配信システムを構築しましたが、今回のアプ

リケーションを応用し、またアイディア次第で様々な大規模 WebSocketアプリ

ケーションを構築できるようになるかと思います。是非 Java EE 7の機能を

色々とお試しください。

Page 86: NetBeans8 とGlassFish v4 - 日本オラクル | Integrated … ·  · 2015-04-15Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1 3 1.0 はじめに Java EE 7 は Java ...

Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1

86

ボーナス演習:jBatch アプリケーションの作成 Java EE 7では、企業システムで多用されているバッチ処理機能を Javaで実装

するための仕様として「JSR 352: Batch Applications for the Java Platform

(以降、jBatch)」が提供されています。

jBatchより、Javaによるバッチ処理を標準化された技術や APIを使用して実装

し、GlassFish のような Java EE 7 準拠のコンテナで動作させることが可能に

なります。

この jBatchの主な構成要素としては下図のようなものが挙げられます。

Copyright © 2015, Oracle and/or its affiliates. All rights reserved.1

WebSocketで動作するアプリ(Model の実装例)jBatchの構成要素

Job

Step 1

Step 2

Step 3

ItemReader

ItemProcessor

ItemWriter

ItemReader

ItemProcessor

ItemWriter

batchlet

JobOperator

Job Repository

図 B1:jBatch の構成要素

バッチ処理は、Jobとして構成します。JobOperatorは、Jobの実行や再実行の

制御を行ったり、Jobの実行状況など管理します。

1つの Jobには、複数の Stepを構成することができ、処理の順序制御を定義し

ます。

例えば、Step をグループ化したり、条件による分岐実行、並列実行など行うこ

とができます。

また Step内には、下記の実装を構成します。

Chunk式の場合、1つの Stepに下記の 3つの実装を含めます。

ItemReader : ソースからデータを読込む処理を実装するクラス

ItemProcessor:ItemReaderで読込んだデータに対する処理を実装するクラス

ItemWriter : 処理済のデータを書込み、コミットする処理を実装するクラス

Batchlet式の場合、1つの Stepに 1つの実装クラスを含めます。

Batchlet: 任意のバッチ処理を実装するクラス

Page 87: NetBeans8 とGlassFish v4 - 日本オラクル | Integrated … ·  · 2015-04-15Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1 3 1.0 はじめに Java EE 7 は Java ...

Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1

87

Chunk式ではデータに対する処理のチェックポイント情報を管理できるため

処理済のデータを対象にしないように JOBを再実行することもできます。

Batchlet式は、シンプルにその Step で実行したい任意の処理を実装します。

これら Jobや Stepやそのフロー、Stepに含まれる実装の指定については XML

ファイルで定義します。

それでは実際に jBatchアプリケーションを作成してみましょう。

今回は下記のようなシンプルな jBatch アプリケーションを作成します。

Copyright © 2015, Oracle and/or its affiliates. All rights reserved.2

WebSocketで動作するアプリ(Model の実装例)作成するjBatchアプリケーション

Job:simplejob

Step:

mychunk

Step:

mytask

MyReader

MyProcessor

MyWriter

MyBatchlet

Servlet:JobStartServlet

ファイルから文字列を1行読込む

読み込んだ文字列を大文字に変換

変換した文字列を別ファイルに書込む

mychunkステップで作成されたファイルのサイズを出力する

JobOperatorを使用してJob開始

javaee7

netbeans

JAVAEE7

NETBEANS

test_in.txt

test_out.txt

図 B2:作成する jBatch アプリケーションのイメージ

このアプリケーションでは、simplejob という名前の Jobを定義します。

simplejobには、mychunk、mytask という 2つの Step を定義し、mychunk ステ

ップ終了後に mytaskステップが実行されるフローにします。

mychunkステップでは、chunk式の実装クラスを作成し、あるファイルを 1行づ

つ読込み、読み込んだ文字列を大文字化し、最終的に別のファイルに書出すと

いう処理を行います。

mytaskステップでは、Batchlet式の実装クラスを用意し、mychunkステップで

書き込んだファイルのサイズを標準出力に書き出す処理を行います。

今回は、サーブレットから JobOperator を使用してこの simplejobの実行を開

始します。

なお、この演習では Java コードや XML などの入力が多いため、この PDF ファ

イルから随時コピー・ペーストを行って下さい。

Page 88: NetBeans8 とGlassFish v4 - 日本オラクル | Integrated … ·  · 2015-04-15Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1 3 1.0 はじめに Java EE 7 は Java ...

Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1

88

まず、mychunk ステップで読込むファイルを作成します。

テキスト・エディタを使用して、test_in.txtというファイルを作成し、下記

のように半角小文字で文字列を複数行入力して保存します。

このハンズオンでは、 C:\Temp\test_in.txt(Windows)で作成した前提とします。

図 B3:読込むファイルの内容

次に、jBatch アプリケーション用の新規プロジェクトを作成します。

メニューから「ファイル (F)」→「新規プロジェクト(W)...」を選択してくだ

さい。

図 B4:新規プロジェクト

Page 89: NetBeans8 とGlassFish v4 - 日本オラクル | Integrated … ·  · 2015-04-15Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1 3 1.0 はじめに Java EE 7 は Java ...

Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1

89

「新規プロジェクト(W)...」を選択すると下記のウィンドウが表示されます。

「カテゴリ(C) :」より「Java Web」を選択し、「プロジェクト(P):」より

「Webアプリケーション」を選択し「次 >」ボタンを押下してください。

図 B5:プロジェクト選択

「次 >」ボタンを押下すると下記のウィンドウが表示されます。「プロジェク

ト名:」に「jBatch-HoL」と入力し「次 >」ボタンを押下してください。

図 B6:プロジェクト名と場所

Page 90: NetBeans8 とGlassFish v4 - 日本オラクル | Integrated … ·  · 2015-04-15Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1 3 1.0 はじめに Java EE 7 は Java ...

Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1

90

「次 >」ボタンを押下すると下記の画面が表示されます。「コンテキスト・パ

ス(P):」の変更は今回不要なので、そのまま「終了」ボタンを押下してくださ

い。

図 B7:サーバーと設定

「終了(F)」ボタンを押下すると下記の画面が表示されます。

図 B8:プロジェクト作成後の状態

Page 91: NetBeans8 とGlassFish v4 - 日本オラクル | Integrated … ·  · 2015-04-15Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1 3 1.0 はじめに Java EE 7 は Java ...

Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1

91

今回作成するアプリケーションに必要なライブラリをプロジェクトに追加しま

す。

はじめにプロジェクトをマウスで選択してください。選択したのち、右クリッ

クし「プロパティ」を選択してください。

図 B9:プロジェクトのプロパティ

選択すると、下記のウィンドウが表示されます。ここで「カテゴリ(C):」より

「ライブラリ」を選択し、右側にある「ライブラリの追加(L) ...」ボタンを押下

してください。

図 B10:プロジェクトへライブラリ追加

Page 92: NetBeans8 とGlassFish v4 - 日本オラクル | Integrated … ·  · 2015-04-15Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1 3 1.0 はじめに Java EE 7 は Java ...

Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1

92

ボタンを押下すると下記のウィンドウが表示されます。ここでは「Java EE 7

APIライブラリ」を選択して「ライブラリの追加」ボタンを押下して下さい。

図 B11:追加するライブラリの選択

ボタンを押下すると下記のウィンドウが表示されます。「コンパイル時ライブラ

リ」に「Java EE 7 API ライブラリ」が追加されていることを確認し、「OK」ボタン

を押下して下さい。

図 B12:追加されたライブラリの確認

次に Job内のステップやフロー、実装クラスなどを定義する XMLファイルを作

成します。この Job定義 XMLファイルは「META-INF\batch-jobs」というフォルダ

に配置する必要があるため、このフォルダを作成します。

Page 93: NetBeans8 とGlassFish v4 - 日本オラクル | Integrated … ·  · 2015-04-15Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1 3 1.0 はじめに Java EE 7 は Java ...

Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1

93

「ソース・パッケージ」をマウスで選択してください。選択したのち、右クリッ

クし「新規...」→「フォルダ」を選択してください。

図 B13:フォルダの作成

選択すると下記のウィンドウが表示されます。ここで「フォルダ名(N):」に

「META-INF\batch-jobs」を入力し、最後に「終了(F)」ボタンを押下してくだ

さい。

図 B14:フォルダ名と場所の指定

ボタンを押下すると、プロジェクトの「ソース・パッケージ」フォルダ配下に

「META-INF batch-jobs」フォルダが作成されます。実際は、「META-INF」フォル

ダの下に「batch-jobs」フォルダが作成されています。

Page 94: NetBeans8 とGlassFish v4 - 日本オラクル | Integrated … ·  · 2015-04-15Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1 3 1.0 はじめに Java EE 7 は Java ...

Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1

94

図 B15:作成したフォルダの確認

フォルダを作成したので、次に Job を定義する XMLファイルを作成します。

ソース・パッケージの「META-INF batch-jobs」をマウスで選択してください。選

択したのち、右クリックし「新規...」→「その他」を選択してください。

図 B16:XML ファイルの作成

Page 95: NetBeans8 とGlassFish v4 - 日本オラクル | Integrated … ·  · 2015-04-15Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1 3 1.0 はじめに Java EE 7 は Java ...

Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1

95

選択すると下記のウィンドウが表示されます。「カテゴリ(C) :」より「XML」

を選択し、「ファイルタイプ(F):」より「XML ドキュメント」を選択し「次 >」

ボタンを押下してください。

図 B17:ファイルタイプの選択

「次 >」ボタンを押下すると下記のウィンドウが表示されます。「ファイル名

名(N):」に「simplejob」と入力し「次 >」ボタンを押下してください。

図 B18:ファイル名と場所の指定

Page 96: NetBeans8 とGlassFish v4 - 日本オラクル | Integrated … ·  · 2015-04-15Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1 3 1.0 はじめに Java EE 7 は Java ...

Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1

96

「次 >」ボタンを押下すると下記のウィンドウが表示されます。「整形式のド

キュメント」を選択し「終了(F)」ボタンを押下してください。

図 B19:ドキュメント・タイプの選択

ボタンを押下すると下記の XMLが自動生成されます。

<?xml version="1.0" encoding="UTF-8"?>

<!--

To change this license header, choose License Headers in Project

Properties.

To change this template file, choose Tools | Templates

and open the template in the editor.

-->

<root>

</root>

Page 97: NetBeans8 とGlassFish v4 - 日本オラクル | Integrated … ·  · 2015-04-15Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1 3 1.0 はじめに Java EE 7 は Java ...

Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1

97

自動生成された XMLファイルを下記のように修正してください。

(必要に応じて、この PDFファイルの内容からコピー・ペーストを行って下さ

い。) <?xml version="1.0" encoding="UTF-8"?>

<job id="simplejob"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee

http://www.oracle.com/webfolder/technetwork/jsc/xml/ns/javaee/jobXML_

1_0.xsd"

xmlns="http://xmlns.jcp.org/xml/ns/javaee" version="1.0"

>

<properties>

<property name="input_file" value="c:\\temp\\test_in.txt"/>

<property name="output_file" value="c:\\temp\\test_out.txt"/>

</properties>

<step id="mychunk" next="mytask">

<chunk>

<reader ref="MyReader"></reader>

<processor ref="MyProcessor"></processor>

<writer ref="MyWriter"></writer>

</chunk>

</step>

<step id="mytask">

<batchlet ref="MyBatchlet"></batchlet>

<end on="COMPLETED"/>

</step>

</job>

上記では、job 要素と step要素を使用し、mychunkステップと mytaskステップ

を含む simplejob という Jobを定義しています。

mychunkステップを定義する step 要素の next属性で、mytaskステップを指定

しており、mychunk ステップ終了後に mytaskステップを実行するというフロー

を定義しています。 mytaskステップでは、end要素にて、この Jobの終了ステ

ータスが正常終了になるための条件を設定しています。今回は、Batchlet が on

属性で指定した文字列 "COMPLETED"を返した場合に正常終了とします。

また、mychunk ステップの chunk要素と mytaskステップの batchlet要素で、

それぞれ実装クラスを指定しています。さらに properties 要素で mychunk ステ

ップの中で読込むファイル、書込むファイルの物理パスを Jobのプロパティと

して指定しています。これらは実装クラスからプロパティ名を指定することで

取得することができます。

Page 98: NetBeans8 とGlassFish v4 - 日本オラクル | Integrated … ·  · 2015-04-15Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1 3 1.0 はじめに Java EE 7 は Java ...

Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1

98

それでは、各ステップのバッチ処理を実装していきます。

まず、mychunk ステップでデータのチェックポイントを管理するためのクラス

を作成します。

プロジェクトをマウスで選択してください。選択したのち、右クリックし「新

規...」→「Java クラス」を選択してください。

図 B20:チェックポイント情報を管理するクラスの作成

選択すると下記のウィンドウが表示されます。「クラス名(N) :」に

「MyCheckpoint」を入力し、「パッケージ(K):」に「jp.co.oracle.batch」と

入力し「終了」ボタンを押下してください。

図 B21:ファイル名と場所の指定

Page 99: NetBeans8 とGlassFish v4 - 日本オラクル | Integrated … ·  · 2015-04-15Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1 3 1.0 はじめに Java EE 7 は Java ...

Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1

99

ボタンを押下すると下記のコードが自動生成されます。

/*

* To change this license header, choose License Headers in Project

Properties.

* To change this template file, choose Tools | Templates

* and open the template in the editor.

*/

package jp.co.oracle.batch;

/**

*

* @author tnobe

*/

public class MyCheckpoint {

}

コードを下記のように修正してください。下記は、チェックポイントとして処

理しているファイルの行数を管理するためのコードです。

import java.io.Serializable;

public class MyCheckpoint implements Serializable {

private long lineNum = 0;

public void increase() {

lineNum++;

}

public long getLineNum() {

return lineNum;

}

}

Page 100: NetBeans8 とGlassFish v4 - 日本オラクル | Integrated … ·  · 2015-04-15Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1 3 1.0 はじめに Java EE 7 は Java ...

Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1

100

次に mychunk ステップの ItemReader となる MyReader クラスを作成します。

ソース・パッケージの「jp.co.oracle.batch」をマウスで選択してください。選

択したのち、右クリックし「新規...」→「Java クラス」を選択してください。

図 B22:MyReader クラスの作成

選択すると下記のウィンドウが表示されます。「クラス名(N) :」に「MyReader」

を入力し、「パッケージ(K):」に「jp.co.oracle.batch」が設定されているこ

とを確認し、「終了」ボタンを押下してください。

図 B23:ファイル名と場所の指定

Page 101: NetBeans8 とGlassFish v4 - 日本オラクル | Integrated … ·  · 2015-04-15Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1 3 1.0 はじめに Java EE 7 は Java ...

Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1

101

ボタンを押下すると下記のコードが自動生成されます。 /*

* To change this license header, choose License Headers in Project

Properties.

* To change this template file, choose Tools | Templates

* and open the template in the editor.

*/

package jp.co.oracle.batch;

/**

*

* @author tnobe

*/

public class MyReader {

}

まずコードを下記のように修正してください。 public class MyReader implements javax.batch.api.chunk.ItemReader {

}

次に、ソースの行番号部分の電球アイコン(下記の丸印部分)をマウスでクリ

ックします。クリックするとポップアップ・メニューが表示されます。そのメ

ニューから「すべての抽象メソッドを実装」を選択してください。

図 B24:抽象メソッドの実装

「すべての抽象メソッドを実装」メニューを選択すると下記のメソッドのコード

が自動生成されます。

public class MyReader implements javax.batch.api.chunk.ItemReader {

@Override

public void open(Serializable checkpoint) throws Exception {

throw new UnsupportedOperationException("Not supported

yet."); //To change body of generated methods, choose Tools |

Templates.

}

Page 102: NetBeans8 とGlassFish v4 - 日本オラクル | Integrated … ·  · 2015-04-15Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1 3 1.0 はじめに Java EE 7 は Java ...

Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1

102

@Override

public void close() throws Exception {

throw new UnsupportedOperationException("Not supported

yet."); //To change body of generated methods, choose Tools |

Templates.

}

@Override

public Object readItem() throws Exception {

throw new UnsupportedOperationException("Not supported

yet."); //To change body of generated methods, choose Tools |

Templates.

}

@Override

public Serializable checkpointInfo() throws Exception {

throw new UnsupportedOperationException("Not supported

yet."); //To change body of generated methods, choose Tools |

Templates.

}

}

コードを下記のように修正してください。 package jp.co.oracle.batch;

import java.io.BufferedReader;

import java.io.FileReader;

import java.io.Serializable;

import javax.batch.runtime.context.JobContext;

import javax.enterprise.context.Dependent;

import javax.inject.Inject;

import javax.inject.Named;

@Dependent

@Named("MyReader")

public class MyReader implements javax.batch.api.chunk.ItemReader {

private MyCheckpoint mycheckpoint;

private BufferedReader breader;

@Inject

JobContext jobCtx;

public MyReader() {

}

@Override

public void open(Serializable checkpoint) throws Exception {

if (checkpoint == null) {

mycheckpoint = new MyCheckpoint();

} else {

mycheckpoint = (MyCheckpoint) checkpoint;

}

String fileName = jobCtx.getProperties()

.getProperty("input_file");

breader = new BufferedReader(new FileReader(fileName));

for (long i = 0; i < mycheckpoint.getLineNum(); i++) {

breader.readLine();

}

Page 103: NetBeans8 とGlassFish v4 - 日本オラクル | Integrated … ·  · 2015-04-15Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1 3 1.0 はじめに Java EE 7 は Java ...

Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1

103

}

@Override

public void close() throws Exception {

breader.close();

}

@Override

public Object readItem() throws Exception {

String line = breader.readLine();

return line;

}

@Override

public Serializable checkpointInfo() throws Exception {

return mycheckpoint;

}

}

上記のコードについては、下表を参考にして下さい。

ItemReader のメソッド メソッドの用途 MyReader の実装 void open(Serializable checkpoint) 処理対象のデータのソ

ースにアクセスし引数

のチェックポイントか

ら対象データを選別。

ファイルを開き、チ

ェックポイント情報

をもとに

BufferdReaderで対

象の行まで読込み位

置を進める void close() openメソッドで使用

したリソースを解放す

る。

BufferdReaderをク

ローズ。

Object readItem() データを 1件取出す。

null を返すと取出し完

了となる。

BufferdReaderでデ

ータを 1行読込む。

Serializable checkpointInfo() チェックポイント情報

を返す。(Job

Repository 側でカウン

トさせるため)

MyCheckpointのイン

スタンスを返す。

Page 104: NetBeans8 とGlassFish v4 - 日本オラクル | Integrated … ·  · 2015-04-15Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1 3 1.0 はじめに Java EE 7 は Java ...

Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1

104

次に mychunk ステップの ItemProcessor となる MyProcessor クラスを作成しま

す。

ソース・パッケージの「jp.co.oracle.batch」をマウスで選択してください。選

択したのち、右クリックし「新規...」→「Java クラス」を選択してください。

図 B25:MyProcessor クラスの作成

選択すると下記のウィンドウが表示されます。「クラス名(N) :」に

「MyProcessor」を入力し、「パッケージ(K):」に「jp.co.oracle.batch」が設

定されていることを確認し、「終了」ボタンを押下してください。

図 B26:ファイル名と場所の指定

Page 105: NetBeans8 とGlassFish v4 - 日本オラクル | Integrated … ·  · 2015-04-15Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1 3 1.0 はじめに Java EE 7 は Java ...

Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1

105

ボタンを押下すると下記のコードが自動生成されます。 /*

* To change this license header, choose License Headers in Project

Properties.

* To change this template file, choose Tools | Templates

* and open the template in the editor.

*/

package jp.co.oracle.batch;

/**

*

* @author tnobe

*/

public class MyProcessor {

}

まずコードを下記のように修正してください。 public class MyProcessor

implements javax.batch.api.chunk.ItemProcessor {

}

次に、ソースの行番号部分の電球アイコン(下記の丸印部分)をマウスでクリ

ックします。クリックするとポップアップ・メニューが表示されます。そのメ

ニューから「すべての抽象メソッドを実装」を選択してください。

図 B27:抽象メソッドの実装

Page 106: NetBeans8 とGlassFish v4 - 日本オラクル | Integrated … ·  · 2015-04-15Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1 3 1.0 はじめに Java EE 7 は Java ...

Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1

106

「すべての抽象メソッドを実装」メニューを選択すると下記のメソッドのコード

が自動生成されます。 public class MyProcessor

implements javax.batch.api.chunk.ItemProcessor {

@Override

public Object processItem(Object item) throws Exception {

throw new UnsupportedOperationException("Not supported

yet."); //To change body of generated methods, choose Tools |

Templates.

}

}

コードを下記のように修正してください。 package jp.co.oracle.batch;

import javax.enterprise.context.Dependent;

import javax.inject.Named;

@Dependent

@Named("MyProcessor")

public class MyProcessor implements

javax.batch.api.chunk.ItemProcessor {

public MyProcessor() {

}

@Override

public Object processItem(Object item) throws Exception {

String line = (String) item;

return line.toUpperCase();

}

}

上記のコードについては、下表を参考にして下さい。

ItemProcessor のメソッド メソッドの用途 MyProcessor の実装 Object processItem(Object item) ItemReader の

readItem()メソッドで

読込まれたデータに対

して必要な処理を行

う。

データ(文字列)を

大文字化する。

Page 107: NetBeans8 とGlassFish v4 - 日本オラクル | Integrated … ·  · 2015-04-15Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1 3 1.0 はじめに Java EE 7 は Java ...

Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1

107

次に mychunk ステップの ItemWrite となる MyWriterクラスを作成します。

ソース・パッケージの「jp.co.oracle.batch」をマウスで選択してください。選

択したのち、右クリックし「新規...」→「Java クラス」を選択してください。

図 B28:MyWriter クラスの作成

選択すると下記のウィンドウが表示されます。「クラス名(N) :」に「MyWriter」

を入力し、「パッケージ(K):」に「jp.co.oracle.batch」が設定されているこ

とを確認し、「終了」ボタンを押下してください。

図 B29:ファイル名と場所の指定

Page 108: NetBeans8 とGlassFish v4 - 日本オラクル | Integrated … ·  · 2015-04-15Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1 3 1.0 はじめに Java EE 7 は Java ...

Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1

108

ボタンを押下すると下記のコードが自動生成されます。 /*

* To change this license header, choose License Headers in Project

Properties.

* To change this template file, choose Tools | Templates

* and open the template in the editor.

*/

package jp.co.oracle.batch;

/**

*

* @author tnobe

*/

public class MyWriter {

}

まずコードを下記のように修正してください。 public class MyWriter implements javax.batch.api.chunk.ItemWriter {

}

次に、ソースの行番号部分の電球アイコン(下記の丸印部分)をマウスでクリ

ックします。クリックするとポップアップ・メニューが表示されます。そのメ

ニューから「すべての抽象メソッドを実装」を選択してください。

図 B30:抽象メソッドの実装

「すべての抽象メソッドを実装」メニューを選択すると下記のメソッドのコード

が自動生成されます。 public class MyWriter implements javax.batch.api.chunk.ItemWriter {

@Override

public void open(Serializable checkpoint) throws Exception {

throw new UnsupportedOperationException("Not supported

yet."); //To change body of generated methods, choose

Tools | Templates.

}

Page 109: NetBeans8 とGlassFish v4 - 日本オラクル | Integrated … ·  · 2015-04-15Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1 3 1.0 はじめに Java EE 7 は Java ...

Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1

109

@Override

public void close() throws Exception {

throw new UnsupportedOperationException("Not supported

yet."); //To change body of generated methods, choose

Tools | Templates.

}

@Override

public void writeItems(List<Object> items) throws Exception {

throw new UnsupportedOperationException("Not supported

yet."); //To change body of generated methods, choose

Tools | Templates.

}

@Override

public Serializable checkpointInfo() throws Exception {

throw new UnsupportedOperationException("Not supported

yet."); //To change body of generated methods, choose

Tools | Templates.

}

}

コードを下記のように修正してください。 package jp.co.oracle.batch;

import java.io.BufferedWriter;

import java.io.FileWriter;

import java.io.Serializable;

import java.util.List;

import javax.batch.runtime.context.JobContext;

import javax.enterprise.context.Dependent;

import javax.inject.Inject;

import javax.inject.Named;

@Dependent

@Named("MyWriter")

public class MyWriter implements javax.batch.api.chunk.ItemWriter {

private BufferedWriter bwriter;

@Inject

private JobContext jobCtx;

@Override

public void open(Serializable checkpoint) throws Exception {

String fileName = jobCtx.getProperties()

.getProperty("output_file");

bwriter = new BufferedWriter(new FileWriter(fileName,

(checkpoint != null)));

}

@Override

public void close() throws Exception {

bwriter.close();

}

@Override

public void writeItems(List<Object> items) throws Exception {

for (int i = 0; i < items.size(); i++) {

Page 110: NetBeans8 とGlassFish v4 - 日本オラクル | Integrated … ·  · 2015-04-15Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1 3 1.0 はじめに Java EE 7 は Java ...

Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1

110

String line = (String) items.get(i);

bwriter.write(line);

bwriter.newLine();

}

}

@Override

public Serializable checkpointInfo() throws Exception {

return new MyCheckpoint();

}

}

上記のコードについては、下表を参考にして下さい。

ItemWriter のメソッド メソッドの用途 MyWriter の実装 void open(Serializable checkpoint) 主に処理対象のデー

タの書込みの事前準

備処理を実装。また

引数のチェックポイ

ントを使用しデータ

の対象を選別。

書込み用ファイルを

と BufferdWriter を

生成。チェックポイ

ント情報が null なら

ファイルは上書き作

成。nullでなければ

Appendモード。 void close() openメソッドで使

用したリソースを解

放する。

BufferdWriterをク

ローズ。

Void writeItems(List<Object> items) 引数のデータを全て

1トランザクション

で書込む。

BufferdWriterに引

数のデータを全て書

込み Serializable checkpointInfo() チェックポイント情

報を返す。(Job

Repository側でカウ

ントさせるため)

MyCheckpointのイン

スタンスを返す。

Page 111: NetBeans8 とGlassFish v4 - 日本オラクル | Integrated … ·  · 2015-04-15Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1 3 1.0 はじめに Java EE 7 は Java ...

Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1

111

次に mytaskステップの Batchlet となる MyBatchletクラスを作成します。

ソース・パッケージの「jp.co.oracle.batch」をマウスで選択してください。選

択したのち、右クリックし「新規...」→「Java クラス」を選択してください。

図 B31:MyBatchlet クラスの作成

選択すると下記のウィンドウが表示されます。「クラス名(N) :」に

「MyBatchlet」を入力し、「パッケージ(K):」に「jp.co.oracle.batch」が設

定されていることを確認し、「終了」ボタンを押下してください。

図 B32:ファイル名と場所の指定

Page 112: NetBeans8 とGlassFish v4 - 日本オラクル | Integrated … ·  · 2015-04-15Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1 3 1.0 はじめに Java EE 7 は Java ...

Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1

112

ボタンを押下すると下記のコードが自動生成されます。 /*

* To change this license header, choose License Headers in Project

Properties.

* To change this template file, choose Tools | Templates

* and open the template in the editor.

*/

package jp.co.oracle.batch;

/**

*

* @author tnobe

*/

public class MyBatchlet {

}

まずコードを下記のように修正してください。 public class MyBatchlet implements javax.batch.api.Batchlet {

}

次に、ソースの行番号部分の電球アイコン(下記の丸印部分)をマウスでクリ

ックします。クリックするとポップアップ・メニューが表示されます。そのメ

ニューから「すべての抽象メソッドを実装」を選択してください。

図 B33:抽象メソッドの実装

「すべての抽象メソッドを実装」メニューを選択すると下記のメソッドのコード

が自動生成されます。 public class MyBatchlet implements javax.batch.api.Batchlet{

@Override

public String process() throws Exception {

throw new UnsupportedOperationException("Not supported

yet."); //To change body of generated methods, choose

Tools | Templates.

}

Page 113: NetBeans8 とGlassFish v4 - 日本オラクル | Integrated … ·  · 2015-04-15Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1 3 1.0 はじめに Java EE 7 は Java ...

Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1

113

@Override

public void stop() throws Exception {

throw new UnsupportedOperationException("Not supported

yet."); //To change body of generated methods, choose

Tools | Templates.

}

}

コードを下記のように修正してください。 package jp.co.oracle.batch;

import java.io.File;

import javax.batch.runtime.context.JobContext;

import javax.enterprise.context.Dependent;

import javax.inject.Inject;

import javax.inject.Named;

@Dependent

@Named("MyBatchlet")

public class MyBatchlet implements javax.batch.api.Batchlet{

@Inject

private JobContext jobCtx;

@Override

public String process() throws Exception {

String fileName = jobCtx.getProperties()

.getProperty("output_file");

System.out.println("FILE LENGTH:" + (new

File(fileName)).length());

return "COMPLETED";

}

@Override

public void stop() throws Exception {

// Nothing

}

}

上記のコードについては、下表を参考にして下さい。

Batchlet のメソッド メソッドの用途 MyBatchlet の実装 String process() 任意の処理を行う mychunkステップで

書き込んだファイル

サイズを取得し、標

準出力に出力。

JOB定義 XMLの end

要素の on属性に指定

した正常終了するた

めの文字列

"COMPLETED"を返す。 void stop() JobOperator で stop メ (無し)

Page 114: NetBeans8 とGlassFish v4 - 日本オラクル | Integrated … ·  · 2015-04-15Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1 3 1.0 はじめに Java EE 7 は Java ...

Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1

114

ソッドが実行されたと

きに必要な処理を行う

以上で、バッチ Jobの実装は完了です。

この時点で、プロジェクトには下記のファイルが作成されていることを確認s

ます。

図 B34:バッチ処理実装クラスの確認

次にバッチの Jobを実行するためのサーブレットを作成します。

プロジェクトをマウスで選択してください。選択したのち、右クリックし「新

規...」→「サーブレット」を選択してください。

図 B35:Job を開始するサーブレットの作成

Page 115: NetBeans8 とGlassFish v4 - 日本オラクル | Integrated … ·  · 2015-04-15Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1 3 1.0 はじめに Java EE 7 は Java ...

Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1

115

選択すると下記のウィンドウが表示されます。「クラス名(N) :」に

「JobStartServlet」を入力し、「パッケージ(K):」に「jp.co.oracle.servlet」

と入力し「次 >」ボタンを押下してください。

図 B36:サーブレットのクラス名と場所の指定

ボタンを押下すると下記のウィンドウが表示されます。「URLパターン(複数

可)」に「/JobStartServlet」と設定されていることを確認し、「終了」ボタンを

押下してください。

図 B37:サーブレット名や URL パターンの指定

Page 116: NetBeans8 とGlassFish v4 - 日本オラクル | Integrated … ·  · 2015-04-15Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1 3 1.0 はじめに Java EE 7 は Java ...

Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1

116

ボタンを押下するとサーブレットのコードが自動生成されます。

今回、このサーブレットで JobOperator を使用して Job を開始し、その Job の

ID や開始時間、終了時間、終了ステータスを取得、表示する処理を実装します。

まず、サーブレットのコードに下記のように import 文を追加して下さい。

/*

* To change this license header, choose License Headers in Project

Properties.

* To change this template file, choose Tools | Templates

* and open the template in the editor.

*/

package jp.co.oracle.servlet;

import java.io.IOException;

import java.io.PrintWriter;

import javax.servlet.ServletException;

import javax.servlet.annotation.WebServlet;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import javax.batch.operations.JobOperator;

import javax.batch.runtime.BatchRuntime;

import javax.batch.runtime.JobExecution;

import java.util.Date;

その後、サーブレットの「processRequest」メソッドの中に、下記のようにコー

ドを追加して下さい。

protected void processRequest(HttpServletRequest request,

HttpServletResponse response)

throws ServletException, IOException {

response.setContentType("text/html;charset=UTF-8");

try (PrintWriter out = response.getWriter()) {

/* TODO output your page here. You may use following

sample code. */

out.println("<!DOCTYPE html>");

out.println("<html>");

out.println("<head>");

out.println("<title>Servlet JobStartServlet</title>");

out.println("</head>");

out.println("<body>");

out.println("<h1>Servlet JobStartServlet at " +

request.getContextPath() + "</h1>");

//

JobOperator job = BatchRuntime.getJobOperator();

long id = job.start("simplejob", null);

JobExecution je = job.getJobExecution(id);

String jobName = je.getJobName();

Date startTime = je.getStartTime();

out.println( "JOB:" + jobName + ", STARTED:" + startTime

+ ",ID: " + id + "<BR>");

try {

Thread.sleep(1000L);

Page 117: NetBeans8 とGlassFish v4 - 日本オラクル | Integrated … ·  · 2015-04-15Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1 3 1.0 はじめに Java EE 7 は Java ...

Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1

117

}

catch (Exception ex) {

ex.printStackTrace();

}

Date endTime = je.getEndTime();

String exitStatus = je.getExitStatus();

out.println( "JOB:" + jobName + ", ENDED:" + endTime +

",exitStatus:" + exitStatus);

//

out.println("</body>");

out.println("</html>");

}

}

この時点で、プロジェクトには下記のファイルが作成されていることを確認し

ます。

図 B38:プロジェクトの確認

確認後、プロジェクトを実行してください。

図 B39:プロジェクトの実行

Page 118: NetBeans8 とGlassFish v4 - 日本オラクル | Integrated … ·  · 2015-04-15Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1 3 1.0 はじめに Java EE 7 は Java ...

Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1

118

実行すると Web ブラウザで下記の画面が表示されます。

図 B40:プロジェクトの実行

Webブラウザで下記の URLを指定して JobStartServlet を実行して下さい。

http://localhost:8080/jBatch-HoL/JobStartServlet

サーブレットを実行すると、下記のような画面が表示されます。

図 B42:JobStartServlet の実行

Page 119: NetBeans8 とGlassFish v4 - 日本オラクル | Integrated … ·  · 2015-04-15Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1 3 1.0 はじめに Java EE 7 は Java ...

Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1

119

では Jobの実行結果を確認していきます。

NetBeans の「GlassFish 4.1」のコンソールを確認すると「FILE LENGTH:」と

ファイルサイズの数値が表示されていることを確認できます。

図 B43:mytask ステップの実行結果

次に、test_out.txt ファイル(この資料では、c:\temp\test_out.txt)が作成

されているかを確認します。また、test_out.txtをテキスト・エディタで開い

て、test_in.txt に入力した文字列が全て大文字になっていることを確認しま

す。

図 B44:mychunk ステップの実行結果確認

以上で、jBatch アプリケーション作成の演習は終了です。

Page 120: NetBeans8 とGlassFish v4 - 日本オラクル | Integrated … ·  · 2015-04-15Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1 3 1.0 はじめに Java EE 7 は Java ...

Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1

120

参考資料・補足

本ハンズオン・ラボの WebSocket-HoLプロジェクトの全ソースコード

https://github.com/yoshioterada/JavaEE7-HoL/

Java EE SDK Download

http://www.oracle.com/technetwork/java/javaee/downloads/index.html

GlassFish/OpenMQ 関連ドキュメント

https://glassfish.java.net/documentation.html

Java EE 7 詳細説明資料

http://www.slideshare.net/OracleMiddleJP/java-ee-7-detail

The Java EE 7 Tutorial

http://docs.oracle.com/javaee/7/tutorial/

Page 121: NetBeans8 とGlassFish v4 - 日本オラクル | Integrated … ·  · 2015-04-15Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1 3 1.0 はじめに Java EE 7 は Java ...

Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1

121

JMS リソースの GUI による設定方法

次に左ペインより、「JMSリソース」のツリーを展開し「接続ファクトリ」を

選択します。選択すると下記の画面が表示されますので「新規...」ボタンを押

下してください。

ボタンを押下すると右ペインに下記の画面が表示されます。ここで「JNDI 名:」

に「jms/topicCon」と入力し「OK」ボタンを押下してください。

図 A:JMS 接続ファクトリ

図 B:新規 JMS 接続ファクトリ

Page 122: NetBeans8 とGlassFish v4 - 日本オラクル | Integrated … ·  · 2015-04-15Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1 3 1.0 はじめに Java EE 7 は Java ...

Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1

122

次に、JMSの「宛先リソース」を作成します。「JMSリソース」のツリーを展開

し「宛先リソース」を選択します。選択すると下記の画面が表示されますので

「新規...」ボタンを押下してください。

ボタンを押下すると右ペインに下記の画面が表示されます。ここで「JNDI 名:」

に「jms/inforegtopic」、「物理宛先名」に「phisicaltopic」と入力し「OK」

ボタンを押下してください。

図 C:JMS 宛先リソース

図 D:新規 JMS 宛先リソース

Page 123: NetBeans8 とGlassFish v4 - 日本オラクル | Integrated … ·  · 2015-04-15Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1 3 1.0 はじめに Java EE 7 は Java ...

Java EE 7 Hands-on Lab using NetBeans 8 and GlassFish 4.1

123

OpenMQ の管理、監視用コマンドのご紹介

OpenMQの imqcmd を利用して、本アプリケーション用に作成した Topic :

phisicaltopic のサブスクライバを確認してみます。下記の imqcmdを実行し、

クライアント IDにインスタンス名(instance1, instance2)が表示され ACTIVE

になっていることを確認できます。OpenMQの状態を確認するためには、imqcmd

を使用し確認できます。

コマンドプロンプトで下記に移動して imqcmdを実行できます。

<GlassFishインストールディレクトリ>\mq\bin

コマンド例> imqcmd list dur -b localhost:27676 -d phisicaltopic

※ ユーザ名:admin, パスワード:admin

図 E:imqcmd の実行例

以上