WAS(WebSphere Application Serv
er)にデプロイしたアプリケーションは、Integrated Solution Console(通称:「管理コンソール」)を使って各種のカスタマイズができます。そして実際にこの管理コンソールから行ったカスタマイズ内容の多くは Jython(Python) のスクリプトとして出力することができます。いったんスクリプト化してしまえば、次回からはコマンドラインからも同じ処理を実行することができるようになるため、何かと便利なわけです。その辺りは以前のブログエントリでも触れていますので参照ください。
この機能は非常に便利なのですが、残念ながら管理コンソール上での全てのオペレーションが Jython 化できるわけではありません。そのようなスクリプトは検索して見つけるか、自分で作成する必要が出てきます。以下は実際に自分が業務の中で遭遇したケースで、ググっても情報があまり見つからなかった(特にデプロイ済みアプリへの変更は1つもなかったので自分でスクラッチして作った)ので、備忘録も兼ねてブログにまとめてみました。
現状、管理コンソールから Jython 生成ができないオペレーションの1つが「クラスローダー順序の変更」です。 アプリケーションがサーバー内で特定のクラスをロードしようとした際には、(1)既にロード済みのクラスがあればそれが返されます。ロード済みクラスがなかった場合、WAS のデフォルト動作では (2)まず親クラス上でロードを試みて、(3)親クラスからのロードができなかった場合に自分自身でロードする、という (1)→(2)→(3) の順序でクラスのロードを試みます。
ただこの仕様はケースによっては問題を引き起こします。新たにクラスをロードしようとすると親クラスのライブラリの内容が優先されるわけで、自分自身が期待しているクラスが必ずしもロードされなくなることが考えられます。また WAS 以外の某アプリケーション・サーバーではこの順序仕様が逆(子優先、親後回し)になっているため、アプリケーションとしてのポータビリティにも影響します。
当然、これらの仕様は「デフォルトでの動作」であって、明示的に指定するようカスタマイズしてしまえば変更できます。それが今回紹介するクラスローダーモードの変更です。クラスローダーモードには2種類あり、特定のアプリケーションモジュールを更新する際の変更と、デプロイ済みのアプリケーションのクラスをロードする際の変更があります。もちろん、どちらも管理コンソールからは行うことができます。が、どちらも Jython スクリプトを生成することが出来ない機能となっています。
アプリケーション更新時のクラスの再ロード方法の変更方法
管理コンソールの左メニューから アプリケーション - アプリケーションタイプ - WebSphere エンタープライズアプリケーション を選択し、
右画面にて (該当アプリケーション) - クラスロードおよび更新の検出 を選択すると、クラスローダー順序を変更する画面が表示されます。
デプロイ済みアプリケーションのクラスの再ロード方法の変更方法
管理コンソールの左メニューから アプリケーション - アプリケーションタイプ - WebSphere エンタープライズアプリケーション を選択し、
右画面にて (該当アプリケーション) - モジュールの管理 - (該当モジュール) を選択すると、クラスローダー順序を変更する画面が表示されます。
ではそれぞれのケースごとに(親クラスでのロードを最後にするように)モードを変更するスクリプトを紹介します。以下では "helloworld" という名前のアプリケーションを例に記述していますので、実際に使う場合は該当部分を変更してください。
まず、 アプリケーション更新時のクラスの再ロード方法を親を最後にする場合です。こちらは以下の様な Jython スクリプトで実現できます:
deployments = AdminConfig.getid("/Deployment:helloworld/" )
deploymentObject = AdminConfig.showAttribute(deployments, "deployedObject" )
classldr = AdminConfig.showAttribute(deploymentObject, "classloader" )
AdminConfig.modify(classldr, [["mode", "PARENT_LAST"]] )
AdminConfig.save()
一方、 デプロイ済みアプリケーションのクラスの再ロード方法を親を最後にする場合の Jython スクリプトは以下のようになります:
webModule=""
webModules = AdminConfig.list("WebModuleDeployment").split("\n")
for x in webModules:
if ( x.find("helloworld") > -1 ):
webModule = x
if len(webModule) > 0:
print webModule
AdminConfig.modify(webModule,[['classloaderMode','PARENT_LAST']])
AdminConfig.save()
なお強制的にデフォルトの設定(親クラスでのロード優先)を指定したり、一度変更した内容をデフォルトに戻すために再度変更するような場合は、上記の PARENT_LAST とした部分を PARENT_FIRST に変更することで実現できます。また両方の設定を変更するのであれば、上記2つの内容をそのまま足して、一連のスクリプトにしても構いません。
Jython スクリプトが作成できたら、例えばその内容を /tmp/update.jy などのテキストファイルに保存し、WAS の導入されたシステムから以下のようなコマンドを実行することで実際の処理を行うことができます(以下は Linux での例):
# ${WAS_PROFILE_ROOT}/bin/wsadmin.sh -lang jython -username virtuser -password password -f /tmp/update.jy
※ ${WAS_PROFILE_ROOT} は WAS のプロファイルルートディレクトリ
※-username virtuser と -password password は管理コンソールにセキュリティ設定した場合のユーザー名とパスワードの指定。セキュリティ設定していない場合は省略可
このように WAS の管理コマンドは Jython/Python(または JACL)で記述/実行することができるようになっています。個人的にはあまり Python を頻繁に使う機会は少ないのでたまに触れるとちょっと抵抗あったりします(苦笑)。ただ逆に普段 Python を使っていて、あまり WAS に馴染みのない開発者の方であれば、このような形で WAS の管理を自動化することができて、そこでは Python のスキルを発揮することができる、とも言えることになります。機会があれば是非触れてみてください。
Tags: 
was
webshere
jython
wsadmin