LoginSignup
10
11

More than 5 years have passed since last update.

Bluemix Liberty for Javaの開発環境を整える(3/3)

Last updated at Posted at 2016-01-08

はじめに

BluemixのランタイムとしてLiberty for Javaを使用するための、開発環境の準備について記載します。
ローカルPCでWebSphere Application Server Liberty Profile(WAS Liberty)を稼働させ、ローカルPCで稼働確認したものをBluemixにPushすることを想定して記載します。

本内容は、以下の3回に分けて投稿する予定です。今回は、第3回目の「データベースサービスを利用するプログラムの開発」です。データベースサービスとして、dashDBを利用します。

  1. EclipseのセットアップとWAS Libertyの導入
  2. シンプルなJSPとServletのプログラムの開発
  3. データベースサービスを利用するプログラムの開発

前提

以下の内容が完了しているものとして記載します。

作業の流れ

以下の流れで、作業を進めていきます。

  1. dashDBサービスを作成し、ランタイムにバインドします
  2. テストデータを投入します
  3. データベースを利用するようにサンプル・アプリケーションを改修します
  4. ローカルPCでサンプル・アプリケーションを稼働させ、稼働を確認します
  5. サンプル・アプリケーションをBluemixにPushし、稼働を確認します

dashDBサービスの作成

Bluemixはいくつかのデータベース・サービスを提供していますが、本稿ではDB2がベースとなっているdashDBサービスを利用します。
dashDBサービスは、GUIの管理画面が用意されており、テストデータの投入や参照をブラウザ上で実施できます。ただし、dashDBサービスは、通常では列指向でテーブルが作成されるため、行指向でテーブルを作成するようにCREATE TABLEのSQLを実行する必要があります。こちらの記事もあわせて参照ください。

サービスの作成

BluemixのWeb管理画面にログインし、ダッシュボードの「すべての項目」から、Bluemix Liberty for Javaの開発環境を整える(2/3)で作成したアプリケーションを選択します。
dashDB-01.png

「接続」の項目にある「新規に接続」をクリックします。
dashDB-02.png

「データ&分析」カテゴリーにある「dashDB」をクリックします。
dashDB-03.png

「サービス名」に「dashdb−sample」と入力し、「価格プラン」として「Entry」が選択されていることを確認し、「作成」をクリックします。
「サービス名」は、任意の値で構いませんが、後ほどプログラム中で利用します(後述しますが、プログラムから参照するJNDI名の一部となります)。空白を含まない値としてください。また、Entryプランは有償ですが、1GBのデータ量までは無料で利用でき、課金されません。
dashDB-04.png
dashDB-05.png

作成したサービスの情報を反映するため、アプリケーションの再ステージを求めるポップアップが表示されますので、「再ステージ」をクリックします。
dashDB-06.png

再ステージが完了すると、dashDBサービスの作成は完了です。

設定の確認

dashDBを作成すると、Bluemixにはどのような情報が反映されるのかを確認してみます。
「VCAP_SERVICESの確認」で確認する値は、後ほどローカルPCのWAS Libertyの設定に反映しますので、どこかにメモしておいてください。

VCAP_SERVICESの確認

dashDBへの接続情報は、VCAP_SERVICESと呼ばれる環境変数に保管されます。この値を利用して、dashDBにアクセスするプログラムを作成します。(ただし、本稿では、プログラム中にVCAP_SERVICESを参照するコードは記述しません。WAS Libertyの設定に反映し、プログラム中からJNDIのLookupにより値を参照するようにします。)

アプリケーションの「接続」から、作成したdashDBのアイコンにある「資格情報の表示」をクリックします。
dashDB-07.png

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に接続できるようになります。

アプリケーションの「ランタイム」から「ファイル」をクリックします。
dashDB-08.png

Bluemixにデプロイされているファイルのディレクトリ構造が表示されますので、「app」→「wlp」→「usr」→「servers」→「defaultServer」→「server.xml」の順に選択します。

server.xmlの値として、以下のような情報が表示されるかと思います。
featureとして「jdbc-4.1」が追加されており、また、「dataSource」や「jdbcDriver」の設定が追加されています。
この「dataSource」の設定の中に、「jndiName」が存在します。Javaのプログラムから、このjndiNameをLookupすることで、dashDBへの接続プールからコネクションを取得できます。また、ここで指定されている名前は、先ほどdashDBサービスを作成した際に付与した「サービス名」が使用されています。

server.xml
<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」ファイルを作成します。

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管理画面を利用することで、テストデータの投入やテストデータの確認、接続ツールのダウンロードなどが可能となります。
testdata-01.png

テーブルの作成

まずは、テーブルを作成します。左側のメニューにある「Run SQL」をクリックします。
testdata-02.png

SQLを入力するテキストフィールドに、BOOKLIST.sqlの内容を入力し、「Run」をクリックします。

testdata-03.png

BOOKLIST.sql
CREATE TABLE BOOKLIST (
   "TITLE" VARCHAR(256),
   "TYPE" VARCHAR(256),
   "PRICE" INT,
   "ISBN" CHAR(14)
) ORGANIZE BY ROW;

しばらくしてから、CREATE TABLEのステータスが「Succeeded」となることを確認します。
testdata-04.png

テストデータのロード

それでは、先ほど作成したCSVファイルをアップロードします。左側のメニューにある「Load」から「Load from Desktop」をクリックします。
testdata-05.png

「Choose a file」をクリックし、先ほど作成したBOOKLIST.csvを選択します。続いて、「Code Page」を932に変更し、「Preview」をクリックします。
WindowsでCSVファイルを作成した場合、Shift-JISの文字コードでファイルが作成されているかと思います。一方、dashDBは、内部でUTF-8を利用しています。そこで、Code Pageを指定し、アップロードの際に文字コードを変換します。なお、UTF-8でCSVファイルを作成した場合は、Code Pageの変更は不要です。
testdata-06.png

アップロードするCSVファイルの内容が表示されますので、内容を確認し「Next」をクリックします。
testdata-07.png

先ほど作成したテーブルを利用するため、「Load into an existing table」を選択し、「Next」をクリックします。
testdata-08.png

作成したテーブルであるBOOKLISTを選択し、「Finish」をクリックします。。
testdata-09.png

「Number of rows commited」の値が「3」になっており、テーブル内のデータの日本語が正しく表示されていれば、正常にテストデータを投入できています。
testdata-10.png

サンプル・アプリケーションの改修

Bluemix Liberty for Javaの開発環境を整える(2/3)で作成したサンプル・アプリケーションを修正し、データベースからデータを取得するようにします。
「BookListServlet.java」を以下のように修正します。
dashDBは、大文字と小文字をどうも意識するようです。テーブル名やカラム名は、テストデータの投入で作成したものと同じものとしてください。また、ダブルクォートで囲むようにします。

このプログラムの中程で、JNDIをLookupしてDataSourceを取得しています。JNDIを利用することで、Bluemixに依存するコードをどこにも記述することなく、通常のJavaのWebアプリケーションと同じプログラムにできます。
Bluemixのサンプルでは、VCAP_SERVICES環境変数がセットされているかどうかで、ローカル環境かBluemix環境かを判断し、認証情報を切り替えるようプログラムしている例が多いかと思います。WAS Libertyの設定を利用し、JNDIを利用すればそのような記述は不要となり、ローカル環境のプログラムを改修することなく、Bluemixにデプロイできます。

BookListServlet.java
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」をクリックします。
Liberty-01.png

「共有ライブラリー」を選択し、「OK」をクリックします。
Liberty-02.png

「ID」に「db2-library」を入力し、上部に表示される「Add」をクリックします。
Liberty-03.png

「ファイル・セット」を選択し、「OK」をクリックします。
Liberty-04.png

「ID」に「db2-fileset」、「ベース・ディレクトリ」に「${shared.resource.dir}/db2」と入力し、Ctrl-sで設定を保存します。
Liberty-05.png

JDBCドライバーの指定

「Server Configuration」を選択した状態で「Add」をクリックします。

検索バーに「jdbc」と入力して検索し、「JDBCドライバー」を選択し、「OK」をクリックします。
Liberty-06.png

「ID」に「db2-driver」、「共有ライブラリー参照」に「db2-library」と入力し、Ctrl-sで設定を保存します。
Liberty-07.png

DataSourceの指定

「Server Configuration」を選択した状態で「Add」をクリックします。

「データ・ソース」を選択し、「OK」をクリックします。
Liberty-08.png

「ID」に「db2-dashDB-sample」、「JNDI名」に「jdbc/dashDB-sample」、「JDBCドライバー参照」に「db2-driver」をそれぞれ入力し、上部に表示される「Add」をクリックします。
Liberty-09.png

「DB2 JCCのプロパティー」を選択し、「OK」をクリックします。
Liberty-10.png

以下の値をそれぞれ入力し、Ctrl-sで設定を保存します。
(設定項目が多いため、画面キャプチャは省略します。)

  • ドライバ・タイプ:4
  • データベース名:BLUDB
  • サーバー名:VCAP_SERVICESで確認したサーバー名
  • ポート番号:VCAP_SERVICESで確認したポート番号
  • パスワード:VCAP_SERVICESで確認した接続ユーザーのパスワード
  • ユーザー:VCAP_SERVICESで確認した接続ユーザー

なお、パスワードは、パスワード入力フィールドの横にある「Set」をクリックし、パスワードを入力することで、設定ファイルには平文ではなくハッシュ化されたパスワードを保管できます。

稼働確認

EclipseのServerビューで、WAS Libertyのサーバーを選択し、Serverビューの右上の実行ボタン(再生マークの絵)をクリックします。
Local-01.png

以下のようなログが出力され、エラーコード(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」にアクセスします。以下の通り、サンプルデータが表示されれば、稼働確認は完了です。
Local-02.png

BluemixへのPushと稼働確認

EclipseのServerビューで、IBM Bluemixの下にある「BookListApplication」を右クリックし、「Push」を選択します。「Push」をクリックできない場合は、EclipseプロジェクトとBluemixがうまく関連づけられていない可能性があります。「Link Project」をクリックして、プロジェクトの関連づけを再度実施してください。
Bluemix-01.png

BluemixへのアプリケーションのPushが始まります。
しばらく待ってからServerビューに切り替え、サンプル・アプリケーションが「Deployed [started, Synchronized]」と表示されていれば、Bluemixへのデプロイとアプリケーションの起動が正常終了しています。
Bluemix-02.png

ブラウザから、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に修正しました。

10
11
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
11