きどたかのブログ

いつか誰かがこのブログからトラブルを解決しますように。

WASでJythonを使って遊びましょう

さいきんJythonをカリカリ書いてて気付いたことがある。

 

これまでの自分のJythonの書き方は、

小さいプログラムでクラスまで作ろうとしてなかった。

うん、これからはクラスも作ろう。

実はクラスどころか小さすぎてdefすら使ってなかった。

今回は作るものが多く、多少は設計しようと思ってるので

実験しつつ情報収集しておるところです。

 

先日気付いたことは、@staticmethodと@classmethodが使えないことだ。

これはつまりクラスにstaticなメソッドを持たせられないことを意味する。

理由は簡単でこれらのアノテーションJython 2.2からのもの。

WAS V7が使用しているのはJython 2.1なのだ。

あー、残念。

 

今日気付いたもう一つのことがある。

これまではimportがサポートされていなかったらしい。

へー、import sysしか使ってなかったから気付かなかった。

PM55525: SUPPORT JYTHON IMPORT OF PACKAGES IN WSADMIN

WAS7.0.0.23から使える。

>wsadmin.bat -lang jython -javaoption "-Dwsadmin.libraries.packages=C:/path/" -f main.py

 

main.pyの中身

import sys
import server as util

print util.Server().getServerId("node1","server1")
print util.getStaticServerId("node1","server1")

 

server.pyの中身

import sys
class Server:
    def getServerId(self, nodeName, serverName):
		return getStaticServerId(nodeName, serverName)

def getStaticServerId(nodeName, serverName):
	return AdminConfig.getid("/Node:" + nodeName + "/Server:" + serverName + "/")

やってることにはあまり意味はない。

 

注意点:サブディレクトリは探索してくれない

たとえ-Dwsadmin.libraries.packagesを指定しても、

そのサブディレクトリまでは探索してくれない。

そのため、ディレクトリの列挙をする必要がある。

訂正文:パッケージを認識させるためには__init__.pyを置かないといけないんだね。

 

wsadmin.librariesとwsadmin.libraries.packages

wsadmin.librariesの方が古くからある。

これを使うとimportを記述しなくても書けたりする。

メインのスクリプトが流れる前に読み込まれる。

こちらの場合はサブディレクトリまで探索してくれる。

たとえばこれでhoge.pyを先に読み込ませたとすると、

メインのスクリプトではimportなしでこんな感じのが書ける。

hoge.sayHoge()

これはimport xx as yyが使えるか?

ええ、ちゃんと使えます。

import hoge as fooにすることも可能。

さてさて、この2種類の仕組みをどう使いわけるべきなんでしょうね・・・。

あとから出た方のが良いのでしょうね、きっと。

 

自分の実験だと、defを使わずにスクリプトファイルが読み込まれた時に動く部分で

AdminConfigなどを書けるか否かという違いがあります。

defで書いてる部分は問題ないと思います。

wsadmin.librariesの場合はそのような場所にAdminConfigなどを書けません。

書いた場合は実行時にエラーになって、その後の処理に問題が生じます。

ようはエラーより後ろのdefで宣言してる関数が宣言されてないことになる。

wsadmin.libraries.packagesの場合は書けます、そしてimport時に実行されてます。

色々なスクリプトからimportされてても1度しか呼ばれません。

 

wsadmin.librariesの読み込み順序は、アルファベット順のようだ。

どこかに仕様が書いてないかな・・・。

ファイルもディレクトリもアルファベット順っぽいので、

サブディレクトリのものが先に読み込まれることもある。

 

javaoptionを複数指定するときは・・・

えと、-javaoptionで複数指定する時は、

こんな感じっぽい -javaoption "-Dhoge=hoge" -javaoption "-Dfoo=foo"

なんかこれではうまくいかない -javaoption "-Dhoge=hoge -Dfoo=foo"

 

execfile(script.py)はどこ探すんだ?

どうもカレント・ディレクトリを起点に探すようですね

あまり使いたいとは思わないです。

これを使うよりは上述の2種類の方法を用いて

きちんとdefで整理して書くのが良いのではないだろうか。

シェルなどを呼び出すとかなら仕方ないだろう。

 

まだまだ奥が深いなJythonは。

さいきん書き上げたスクリプトは、リスナーポート関係。

あれはサーバー単位で設定するものなんだが、

面倒臭いからクラスタ名指定で、クラスタメンバを拾ってきて

各サーバーに同じ設定を施すようなものを書いた。

同じ理屈のものはたくさんある。

JVM汎用引数だってそういう感じで書くつもり。

 

いまのところ、設定値を保持できるクラスを書き、

関数の引数にスコープに関する値をもらうような作りにしている。

クラスタ名か、もしくはノード名およびサーバ名。

 

JDBCとかJMSとか、設定する量が多いところはけっこう経験があるのだが、

今回は量が少ないところの設定も完全にスクリプトにするのでかなーり面倒臭い。

これまで見てきていない属性名とかをいちいち調べないといけない。

startupBeansServiceがserver-pme.xmlの方だったとか初めて気付いたよ。