読者です 読者をやめる 読者になる 読者になる

2/16 WebLogic Server 勉強会に登壇しました

2/16にオラクル青山センターにて開催された、WebLogic Server勉強会 特別編に登壇いたしました。会場まで足を運んで頂いた方も、リモートで聴講頂いた方も、ご参加いただきありがとうございました。
当日の資料は、SlideShareOracle Fusion Middlewareアカウントにて公開しておりますので、どうぞ御覧ください。

今回のWLS勉強会は、以下2セッションで、私は前半のJave EE/Docker/DevOpsのテーマの方で話をさせていただきました。

Java EE対応のセッションを受け持っておきながらなんですが、業務でエンジニアのみなさんと接していると、マルチテナントへの期待をひしひしと感じます。
実際の運用事例が出てくるまでにはまだ時間が必要かもしれませんが、Javaアプリケーションサーバーの世界において非常に画期的な機能ですので、今後ともご注目頂きたいと思います。

もちろん、Java EE 7やDocker対応の方も、よろしくお願いします。このブログでは、そのとき私が興味を持ったものを記事にしていくつもりですので、MTよりもJavaの方の記事が多くなると思います。

しばらくの間は、WLS勉強会では時間の都合で説明できなかった、デモの詳細を記事にしていきたいと思います。DockerでWebLogicクラスターを組む時のコマンドとか、jBatchのデモアプリの詳細とか。

当ブログも引き続きよろしくお願いします。

Cygwin 環境構築手順の備忘録

Cygwinに関しては、本格的に使うようになって約半年程度の初心者ですが、追加パッケージの導入など環境の変更がだいぶ積み重なってきました。 そろそろ何をやってきたか思い出せなくなりそうなので、やった作業と手順の参照先を残しておくことにしました。

unzip, scp/ssh

unzip はzip アーカイブのユーティリティ。
scp,ssh は SCP と SSH のクライアント(そのまんま…)。Linux系のサーバーを使って開発をするときには、必須。

これらは Cygwinインストーラで導入してしまいました。
パッケージの選択画面で、"unzip"、"openssh" でフィルタすれば見つかります。

wget

Cygwinwget コマンドが使えるようにします。手順は以下を参考させていただきました。

wget は、apt-cyg 追加するときにも必要になります。

apt-cyg

Cygwin で apt-get や yum ライクにパッケージのインストールを行えるようにします。apt-cyg を使うと、Cygwinインストーラ無しでパッケージの追加ができるようになるので便利です。
また後述する tree コマンドのように、Cygwinインストーラでは導入できないものもあります。

手順は以下を参考にさせていただきました。

rsync

Vagrant を使っていて、ゲストOSとファイル共有したいときに重宝します。rsyncは、"vagrant rsync" を使うために必要です。左記コマンドを打つと、ホストOS上の更新がゲストOSの共有フォルダに反映されます。

導入は、apt-cyg で一発。

$ apt-cyg install rsync

tree

tree ディレクトリ階層を出力するコマンド。テキストでREADME的なメモを書くときに、ディレクトリ階層を図示したいときに重宝します。

導入は、apt-cyg で一発。

$ apt-cyg install tree

vim

これは説明不要ですかね。Windows環境では gvim もありますが、テキスト編集をターミナル内で完結させた方が楽な場面は、結構多いと思います。

導入は、こちらも apt-cyg で。

$ apt-cyg install vim

git

GUIのリッチなクライアントもありますが、コマンドが嬉しい時もあり。

導入はまたまた apt-cyg。apt-cyg 便利。

$ apt-cyg install git

chere

エクスプローラで、コンテキストメニューから現在のフォルダで Cygwin のターミナルを開けるようにします。

手順は以下を参考にさせていただきました。

open コマンドで、デフォルトのアプリでファイルを開くようにする

元々 Cygwin には、cygstart というコマンドがありまして、これを使うと、指定したファイルをデフォルトのアプリで開きます。
Cygwin を使う人には、このコマンドのエイリアスとして、"open" を設定している方が多いようです(Mac では標準でそうなっているそうな)。やってみると、確かに "cygstart" と打つよりかなり楽です。

"cygstart" は字数が多い上に左手にキーが集中しているので、ミスタイプしやすい。

手順は以下を参考にさせていただきました。

ついでに、私の場合、拡張子なしのファイルは gVim で開くように設定しています。これは Windows の機能ですが。
Vagrantfile とか、Dockerfile を編集するのに便利です。

こちらの手順は以下を参考にさせていただきました。

以上です。

WebLogic Server 12.2.1で、動的クラスターの自動スケーリングを試してみた

WebLogic Server 12cR2では、クラスターのメンバーを自動的に増減する機能が追加されました。この機能では、スケジュールベース、メトリックベースの動的スケーリングをサポートしています。

  • スケジュールベース
    • 予め指定されたスケジュールで、クラスターメンバーの増減を行います
    • (例)決められた曜日/時刻が来たら、サーバーを追加して予想される負荷に対応
  • メトリックベース
    • 指定したメトリックの値が、一定の値を超えるなどした場合に、クラスターメンバーの増減を行います。
    • (例)所定の時間内に一定数以上のリクエストを検出したらサーバーを追加し、突発的な負荷に対応

今回は、スケジュールベースの自動スケーリングを試して見ます。

構成手順

0. (準備)マシンを構成する

追加されるクラスターメンバーを稼働させるためのマシンを、予め構成しておきます。

  • 管理サーバーとは別のホストに、管理対象サーバーを一台構成
  • 上記管理サーバーに対し、マシンを構成。マシン名は"Machine-wlsmanaged0"
  • クラスターメンバーへのアクセス用に以下のポートを開放
    • 7101
    • 7102
    • 8101
    • 8102

本記事では、上記の様な構成を実施済みであるものとします。

1. 動的クラスターを作成する

まずはメンバーの増減を試すための動的クラスターを作成します。

WebLogic Server管理コンソールにアクセスし、[チェンジセンター] の [ロックして編集] をクリックします。

f:id:charlier_shoe:20160121154853p:plain

[クラスターのサマリー] で、[新規] > [動的クラスタ] の順にクリックします。

f:id:charlier_shoe:20160121154912p:plain

[新規動的クラスタの作成] で、以下のように値を設定し、[次] をクリックします。

  • 名前: DynamicCluster0(任意の名前でよい)
  • メッセージング・モード: ユニキャスト
  • (他はデフォルトのまま)

f:id:charlier_shoe:20160121154929p:plain

次の画面(画面名は同じ)で、以下のように値を設定し、[次] をクリックします。

  • 動的クラスタ・サイズ: 1
  • (他はデフォルトのまま)

f:id:charlier_shoe:20160121154945p:plain

次の画面(画面名は同じ)で、以下のように値を設定し、[次] をクリックします。
(今回は管理対象サーバーを1台しか構成しないので、単一のマシン上にクラスターメンバーが追加されるようにします)

  • ラジオボックス: すべての動的サーバーに単一マシンを使用する
  • 選択したマシン: Machine-wlsmanaged0

f:id:charlier_shoe:20160121155004p:plain

次の画面ではデフォルトのまま [次]をクリックします。

f:id:charlier_shoe:20160121155017p:plain

次は確認画面です。[終了] をクリックします。

f:id:charlier_shoe:20160121155035p:plain

最後に、[チェンジセンター] > [変更のアクティブ化] をクリックして、これまでの作業をサーバーに反映させます。

これで動的クラスターの作成は完了です。

2. 診断モジュールを作成する

動的クラスターの自動スケーリングは、WebLogic診断フレームワークの一機能として提供されています。
診断モジュールを構成して、ポリシーとアクション(12.1.3以前の「監視」、「通知」が改名)を設定しておくことで、自動スケーリングを実現できます。今回の場合、

  • ポリシー: 毎日 06:00(06:05) に
  • アクション: スケールアップ(ダウン)を実行する

という設定をします。

2-1. 診断モジュールを作成する

まずは診断モジュールを構成します。

まずはWebLogic Server管理コンソールにアクセスし、[チェンジセンター] の [ロックして編集] をクリックします。

次に、[ドメイン構造] の [診断] > [診断モジュール] を選択し、[診断モジュールのサマリー] で、[新規] をクリックします。

f:id:charlier_shoe:20160121155219p:plain

[診断システム・モジュールの作成] で、以下のように値を設定し、[OK] をクリックします。

  • 名前: CalendarBasedScalingModule
  • 説明: カレンダーベースで、動的クラスターを自動スケーリングします。(任意の説明書きでよい)
  • (他はデフォルトのまま)

f:id:charlier_shoe:20160121155238p:plain

2-2. 診断モジュールにポリシー/アクションを設定する

続いて、診断モジュールにポリシーを設定します。ポリシーの設定を行う操作の中で、アクションの作成も併せて行います。

まずはスケールアップのポリシー/アクションからです。
今回は毎日 06:00(UTC) に、クラスターメンバーが1つ追加されるようにします(タイムゾーンUTCなのは、私が利用している環境の都合です)。

[ドメイン構造] の [診断] > [診断モジュール] を選択し、診断システムモジュールの一覧から、"CalendarBasedScalingModule" をクリックします。

f:id:charlier_shoe:20160121155305p:plain

[CalendarBasedScalingModuleの設定] で、[構成]、[ポリシーとアクション] タブを順に選択します。
更に、画面下方のポリシーの一覧で、[新規] をクリックします。

f:id:charlier_shoe:20160121155330p:plain

[ポリシーの作成] で、以下のように値を設定し、[次] をクリックします。

  • ポリシー名: 06-00-00 UTC everyday(任意の名前でよい)
  • ポリシー・タイプ: カレンダー・ベース
  • (他はデフォルトのまま)

f:id:charlier_shoe:20160121155349p:plain

次の画面(画面名は同じ)で、以下のように値を設定し、[次] をクリックします。

  • 頻度: カスタム

f:id:charlier_shoe:20160121155403p:plain

次の画面(画面名は同じ)で、以下のように値を設定し、[次] をクリックします。

f:id:charlier_shoe:20160121155418p:plain

次の画面(画面名は同じ)ではデフォルトのまま [次]をクリックします。

f:id:charlier_shoe:20160121155435p:plain

次の画面(画面名は同じ)では、ラジオボタンで [アクションのスケール・アップ] を選択し、[新規スケール・アップ・アクション] をクリックします。

f:id:charlier_shoe:20160121155455p:plain

次の画面(画面名は同じ)では、アクションの作成をおこないます。以下のように値を設定し、[次] をクリックします。

  • アクション名: ScaleUp(任意の名前でよい)
  • (他はデフォルトのまま)

f:id:charlier_shoe:20160121155520p:plain

次の画面(画面名は同じ)は、まだアクションの作成の続きです。以下のように値を設定し、[終了] をクリックします。

  • クラスタ名: DynamicCluster0(最初に作った動的クラスターを選択)
  • スケーリング・サイズ: 1

f:id:charlier_shoe:20160121155534p:plain

ポリシーの作成に戻ります。以下のように値を設定し、[終了] をクリックします。ここまでで、スケールアップのポリシー/アクションの作成は完了です。

  • スケール・アップ・アクションの選択: ScaleUp(作成したアクションの名前に合わせる)
  • (他はデフォルトのまま)

f:id:charlier_shoe:20160121155555p:plain

スケールダウンのポリシー/アクションも同様に作成します。
毎日 06:05(UTC) に、クラスターメンバーが1つ削減されるようにします。
スケールアップと要領は同じなので画面イメージは省略しますが、以下の様に値を設定するようにします。

  • [ポリシーの作成] 画面 1枚目
    • ポリシー名: 06-05-00 UTC everyday(任意の名前でよい)
    • ポリシー・タイプ: カレンダー・ベース
    • (他はデフォルトのまま)
  • [ポリシーの作成] 画面 2枚目
    • 頻度: カスタム
  • [ポリシーの作成] 画面 3枚目
  • [ポリシーの作成] 画面 4枚目
    • (デフォルトのまま)
  • [ポリシーの作成] 画面 5枚目
    • ラジオボタン: アクションのスケールダウン
    • スケール・ダウン・アクションの選択: ScaleDown(先に[新規スケール・ダウン・アクション]をクリックして、同名のアクションを作っておきます)
  • [ポリシーの作成] 画面のアクションの作成部分 1枚目
    • アクション名: ScaleUp(任意の名前でよい)
    • (他はデフォルトのまま)
  • [ポリシーの作成] 画面のアクションの作成部分 2枚目
    • クラスタ名: DynamicCluster0(最初に作った動的クラスターを選択)
    • スケーリング・サイズ: 1

これでポリシー/アクションの作成は完了です。

念のため、ポリシー、アクションが作成されているか確認してみます。

[ドメイン構造] の [診断] > [診断モジュール] を選択し、診断システムモジュールの一覧から、"CalendarBasedScalingModule" をクリックします。
更に、[CalendarBasedScalingModuleの設定] で、[構成]、[ポリシーとアクション] タブを順に選択します。

画面下部のポリシーの一覧に、以下のように2つのポリシーが表示されます。

f:id:charlier_shoe:20160121155635p:plain

[アクション] タブをクリックしてアクションの一覧に切り替えると、以下のように2つのアクションが表示されます。

f:id:charlier_shoe:20160121155648p:plain

2-3. 診断モジュールのターゲットを設定する

[ドメイン構造] の [診断] > [診断モジュール] を選択し、診断システムモジュールの一覧から、"CalendarBasedScalingModule" をクリックします。
更に、[CalendarBasedScalingModuleの設定] で、[ターゲット] タブを選択します。

[AdminServer] のチェックボックスをオンにして、[保存] をクリックします。

f:id:charlier_shoe:20160121155713p:plain

ここまでで、診断モジュールの全ての設定が完了しました。最後に、[チェンジセンター] > [変更のアクティブ化] をクリックして、これまでの作業をサーバーに反映させます。

後は動作確認を残すのみ…。

動作確認

いよいよ動作確認です。

動的クラスターを作成した際に、それに属するサーバーが1つ構成されていますので、予め起動しておきます。

[ドメイン構造] の [環境] > [サーバー] を選択し、[サーバーのサマリー] 画面で [制御] タブをクリックします。 "DynamicCluster0-1" というサーバーができているので、これに対応するチェックボックスをONにして、[起動] をクリックします。

f:id:charlier_shoe:20160121155758p:plain

続く確認画面で、[はい] を選択すると、サーバーの起動は完了です。

f:id:charlier_shoe:20160121155814p:plain

後は、メトリックブラウザでクラスターメンバー数のモニタリングを設定しつつ、時間が来るのを待ちます…。

結果はこちら。

f:id:charlier_shoe:20160121155836p:plain

あれ、06:00にスケールアップはできていますが、06:05になってもメンバーが減らない…。

管理サーバーのログを確認して見たところ、以下の様なエラーが記録されていました。どうやら、スケールアップ後にもう少し時間を置かないと、続くスケーリングは失敗するようです。

#### <[ACTIVE] ExecuteThread: '14' for queue: 'weblogic.kernel.Default (self-tuning)'> <> <> <0c8309f6-60d6-4929-904a-472ef040511f-0000005e> <1453269900660> <[severity-value: 8] [rid: 0] [partition-id: 0] [partition-name: DOMAIN] > <BEA-2192046> during execute operation. Requested resolution is FAIL. Reason: Scaling operation failed because the cluster DynamicCluster0 is in cool-off period and cannot be scaled for another 624 seconds.>

※このあと設定を変えて再挑戦し、期待通り動作することを確認しております。

以上、動的クラスターの自動スケーリング機能の検証でした。

Oracle Database Express EditionにjBatchのJobRepositoryを構成する(Dockerコンテナもあります)

jBatchを使うには、JobRepositoryと呼ばれる、ジョブのステータスやシリアライズされたcheckpointinfoを保持するデータベースが必要です。
Oracle WebLogic Serverでは、デフォルトではDerbyの組み込みデータベースを利用しています。しかし、これはあくまで開発用で、本番環境はもちろん、UTより後のテスト工程では別途データベースを構成する必要があるものと思います。

今回は、Oracle Database Express Editionを使ってJobRepositoryを構成して見たので、手順を紹介します。

1. データベースにJobRepository用のスキーマを作成する

まず、WebLogic Server 12.2.1がインストールされた環境から、テーブルを作成するためのスクリプトを取得します。
スクリプトは、以下のパスに格納されています。

${ORACLE_HOME}/oracle_common/common/sql/wlservices/batch/Oracle

今回は、このパス配下のスクリプトを、DBサーバーの "/tmp/jbatch/" にコピーしておきます。

続いて、DB上にJobRepository用のユーザーを作成し、必要なアクセス権を付与します。
例えば以下の様な感じです。

$ sqlplus system/oracle
SQL> CREATE USER repuser IDENTIFIED BY reppswd
  2  DEFAULT TABLESPACE USERS
  3  TEMPORARY TABLESPACE TEMP
  4  ;
SQL> GRANT CONNECT, RESOURCE TO repuser;

作成したユーザーで再接続し、テーブルを作成するスクリプトを実行します。

SQL> CONNECT repuser/reppswd;
SQL> @/tmp/jbatch/jbatch.sql

2. JobRepositroryに接続するためのデータソースを作成する

データソースの作成は、WebLogic Server管理コンソールから行います。

管理コンソールにアクセスして、チェンジ・センターの[ロックして編集]ボタンをクリックします。

f:id:charlier_shoe:20160114020753p:plain

ドメイン構造の、[${ドメイン名}] > [サービス] > [データ・ソース]を選択します。

f:id:charlier_shoe:20160114020757p:plain

[JDBCデータ・ソースのサマリー]で、[新規] > [汎用データソース]を選択します。

f:id:charlier_shoe:20160114020801p:plain

[JDBCデータ・ソースのプロパティ]画面で、以下の値を設定し、[次]をクリックします。

  • 名前: (任意の名前)
  • スコープ: グローバル
  • JNDI名: (任意のJNDI名)
  • データベースのタイプ: Oracle

f:id:charlier_shoe:20160114020944p:plain

[JDBCデータ・ソースのプロパティ]画面(2枚目)で、以下の値を設定し、[次]をクリックします*1

  • データベース・ドライバ: Oracle's Driver (Thin XA) for Instance connections; Versions:Any

f:id:charlier_shoe:20160114020950p:plain

[トランザクション・オプション]画面では設定する項目はありません。[次]をクリックします。

f:id:charlier_shoe:20160114020956p:plain

[接続プロパティ]画面で、以下の値を設定し、[次]をクリックします。

  • データベース名: (データベースのSID)
  • ホスト名: (DBサーバーのホスト名またはIPアドレス
  • ポート: (DBのポート。Oracle DBでは1521が基本)
  • データーベース・ユーザー名: repuser
  • パスワード: reppswd

f:id:charlier_shoe:20160114021051p:plain

[データーベース接続のテスト]画面で[構成のテスト]をクリックして、接続テストが成功することを確認します。問題なければ[次]をクリックします。

f:id:charlier_shoe:20160114021106p:plain

[ターゲットの選択]画面で、バッチアプリケーションをデプロイする予定のターゲットを選択し、[終了]をクリックします。

f:id:charlier_shoe:20160114021123p:plain

3. バッチジョブとデータソースの関連付けの設定をおこなう

最後に、2.で作成したデータソースを、JobRepositoryにアクセスするときに利用するデータソースとして登録します。

ドメイン構造の[${ドメイン名}]をクリックし、画面右のタブで[構成] > [バッチ]を選択します。

以下の値を設定し、[保存]をクリックします。

  • データソースJNDI名: (2.の[JDBCデータ・ソースのプロパティ]画面(一枚目)で指定したJNDI名)
  • スキーマ名: repuser

f:id:charlier_shoe:20160114021136p:plain

最後に[チェンジ・センター]で[変更のアクティブ化]をクリックすると、必要な設定は完了です。

試しに、前回の記事で紹介したサンプルアプリを動かしてみたところ、ちゃんと結果が表示されることが確認できました。

f:id:charlier_shoe:20160114021145p:plain

上の画面は、ドメイン構造の[${ドメイン名}]をクリックし、画面右のタブで[モニタリング] > [バッチ・ジョブ]を選択すると表示されます。

おまけ: JobRepostitoryを構成済みの、Oracle Database XEのDockerコンテナ

JobRepositoryを構成済みのDockerコンテナを作成する、スクリプトを作ってみました。こちらはgithubに公開してあります。
ベースとなるOracle Express Editionのイメージはwnamelessさんのものを利用させて頂いています。

ダウンロードしたら、tablesフォルダに上記のsqlスクリプト群を配置し、以下のコマンドを実行してください。

$ docker build -t [タグ名] ./
$ docker run  sudo docker run -d -p 1521:1521 --name=[コンテナ名] [タグ名]

JobRepositoryのユーザー名、パスワードは以下のとおりとなっています。この辺はDockerfileを適当に編集して、好きなものに変更してください。

  • ユーザー名: repuser
  • パスワード: reppswd

*1:マニュアルによると、JobRepositoryへのアクセスに使用するデータ・ソースは、XAトランザクションに対応したドライバを使用する必要があります

jBatchを使ってバッチアプリケーションのサンプルを作ってみた

WebLogic Serverも、先日リリースされた12cR2でJava EE 7に完全対応となりました。
そこで、Java EE 7から加わった仕様である、jBatchを使って、簡単なサンプルアプリケーションを作ってみました。

jBatchそのものに関しては、主に以下の資料で勉強させていただきました。

サンプルアプリケーションの説明

今回作成したアプリケーションでやっている処理は至ってシンプルです。
chunk方式のメソッドが実行される順序を実際に見てみたかったので、1つのstepをchunk方式で実装し、以下のような処理を行っています。

  • ItemReader等の各インターフェースのメソッドが実行されたら、標準出力にその旨を出力する
  • ItemReader#readItem()、ItemWriter#writeItem()の実行回数をチェックポイント情報として返す
  • ItemWriter#writeItem()が実行されたら、readItem()、writeItem()の累積実行回数を標準出力に出力する

今回のアプリケーションのコードは、githubに公開してます。
コードを取得しでmavenでビルドすると、Java EEコンテナにデプロイするだけで実行可能なwarができ上がります。WebLogicでしか確認してませんが、シンプルなアプリなので他のコンテナでも大丈夫なはず…。

$ mvn package

ジョブの実行は、そのためのRESTのインターフェースを用意しています。以下のURLにGETリクエストを投げてください。

http://${host}:${PORT}/${CONTEXT_ROOT}/resources/JobController/Start

コード抜粋

以下、コードの抜粋です。Job定義とItemWriterの実装。

実行してみる

WebLogicにデプロイして、上記のRESTインターフェースを呼び出すと、標準出力に以下のような結果が出力されます。
ジョブ定義のitem-countの回数(3)だけreadItem(),processItem()を実行した後、writeItems()を1回実行、以下その繰り返しとなっているのがわかります。

jp.gr.java_conf.hhayakawa_jp.sample.jbatch.resource.JobController#start(31)
jp.gr.java_conf.hhayakawa_jp.sample.jbatch.SimpleItemReader#open(62)
jp.gr.java_conf.hhayakawa_jp.sample.jbatch.SimpleItemWriter#open(54)
jp.gr.java_conf.hhayakawa_jp.sample.jbatch.SimpleItemReader#readItem(79)
jp.gr.java_conf.hhayakawa_jp.sample.jbatch.SimpleItemProcessor#processItem(26)
jp.gr.java_conf.hhayakawa_jp.sample.jbatch.SimpleItemReader#readItem(79)
jp.gr.java_conf.hhayakawa_jp.sample.jbatch.SimpleItemProcessor#processItem(26)
jp.gr.java_conf.hhayakawa_jp.sample.jbatch.SimpleItemReader#readItem(79)
jp.gr.java_conf.hhayakawa_jp.sample.jbatch.SimpleItemProcessor#processItem(26)
jp.gr.java_conf.hhayakawa_jp.sample.jbatch.SimpleItemWriter#writeItems(71)
ItemReader#readItem() has been executed [3] times.
ItemWriter#writeItem() has benn executed [1] times(including this execution).
jp.gr.java_conf.hhayakawa_jp.sample.jbatch.SimpleItemReader#checkpointInfo(41)
jp.gr.java_conf.hhayakawa_jp.sample.jbatch.SimpleItemWriter#checkpointInfo(33)
jp.gr.java_conf.hhayakawa_jp.sample.jbatch.SimpleItemReader#readItem(79)
jp.gr.java_conf.hhayakawa_jp.sample.jbatch.SimpleItemProcessor#processItem(26)
…
ItemReader#readItem() has been executed [10] times.
ItemWriter#writeItem() has benn executed [4] times(including this execution).
jp.gr.java_conf.hhayakawa_jp.sample.jbatch.SimpleItemReader#checkpointInfo(41)
jp.gr.java_conf.hhayakawa_jp.sample.jbatch.SimpleItemWriter#checkpointInfo(33)
jp.gr.java_conf.hhayakawa_jp.sample.jbatch.SimpleItemWriter#close(42)
jp.gr.java_conf.hhayakawa_jp.sample.jbatch.SimpleItemReader#close(50)

今後、このサンプルをベースにいろいろ試してみたいと思います。
次回は、チェックポイントを使って中断/再開とか、試してみようかな。

WebLogic Server 12.2.1 + サンプルドメイン がインストールされた Docker コンテナを、Vagrant のゲストOS上に構成する

前回の記事に引き続き、WebLogic Server 12.2.1 がインストールされた Docker コンテナを、Vagrant のテストOS上に構成します。
今回は、WebLogic 公式のサンプルである、medrec ドメインを構成し、サンプルアプリケーションを動かしてみます。

本記事の手順により、12.2.1 の目玉機能である、Multitenant(マルチテナント)機能を試すこともできます。

手順

1. 事前準備

まずは、前回の記事の、「1-5. WebLogic Server, JDKインストーラをダウンロードする」までの手順を済ませてください。 以降はそれが済んだ後の手順となります。

1-1. サンプルドメイン構成用の Dockerfile を修正する

今回の手順では、サンプルドメイン構成用の Dockerfile を利用します。
ダウンロードしたものをそのまま利用すると、後の手順で Docker run したときに自動的にドメインの構成が開始されます。今回はそれでは都合がわるいので、少し手を加えます。

$ cd ~/dock/OracleWebLogic/samples/1221-domain
$ vi Dockerfile.supplementaldomain

ファイルの終わりの方に、Docker イメージの .bashrc に3行追記している箇所がある(L71-L73)ので、最後の1行の追記が行われないように編集してください。

編集前

RUN echo "cp /u01/oracle/weblogic.properties /u01/oracle/weblogic/wlserver/samples/server/medrec/weblogic.properties" >> /u01/oracle/.bashrc && \
    echo "cp /u01/oracle/startSamples.sh /u01/oracle/weblogic/wlserver/samples/server/medrec/startSamples.sh" >> /u01/oracle/.bashrc && \
    echo ". /u01/oracle/weblogic/wlserver/samples/server/medrec/startSamples.sh" >> /u01/oracle/.bashrc

編集後

RUN echo "cp /u01/oracle/weblogic.properties /u01/oracle/weblogic/wlserver/samples/server/medrec/weblogic.properties" >> /u01/oracle/.bashrc && \
    echo "cp /u01/oracle/startSamples.sh /u01/oracle/weblogic/wlserver/samples/server/medrec/startSamples.sh" >> /u01/oracle/.bashrc

1-2. 必要なインストーラをダウンロードする

サンプルドメインをインストールするには、Suppelemental Quick Installer で、追加のコンポーネントをインストールする必要があります。

こちらから、fmw_12.2.1.0.0_wls_supplemental_quick.jar をダウンロードし、~/dock/OracleWebLogic/samples/1221-domain/ に配置します。

2. ゲストOS、Docker コンテナを起動する

2-1. ゲストOSのプロビジョニング

前回の記事の「2-1. ゲストOSのプロビジョニング」と同じ手順を実施してください。

2-2. Dcoker イメージのビルド

ここからは、ゲストOS上での手順です。まずは Docker イメージをビルドします(前回と同じ)。

[vagrant@guest] $ cd ~/sync/OracleWebLogic/dockerfiles
[vagrant@guest] $ sudo sh buildDockerImage.sh -v 12.2.1 -d

この Docker イメージをベースにして、Supplemental Quick Installer の追加コンポーネントをインストールした Docker イメージをビルドします。

[vagrant@guest] $ cd ~/sync/OracleWebLogic/samples/1221-domain
[vagrant@guest] $ ln -s ./Dockerfile.supplementaldomain ./Dockerfile
[vagrant@guest] $ sudo docker build -t wls.supplementaldomain:12.2.1 ./

2-3. Docker コンテナの起動

以下のコマンドで Docker コンテナを起動します(ポートフォワーディングの設定は必要な物に絞ってあります)

[vagrant@guest] $ sudo docker run -p 7011:7011 -it --name=wlsadmin wls.supplementaldomain:12.2.1
[oracle@xxxxxxxxxxxx medrec]$ (←コンテナのシェルに切り替わる)

3. medrec ドメインを構成する

3-1. 管理サーバーの起動スクリプトの修正

ドメインの構成を行う前に、構成時に実行される管理サーバーの起動スクリプトに手を加えます。

このスクリプトでは、WLST を使って管理サーバーの起動をおこなっています。この処理で、起動状態のヘルスチェックでタイムアウトとなることを避けるため、タイムアウト時間を無制限(0)に変更します。

[oracle@xxxxxxxxxxxx medrec]$ cd /u01/oracle/weblogic/wlserver/samples/server/medrec/install/common
[oracle@xxxxxxxxxxxx common]$ vi startAdminServer.py

変更前

startServer(serverName, domainName, url, username, password, domainDir, 'true', jvmArgs=jvmargs)

変更後

startServer(serverName, domainName, url, username, password, domainDir, 'true', 0, jvmArgs=jvmargs)

3-2. ドメイン構成用スクリプトの修正(マルチテナントの medrec ドメインを構成する場合)

(シングルテナント(=従来と同じ)のドメインを構成したい場合は 3-3. に進んでください)

ドメインを構成するときに実行する startSamples.sh は、内部で ant コマンドを使っています。このコマンドのオプションを変えることによって、マルチテナントのドメインを構成することができます。

[oracle@xxxxxxxxxxxx medrec]$ cd /u01/oracle/weblogic/wlserver/samples/server/medrec
[oracle@xxxxxxxxxxxx common]$ vi startSamples.sh

変更前

ant single.server.sample

変更後

ant mt.single.server.sample

3-3. マルチテナントの madrec ドメインを構成する

いよいよドメインの構成を開始します。 コンテナ上で、以下のコマンドを実行します(結構時間がかかります)

[oracle@xxxxxxxxxxxx medrec]$ cd /u01/oracle/weblogic/wlserver/samples/server/medrec
[oracle@xxxxxxxxxxxx medrec]$ sh ./startSamples.sh

3-4. medrec アプリケーションにアクセスしてみる

無事に "BUILD SUCCESSFUL" のメッセージが表示されたら、ドメインの構成は完了です。WebLogic Server 管理コンソールと、medrec アプリケーションにアクセスしてみます。

おまけ: スクリーンショット

管理コンソール(マルチドメイン)にアクセスしたところ。
3つのドメインパーティションが構成されているのがわかります。

f:id:charlier_shoe:20151118123811p:plain

medrec アプリケーションにアクセスしたところ。
ドメインの切り分けが、URLのパス "/valley1" のところに反映されています。 ホストパート部分で切り替えることはできるのかな?パスで切り替えるのは嫌われるケースもありそうな気が。

f:id:charlier_shoe:20151118123817p:plain

WebLogic Server 12.2.1 がインストールされた Docker コンテナを、Vagrant のゲストOS上に構成する

本記事では、Oracle 公式の Dockerfile とスクリプトを利用して、WebLogic Server 12.2.1 がインストールされた Docker コンテナを、Vagrant のゲストOS上に構成します。
この手順により、以下のような構成の WLS 12.2.1 環境が出来上がります。

  --------------------------------------------------
  | Dockerコンテナ (Oracle Linux 7.0) + WLS 12.2.1 |
  --------------------------------------------------
  | ゲストOS(CentOS 7) + Docker                   |
  --------------------------------------------------
  | ホストOS (Windows) + VirtualBox                |
  --------------------------------------------------

私の環境は Windows 7 Professional x64 なので、本手順の実績のあるホストOSは左記のものになります。また、WLS のドメインは、本記事の手順では空のドメインが構成されます。

サンプルアプリなどがインストールされた環境を作ることもできるはずですが、手順を確立したら、追って紹介したいと思います。

手順

1. 事前準備

1-1. 必要なソフトウェアを準備する

はじめに、ソフトウェアをインストールしていきます。(括弧内は、本手順の確認に使用したバージョン)

1-1-1. VirtualBoxのインストール

ダウンロードサイトから適切なインストーラをダウンロードし、実行します。

1-1-2. Cygwinのインストール

ダウンロードサイトから適切なインストーラをダウンロードし、実行します。

Cygwinのインストールの際、以下のコンポーネントを併せてインストールしておく必要がありますので注意してください(後からでも追加できます)。

インストールが完了したら、Cドライブへのシンボリックリンクを貼っておきます。これにより、ゲストOSとホストOSの共有フォルダを構成する際に、ホストOS側のパスを正しく解決できるようにします。
Cygwinを起動して、以下のコマンドを実行してください。

$ cd /
$ ln -s /cygdrive/c c
1-1-3. Vagrantのインストール

ダウンロードサイトから適切なインストーラをダウンロードし、ウィザートにしたがってインストールします。

インストールが完了したら、vbguestプラグインをインストールします。これにより、VagrantにVirtutalBoxのguest additionsを自動更新するためのプラグインをインストールします。
Cygwinを起動して、以下のコマンドを実行してください。

$ cd ~/
$ vagrant plugin install vagrant-vbguest

1-2. 作業フォルダを作成する

今回は、作業フォルダのトップを "~/dock" とします。ここが Vagrant プロジェクトのルートディレクトリも兼ねることにします。
Cygwinを起動して、以下のコマンドを実行します。

$ mkdir ~/dock

1-3. Oracle 公式の Dockerfile、スクリプト群をダウンロードする

Oracle が提供する Dockerfile、スクリプト群 をダウンロードします。公式のマニュアルからリンクされていますので、Oracle が公式に提供しているもののようです。

上記リンク先で、[Download ZIP] をクリックして zip アーカイブをダウンロードします。アーカイブを解凍したら、docker-master ディレクトリ配下のファイル、ディレクトリを、~/dock 直下にコピーします。

1-4. Vagrantfile を作成する

ゲストOSは Vagrant を使ってプロビジョニングするので、Vagrantfile を ~/dock の配下に作成します。
内容は以下のようにします。リソースの割当て量は、環境に合わせて調整してください。

Vagrant.configure(2) do |config|

    config.vm.define :dock, primary: true do |dock|
        # VM settings
        dock.vm.box = "centos/7"
        dock.vm.provider "virtualbox" do |v|
            v.name = "dock"
            v.cpus = "2"
            v.memory = "4096"
        end
        dock.vm.synced_folder ".", "/vagrant", type: "rsync"
        dock.vm.network "forwarded_port", host: 5556, guest: 5556
        dock.vm.network "forwarded_port", host: 7001, guest: 7001
        dock.vm.network "forwarded_port", host: 7011, guest: 7011
        dock.vm.network "forwarded_port", host: 8001, guest: 8001

        # Provisioner settings
        config.vm.provision "docker"
    end

end

ゲストOSに Dockerfile 等を転送する手間を省くために、~/dock(カレントディレクトリ)との共有ディレクトリを設定しています。
また、WebLogic Server を使うときに用いる主要なポート対し、ポートフォワーディングの設定をしています。

1-5. WebLogic Server,JDKインストーラをダウンロードする

以下のインストーラをダウンロードし、~/dock/OracleWebLogic/dockerfiles/12.2.1/ に配置します。

ここまでの手順を終えると、ディレクトリは、以下の様な構成となるはずです。間違って配置されていないか、注意してください。

~/dock
├─MySQL/
├─OracleCoherence/
│    …
├─OracleWebLogic/
│  ├─dockerfiles/
│  │  ├─12.1.3/
│  │  │    …
│  │  ├─12.2.1/
│  │  │  ├―fmw_12.2.1.0.0_wls_quick.jar
│  │  │  ├―jdk-8u60-linux-x64.rpm
│  │  │  └―Dockerfile.developer
│  │  │    …
│  │  └─buildDockerImage.sh
│  └─samples/
│      ├─1213-domain/
│      │  └─container-scripts/
│      │        …
│      │    …
│      └─1221-domain/
│          ├─container-scripts/
│          │    …
│          └―Dockerfile.emptydomain
│              …
├─README.md
└―Vagrantfile

以上で準備完了です。

2. ゲストOS、Dockerコンテナを起動する

2-1. ゲストOSのプロビジョニング

ゲストOSの box イメージを取得します。本記事では CentOS 7 を利用します。Cygwin を起動して、以下のコマンドを実行します。

$ vagrant box add centos/7 --provider virtualbox

次に、以下のコマンドを実行します。ゲストOSのプロビジョニングが行われ、続けてゲストOSが起動します。

$ cd ~/dock
$ vagrant up

上記のコマンドの完了したら、SSHでゲストOSに接続し、~/sync フォルダ以下にホストOSの ~/dock 配下のファイルが参照できることを確認してください。

$ vagrant ssh
[vagrant@guest] $ ls ~/sync

2-2. Dockerイメージのビルド

以下のコマンドを実行して Docker イメージをビルドします。以降のコマンドは、ゲストOS上で実行することに注意してください。

[vagrant@guest] $ cd ~/sync/OracleWebLogic/dockerfiles
[vagrant@guest] $ sudo sh buildDockerImage.sh -v 12.2.1 -d

ビルドの処理の中で、WebLogic Server のインストールも行われます。正常に処理が完了すると、WebLogic Server をインストール済みの Docker イメージができあがります。

更に、上記の Docker イメージをベースにして、空のWLSドメインを構成済みの Docker イメージをビルドします。

[vagrant@guest] $ cd ~/sync/OracleWebLogic/samples/1221-domain
[vagrant@guest] $ ln -s ./Dockerfile.emptydomain ./Dockerfile
[vagrant@guest] $ sudo docker build -t myweblogic:12.2.1 ./

2-3. Dockerコンテナの起動

以下のコマンドを実行して、ビルドした Docker イメージからコンテナを起動します。startWebLogic.sh が自動的に実行されます。

[vagrant@guest] $ sudo docker run -p 5556:5556 -p 7001:7001 -p 7011:7011 -p 8001:8001 -it --name=wlsadmin myweblogic:12.2.1

上記のコマンドで、-p オプションを複数していますが、これらは、Docker コンテナとゲストOS間のポートフォワーディングの設定です。

バックグラウンドで起動する場合は、以下のようにコマンドのオプションを変更します。

[vagrant@guest] $ sudo docker run -p 5556:5556 -p 7001:7001 -p 7011:7011 -p 8001:8001 -d --name=wlsadmin myweblogic:12.2.1

2-4. 管理コンソールにアクセスしてみる

Dockerコンテナへのポートフォワーディングが設定済みです。ホストOSのブラウザで、以下のURLにアクセスすると、WLSの管理コンソールにアクセスできます。

http://localhost:8001/console

管理者ユーザーのユーザーのユーザー名、パスワードは以下のとおりです。

  • ユーザー名: weblogic
  • パスワード: welcome1


WebLogic Server 12.2.1 がインストールされた Docker コンテナを、Vagrant のゲストOS上に構成する手順は、以上です。