はじめに
BluemixのランタイムとしてLiberty for Javaを使用するための、開発環境の準備について記載します。
ローカルPCでWebSphere Application Server Liberty Profile(WAS Liberty)を稼働させ、ローカルPCで稼働確認したものをBluemixにPushすることを想定して記載します。
本内容は、以下の3回に分けて投稿する予定です。今回は、第3回目の「データベースサービスを利用するプログラムの開発」です。データベースサービスとして、dashDBを利用します。
前提
以下の内容が完了しているものとして記載します。
- IBM Bluemixのアカウント取得
- アカウント未取得の方は、「IBM Bluemixフリートライアルアカウント作成手順」を参考に、フリートライアル用アカウントを取得ください
- Eclipse IDE for Java EE Developersのダウンロード
- 今回は、Eclipse Neonを利用します
- Eclipseのダウンロードはこちらから
- Java JDK 1.8のインストール
- Liberty for Javaが使用するバージョンに合わせ、JDK 1.8を使用します
- Bluemix Liberty for Javaの開発環境を整える(1/3)に記載された、EclipseのセットアップとWAS Libertyの導入
- Bluemix Liberty for Javaの開発環境を整える(2/3)に記載されたプログラムの開発とBluemixへのデプロイ
作業の流れ
以下の流れで、作業を進めていきます。
- dashDBサービスを作成し、ランタイムにバインドします
- テストデータを投入します
- データベースを利用するようにサンプル・アプリケーションを改修します
- ローカルPCでサンプル・アプリケーションを稼働させ、稼働を確認します
- サンプル・アプリケーションをBluemixにPushし、稼働を確認します
dashDBサービスの作成
Bluemixはいくつかのデータベース・サービスを提供していますが、本稿ではDB2がベースとなっているdashDBサービスを利用します。
dashDBサービスは、GUIの管理画面が用意されており、テストデータの投入や参照をブラウザ上で実施できます。ただし、dashDBサービスは、通常では列指向でテーブルが作成されるため、行指向でテーブルを作成するようにCREATE TABLEのSQLを実行する必要があります。こちらの記事もあわせて参照ください。
サービスの作成
BluemixのWeb管理画面にログインし、ダッシュボードの「すべての項目」から、Bluemix Liberty for Javaの開発環境を整える(2/3)で作成したアプリケーションを選択します。
「データ&分析」カテゴリーにある「dashDB」をクリックします。
「サービス名」に「dashdb−sample」と入力し、「価格プラン」として「Entry」が選択されていることを確認し、「作成」をクリックします。
「サービス名」は、任意の値で構いませんが、後ほどプログラム中で利用します(後述しますが、プログラムから参照するJNDI名の一部となります)。空白を含まない値としてください。また、Entryプランは有償ですが、1GBのデータ量までは無料で利用でき、課金されません。
作成したサービスの情報を反映するため、アプリケーションの再ステージを求めるポップアップが表示されますので、「再ステージ」をクリックします。
再ステージが完了すると、dashDBサービスの作成は完了です。
設定の確認
dashDBを作成すると、Bluemixにはどのような情報が反映されるのかを確認してみます。
「VCAP_SERVICESの確認」で確認する値は、後ほどローカルPCのWAS Libertyの設定に反映しますので、どこかにメモしておいてください。
VCAP_SERVICESの確認
dashDBへの接続情報は、VCAP_SERVICESと呼ばれる環境変数に保管されます。この値を利用して、dashDBにアクセスするプログラムを作成します。(ただし、本稿では、プログラム中にVCAP_SERVICESを参照するコードは記述しません。WAS Libertyの設定に反映し、プログラム中からJNDIのLookupにより値を参照するようにします。)
アプリケーションの「接続」から、作成したdashDBのアイコンにある「資格情報の表示」をクリックします。
VCAP_SERVICESの内容として、以下のような情報が表示されるかと思います。
データベースのIPとポート番号、データベース名、接続ユーザー名とパスワードなどが表示されています。これらの値を後ほど利用しますので、どこかにメモしておいてください。
{
"dashDB": [
{
"credentials": {
"port": Your_Port,
"db": "BLUDB",
"username": "Your_Username",
"ssljdbcurl": "jdbc:db2://Your_Host:Your_SSL_Port/BLUDB:sslConnection=true;",
"host": "Your_Host",
"https_url": "https://Your_Host:8443",
"dsn": "DATABASE=BLUDB;HOSTNAME=Your_Host;PORT=Your_Port;PROTOCOL=TCPIP;UID=Your_Username;PWD=Your_Password;",
"hostname": "Your_Host",
"jdbcurl": "jdbc:db2://Your_Host:Your_Port/BLUDB",
"ssldsn": "DATABASE=BLUDB;HOSTNAME=Your_Host;PORT=Your_SSL_Port;PROTOCOL=TCPIP;UID=Your_Username;PWD=Your_Password;Security=SSL;",
"uri": "db2://Your_Username:Your_Password@Your_Host:Your_Port/BLUDB",
"password": "Your_Password"
},
"syslog_drain_url": null,
"label": "dashDB",
"provider": null,
"plan": "Entry",
"name": "dashDB-sample",
"tags": [
"big_data",
"ibm_created",
"ibm_dedicated_public"
]
}
]
}
Java for Libertyのserver.xmlの確認
Java for LibertyにdashDBサービスをバインドすると、自動的にLibertyの設定にJDBC接続に関する設定が追加されます。
ここで自動設定される値を参考に、ローカルPCでも同じようにWAS Libertyを設定することで、ローカルPCからでもdashDBに接続できるようになります。
アプリケーションの「ランタイム」から「ファイル」をクリックします。
Bluemixにデプロイされているファイルのディレクトリ構造が表示されますので、「app」→「wlp」→「usr」→「servers」→「defaultServer」→「server.xml」の順に選択します。
server.xmlの値として、以下のような情報が表示されるかと思います。
featureとして「jdbc-4.1」が追加されており、また、「dataSource」や「jdbcDriver」の設定が追加されています。
この「dataSource」の設定の中に、「jndiName」が存在します。Javaのプログラムから、このjndiNameをLookupすることで、dashDBへの接続プールからコネクションを取得できます。また、ここで指定されている名前は、先ほどdashDBサービスを作成した際に付与した「サービス名」が使用されています。
<server>
<featureManager>
<feature>beanValidation-1.1</feature>
<feature>cdi-1.2</feature>
<feature>ejbLite-3.2</feature>
<feature>el-3.0</feature>
<feature>jaxrs-2.0</feature>
<feature>jdbc-4.1</feature>
<feature>jndi-1.0</feature>
<feature>jpa-2.1</feature>
<feature>jsf-2.2</feature>
<feature>jsonp-1.0</feature>
<feature>jsp-2.3</feature>
<feature>managedBeans-1.0</feature>
<feature>servlet-3.1</feature>
<feature>websocket-1.1</feature>
<feature>icap:managementConnector-1.0</feature>
<feature>appstate-1.0</feature>
<feature>cloudAutowiring-1.0</feature>
</featureManager>
<application name='myapp' location='myapp.war' type='war' context-root='/'/>
<cdi12 enableImplicitBeanArchives='false'/>
<httpEndpoint id='defaultHttpEndpoint' host='*' httpPort='${port}'/>
<webContainer trustHostHeaderPort='true' extractHostHeaderPort='true'/>
<include location='runtime-vars.xml'/>
<logging logDirectory='${application.log.dir}' consoleLogLevel='INFO'/>
<httpDispatcher enableWelcomePage='false'/>
<applicationMonitor dropinsEnabled='false' updateTrigger='mbean'/>
<config updateTrigger='mbean'/>
<appstate appName='myapp' markerPath='${home}/../.liberty.state'/>
<dataSource id='db2-dashDB-sample' jdbcDriverRef='db2-driver' jndiName='jdbc/dashDB-sample' statementCacheSize='30' transactional='true'>
<properties.db2.jcc id='db2-dashDB-sample-props' databaseName='${cloud.services.dashDB-sample.connection.db}' user='${cloud.services.dashDB-sample.connection.username}' password='${cloud.services.dashDB-sample.connection.password}' portNumber='${cloud.services.dashDB-sample.connection.sslport}' serverName='${cloud.services.dashDB-sample.connection.host}' sslTrustStoreLocation='${java.home}/lib/security/cacerts' sslConnection='true'/>
</dataSource>
<jdbcDriver id='db2-driver' libraryRef='db2-library'/>
<library id='db2-library'>
<fileset id='db2-fileset' dir='${server.config.dir}/lib' includes='db2jcc4.jar db2jcc_license_cu.jar'/>
</library>
</server>
テストデータの投入
作成したdashDBサービスにテストデータを投入します。本稿では、CSVファイルをアップロードする形で、テストデータを投入します。
テストデータ用CSVファイルの作成
Bluemix Liberty for Javaの開発環境を整える(2/3)のサンプル・アプリケーションでは、プログラム中にダミーデータを記載していました。このデータをCSVファイルとして外出しにします。
以下の内容の「BOOKLIST.csv」ファイルを作成します。
TITLE,TYPE,PRICE,ISBN
WebSphere Application Server 構築・運用バイブル,WebSphere,4800,978-4774153193
DB2 10 エバリュエーション・ガイドブック,DB2,3200,978-4798131894
スマートマシンがやってくる,Cognitive,1600,978-4822250324
Web管理画面を利用したテストデータ投入
dashDBのWeb管理画面を起動して、テーブルを作成し、CSVファイルをロードします。
アプリケーションの「接続」から、作成したdashDBのアイコンをクリックします。右上の「OPEN」をクリックし、dashDBのWeb管理画面を起動します。このWeb管理画面を利用することで、テストデータの投入やテストデータの確認、接続ツールのダウンロードなどが可能となります。
テーブルの作成
まずは、テーブルを作成します。左側のメニューにある「Run SQL」をクリックします。
SQLを入力するテキストフィールドに、BOOKLIST.sqlの内容を入力し、「Run」をクリックします。
CREATE TABLE BOOKLIST (
"TITLE" VARCHAR(256),
"TYPE" VARCHAR(256),
"PRICE" INT,
"ISBN" CHAR(14)
) ORGANIZE BY ROW;
しばらくしてから、CREATE TABLEのステータスが「Succeeded」となることを確認します。
テストデータのロード
それでは、先ほど作成したCSVファイルをアップロードします。左側のメニューにある「Load」から「Load from Desktop」をクリックします。
「Choose a file」をクリックし、先ほど作成したBOOKLIST.csvを選択します。続いて、「Code Page」を932に変更し、「Preview」をクリックします。
WindowsでCSVファイルを作成した場合、Shift-JISの文字コードでファイルが作成されているかと思います。一方、dashDBは、内部でUTF-8を利用しています。そこで、Code Pageを指定し、アップロードの際に文字コードを変換します。なお、UTF-8でCSVファイルを作成した場合は、Code Pageの変更は不要です。
アップロードするCSVファイルの内容が表示されますので、内容を確認し「Next」をクリックします。
先ほど作成したテーブルを利用するため、「Load into an existing table」を選択し、「Next」をクリックします。
作成したテーブルであるBOOKLISTを選択し、「Finish」をクリックします。。
「Number of rows commited」の値が「3」になっており、テーブル内のデータの日本語が正しく表示されていれば、正常にテストデータを投入できています。
サンプル・アプリケーションの改修
Bluemix Liberty for Javaの開発環境を整える(2/3)で作成したサンプル・アプリケーションを修正し、データベースからデータを取得するようにします。
「BookListServlet.java」を以下のように修正します。
dashDBは、大文字と小文字をどうも意識するようです。テーブル名やカラム名は、テストデータの投入で作成したものと同じものとしてください。また、ダブルクォートで囲むようにします。
このプログラムの中程で、JNDIをLookupしてDataSourceを取得しています。JNDIを利用することで、Bluemixに依存するコードをどこにも記述することなく、通常のJavaのWebアプリケーションと同じプログラムにできます。
Bluemixのサンプルでは、VCAP_SERVICES環境変数がセットされているかどうかで、ローカル環境かBluemix環境かを判断し、認証情報を切り替えるようプログラムしている例が多いかと思います。WAS Libertyの設定を利用し、JNDIを利用すればそのような記述は不要となり、ローカル環境のプログラムを改修することなく、Bluemixにデプロイできます。
package booklist.servlet;
import java.io.IOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.servlet.RequestDispatcher;
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.sql.DataSource;
import booklist.bean.Book;
@WebServlet("/BookList")
public class BookListServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public BookListServlet() {
super();
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
DataSource dataSource = null;
try {
Context ctx = new InitialContext();
dataSource = (DataSource)ctx.lookup("jdbc/dashDB-sample");
} catch (NamingException e) {
e.printStackTrace();
}
ArrayList<Book> bookList = new ArrayList<Book>();
try (
Connection conn = dataSource.getConnection();
PreparedStatement stmt = conn.prepareStatement("select \"TITLE\", \"TYPE\", \"PRICE\", \"ISBN\" from \"BOOKLIST\"");
ResultSet rs = stmt.executeQuery()
) {
while (rs.next()) {
Book book = new Book(rs.getString(1), rs.getString(2), rs.getInt(3), rs.getString(4));
bookList.add(book);
}
} catch (SQLException e) {
e.printStackTrace();
}
request.setAttribute("bookList", bookList);
RequestDispatcher rd = request.getRequestDispatcher("./result.jsp");
rd.forward(request, response);
}
}
ローカルPCでの稼働確認
WAS Libertyの設定変更
DB2 JDBCドライバーのダウンロードと配置
Download initial Version 11.1 clients and driversより、JDBCドライバーをダウンロードします。
ブラウザより、上記ページにアクセスし、「IBM Data Server Driver for JDBC and SQLJ (JCC Driver)」をクリックすると、JDBC Driverをダウンロードできます。
JDBCドライバーを配置するフォルダとして、C:¥IBM¥WebSphere¥Liberty¥usr¥shared¥resources¥db2
を作成します。ダウンロードしたzipファイルを展開し、「db2jcc4.jar」をこのフォルダにコピーします。
server.xmlの修正
Bluemix Liberty for Javaの開発環境を整える(2/3)の「WAS Libertyの設定変更」で実施した手順と同じように、EclipseからWAS Libertyの設定を変更します。
JDBCドライバーの共有ライブラリ登録
JDBCドライバーをLibertyの共有ライブラリとして登録します。
「Server Configuration」を選択した状態で「Add」をクリックします。
「ID」に「db2-library」を入力し、上部に表示される「Add」をクリックします。
「ID」に「db2-fileset」、「ベース・ディレクトリ」に「${shared.resource.dir}/db2」と入力し、Ctrl-sで設定を保存します。
JDBCドライバーの指定
「Server Configuration」を選択した状態で「Add」をクリックします。
検索バーに「jdbc」と入力して検索し、「JDBCドライバー」を選択し、「OK」をクリックします。
「ID」に「db2-driver」、「共有ライブラリー参照」に「db2-library」と入力し、Ctrl-sで設定を保存します。
DataSourceの指定
「Server Configuration」を選択した状態で「Add」をクリックします。
「ID」に「db2-dashDB-sample」、「JNDI名」に「jdbc/dashDB-sample」、「JDBCドライバー参照」に「db2-driver」をそれぞれ入力し、上部に表示される「Add」をクリックします。
「DB2 JCCのプロパティー」を選択し、「OK」をクリックします。
以下の値をそれぞれ入力し、Ctrl-sで設定を保存します。
(設定項目が多いため、画面キャプチャは省略します。)
- ドライバ・タイプ:4
- データベース名:BLUDB
- サーバー名:VCAP_SERVICESで確認したサーバー名
- ポート番号:VCAP_SERVICESで確認したポート番号
- パスワード:VCAP_SERVICESで確認した接続ユーザーのパスワード
- ユーザー:VCAP_SERVICESで確認した接続ユーザー
なお、パスワードは、パスワード入力フィールドの横にある「Set」をクリックし、パスワードを入力することで、設定ファイルには平文ではなくハッシュ化されたパスワードを保管できます。
稼働確認
EclipseのServerビューで、WAS Libertyのサーバーを選択し、Serverビューの右上の実行ボタン(再生マークの絵)をクリックします。
以下のようなログが出力され、エラーコード(CWで始まる10桁のコード)がInfoレベル(10桁目がI)のみとなっていれば、エラーなく正常にWAS Libertyのサーバーとアプリケーションを起動できています。
Java HotSpot(TM) 64-Bit Server VM バージョン 1.8.0_102-b14 (ja_JP) で、server1 (WebSphere Application Server 16.0.0.3/wlp-1.0.14.cl160320160831-1555) を起動しています
[AUDIT ] CWWKE0001I: サーバー server1 が起動されました。
[AUDIT ] CWWKE0100I: この製品は、開発使用向け、および限定的な実動使用向けにライセンスが交付されています。 全ライセンス条項は以下で表示可能です: https://public.dhe.ibm.com/ibmdl/export/pub/software/websphere/wasdev/license/base_ilan/ilan/16.0.0.3/lafiles/ja.html
[警告 ] CWWKS3103W: ID com.ibm.ws.security.registry.basic.config[basic] の BasicRegistry 構成に定義されたユーザーがありません。
[AUDIT ] CWWKZ0058I: アプリケーションの dropins をモニター中です。
[AUDIT ] CWWKT0016I: Web アプリケーションが使用可能です (default_host): http://localhost:9080/BookListApplication/
[AUDIT ] CWWKZ0001I: アプリケーション BookListApplication が 0.390 秒で開始しました。
[AUDIT ] CWWKF0012I: サーバーは次のフィーチャーをインストールしました。[jsp-2.3, ejbLite-3.2, managedBeans-1.0, jsf-2.2, beanValidation-1.1, servlet-3.1, ssl-1.0, jndi-1.0, localConnector-1.0, jsonp-1.0, appSecurity-2.0, jdbc-4.1, jaxrs-2.0, jaxrsClient-2.0, el-3.0, json-1.0, cdi-1.2, distributedMap-1.0, webProfile-7.0, websocket-1.1, jpa-2.1]。
[AUDIT ] CWWKF0011I: サーバー server1 は、Smarter Planet に対応する準備ができました。
ブラウザを起動し、「http://localhost:9080/BookListApplication/BookList」にアクセスします。以下の通り、サンプルデータが表示されれば、稼働確認は完了です。
BluemixへのPushと稼働確認
EclipseのServerビューで、IBM Bluemixの下にある「BookListApplication」を右クリックし、「Push」を選択します。「Push」をクリックできない場合は、EclipseプロジェクトとBluemixがうまく関連づけられていない可能性があります。「Link Project」をクリックして、プロジェクトの関連づけを再度実施してください。
BluemixへのアプリケーションのPushが始まります。
しばらく待ってからServerビューに切り替え、サンプル・アプリケーションが「Deployed [started, Synchronized]」と表示されていれば、Bluemixへのデプロイとアプリケーションの起動が正常終了しています。
ブラウザから、BluemixのアプリケーションのURLにアクセスし、WAS Libertyでの稼働確認と同じ画面が表示されれば、稼働確認は完了です。
最後に
3回にわたって、Liberty for Javaの開発環境のセットアップについて記載しました。
WAS Libertyの設定が大半のため、WAS Libertyに馴染みがないとセットアップが大変なように感じるかもしれません。
ただ、一度覚えてしまえば、次回からは同じようにセットアップすれば他のアプリケーションでも利用できますので、ぜひトライしてみてください。
今回の設定を実施することで、ローカル環境かBluemix環境かを意識しないアプリケーションを開発できます。
SQL Databaseの接続設定を、ローカルのDB2やMySQLに変更すれば、Bluemix以外の環境でも稼働させることができ、アプリケーションの可搬性を高めることができますので、ご参考になれば幸いです。
(2016/09/22 追記)
SQL Databaseサービス廃止にともない、使用するデータベースサービスをdashDBに変更しました。
また、Bluemixの画面キャプチャーをNew Consoleに修正しました。