[groovyserv]groovyClient から、 groovy.ui.Console を立ち上げた時の挙動の質問

56 views
Skip to first unread message
Message has been deleted
Message has been deleted

kimukou_26

unread,
Mar 31, 2011, 12:53:42 AM3/31/11
to groov...@googlegroups.com
各位様)

メールに不首尾が有りましたので再送いたします。
御迷惑をおかけします


検証環境)
JDK6u24
groovyserv-0.6
groovy-1.7.10
WindowsXPSP3

添付ファイルの拡張子をzipに変更して解凍してください
output.z => output.zip


検証コード)
https://github.com/kimukou/g100pon/blob/master/processing_test.groovy

比較BAT)
https://github.com/kimukou/g100pon/blob/master/run_processing_test.bat
こちらはRunすると正常に動きます


g100pon/libprocess に processingの core.jar が入っている状態です


A) gv_test.bat processing_test.groovy
で実行した時(groovyservのサーバープロセスは立ち上がっていません)

GroovyConsole上でRunした時のコンソール上のエラー
output_console.txt
GroovyServログ1:1_groovyserver-1961.log

B)GroovyConsoleを終了させて再度A)実行した時に
GroovyConsole立ち上がらない
ログ2:2_groovyserver-1961.log

一度GroovyServのサーバープロセスを終了すれば、起動できる事は確認しました
<set GROOVYSERV_OPTS=-Dgroovyserver.verbose=true による記述のせいかと思います

output.z

kimukou_26

unread,
Apr 3, 2011, 2:21:23 AM4/3/11
to groov...@googlegroups.com

肝心の質問が抜けていました。大変申し訳ありません

比較BATのような事をGroovyservで行いたいのですが
A)のgv_test.bat の記述設定が間違っているかどうか?

  普通のgroovy.batだとCLASSPATH環境変数に
  事前にライブラリを通せばそのライブラリを使用可能と教えて頂きましたが
  同じ対応は駄目なのかどうか?

B)のクライアントを一度終了して二度目に実行した時に
  =-Dgroovyserver.verbose=true が指定されていると起動しない件
   1)Windowsのみで起こる環境依存かどうか?
   2)現在の動作仕様なのか?
    2-1)動作仕様の場合は回避方法があるのかどうか?

よろしくお願い致します

>----------------------------------------------
>From: Yasuharu Nakano <yn...@jggug.org>
>To: groov...@googlegroups.com
>Cc: kimukou_26<iv6k...@asahi-net.or.jp>
>Subject: Re: [groovyserv:88] [groovyserv]groovyClient から、 groovy.ui.
Console を立ち上げた時の挙動の質問


>肝心の質問が書いてないのですが、予期しないエラーが困っているがどうした
>らよいか、ということですか?

>----------------------------------------------

Yasuharu Nakano

unread,
Apr 19, 2011, 4:58:21 AM4/19/11
to groov...@googlegroups.com
中野です。

いつも動作報告ありがとうございます。
年度初めの事務作業などでなかなか時間がとれず連絡が遅れてすいません。

ただ、本件調査はしてみたのですが、いただいた情報だけではちょっと状況と問題点が把握し切れていません。

----------------------------------------------------------
▼Aについて

> 比較BATのような事をGroovyservで行いたいのですが
> A)のgv_test.bat の記述設定が間違っているかどうか?
>
>   普通のgroovy.batだとCLASSPATH環境変数に
>   事前にライブラリを通せばそのライブラリを使用可能と教えて頂きましたが
>   同じ対応は駄目なのかどうか?

AのGroovyConsole上の結果メッセージと思われるoutput_console.txtでは、ClassNotFound系のエラーはでていない(=CLASSPATH周りを疑うような情報はログには出ていない)のですが、上記の質問はエラー原因の解析とは関係なく、単なる現状の仕様の確認でしょうか?

現状のGroovyServの仕様は以下の通りです。Windowsでも変わりません。

http://kobo.github.com/groovyserv/README.ja.html
ただし環境変数CLASSPATHについては、これらのオプションを指定しなくて
も、毎回実行ごとにクライアント側の値が動的にサーバ側に反映されます。
このクラスパスはセッションごとにクリアされて次回の実行に影響すること
はありません。

ただ上記ではちょっと言葉足らずなところがあり、以下をドキュメントに追記する予定です。
------------------------
クライアントのCLASSPATH環境変数と-cp/--classpathの指定は、サーバ側のCLASSPATH環境変数には設定されません。
サーバ側で実行されるgroovyスクリプトに対して、そのときの実行にのみ影響するようになっています。
------------------------

なお、output_console.txtにでている以下のエラーは、再現させてないのではっきりはわかりませんが、Swingに関する既知の問題かと思われます。(https://github.com/kobo/groovyserv/issues/8)

org.jggug.kobo.groovyserv.SystemExitException: called System.exit(0)
at org.jggug.kobo.groovyserv.NoExitSecurityManager2.checkExit(NoExitSecurityManager2.java:32)
at javax.swing.JFrame.setDefaultCloseOperation(JFrame.java:372)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

なお、現状では、Swingアプリのサポートについてあまり優先度は高く考えていないため、対応する/できるかどうかは不明です。(どちらかというと本件については「対応できるか」が不明。)

----------------------------------------------------------
▼Bについて

> B)のクライアントを一度終了して二度目に実行した時に
>   =-Dgroovyserver.verbose=true が指定されていると起動しない件
>    1)Windowsのみで起こる環境依存かどうか?
>    2)現在の動作仕様なのか?
>     2-1)動作仕様の場合は回避方法があるのかどうか?

こちらの環境では再現できません。
「groovyserver.verbose=trueが指定されていると起動しない」ということは、これを削除すると期待通りに動作した、ということでしょうか?

現状、何が起こったのかが把握できていないので、環境依存性や仕様(制約)かどうかについてはわかりません。
実行した手順ごとに対応するログ部分が切り分けられていればもう少し何か分かるかも知れません。

----------------------------------------------------------
▼動作報告メールについてのお願い

今後、可能であれば以下の点を考慮していただけるともう少し迅速な対応ができることもあるかと思います。

- 再現可能な最小限の条件を整理する (今回のProcessingのように特定の環境を準備しないといけない場合は、解析作業に取りかかりづらいです)
- 期待する動作と、実際に起こった動作と、その間のギャップ(どの点が問題だと思っているか)について簡潔に記述する
- 実行した手順はできるだけ具体的に箇条書きで記述する (再現できないことには修正もできないので)
- 1件のバグレポートでは1つの問題のみ記述する
- http://d.hatena.ne.jp/takkie/20081026/1225010315

なにぶん開発者の稼動も限られているので、ご協力いただけると助かります。
もちろん、とっかかりも得られないような事象の場合はそのままご報告いただいて構いません。


なお、今回の解析で本件とは全くの別件ながらクラスパス周りのバグがいくつかみつかりました。(対処済み)
ありがとうございます;-)

以上です。

2011/4/3 kimukou_26 <IV6K...@asahi-net.or.jp>:

--
Yasuharu NAKANO / nobeans

kimukou_26

unread,
Apr 19, 2011, 7:39:39 PM4/19/11
to groov...@googlegroups.com

中野様
いつもお忙しい中お時間を取って頂き大変感謝しております。


▼Aについて
> ------------------------
> クライアントのCLASSPATH環境変数と-cp/--classpathの指定は、サーバ側のCLASSPATH環境変数には設定され
ません。
> サーバ側で実行されるgroovyスクリプトに対して、そのときの実行にのみ影響するようになっています。
> ------------------------

まずこの部分は確認したかった事なので、ベストな回答ありがとうございます
<別の環境変数、引数等で指定しないと駄目なのかを懸念していましたので

・アクセスエラーについて
groovy-allににクラスパスを指定してGroovyConsoleを立ち上げた場合は動いていますので、
groovyserv=>groovyConsoleを呼ぶ
時に
 「なにかおまじないがいる」
のかな とお聞きしたかった面があります


groovyスクリプトを業務で使う場合、
griffon等で重厚な操作UIをガッツリ作るより、
ちょっとしたSwingBuilderスクリプトで操作UIが欲しい
みたいな話がどうしても多いので(簡易のログビューアとか)、
その用途でgroovyservと組み合わせて使えないかと思った次第です<起動が速いほうがベターなので

<Classpathにjarを指定しているのは、オフライン実行のケースが多い為に
 分かりやすい例としてprocessing.jarを使用させて頂きました。
実際は業務上で使っているライブラリのjarを通したいイメージです


▼Bについて
=-Dgroovyserver.verbose=true が指定されていると起動しない件

1)指定無しなら立ち上がるか
問題無く立ち上がります

2)なぜこのような質問をしたか?
以前から教えて頂いている方法だと、groovyservのサーバープロセスを-vで立ち上げて、クライアントを立ち
上げる
という形で

サーバープロセス(シングルトン)<=>クライアント(複数)

のイメージだった為2度指定して立ち上げようとする=>2個目は立ち上がらない=>クライアントもその時点
で終了
というのが動作仕様なのかとお聞きしたかった形です

3)なぜ-Dgroovyserver.verbose=true が指定で起動?

状況の詳細ログを取得する為<ML報告用 で行った形です

通常運用では上記は指定する事無いオプションだと思いますので、優先度はかなり低いかなと思います。

ただベターな形とすれば
サーバープロセスを二つ立ち上げない=>OK
クライアントプロセスは立ち上がる
の形か、
 既に立ち上がっているよ なチェックをする方法があるか
のどちらかがあると助かったりします
<もちろんWin限定の挙動の可能性は大です(Winはスレッド管理やポート管理がいまいちな面があるので


> From: Yasuharu Nakano <yn...@jggug.org>
> Reply-To: groov...@googlegroups.com
> To: groov...@googlegroups.com
> Subject: Re: [groovyserv:90] Re: [groovyserv]groovyClient から、 groovy.
> ui.Console を立ち上げた時の挙動の質問
>
>

> >>From: ? ? Yasuharu Nakano <yn...@jggug.org>
> >>To: ? ? ? groov...@googlegroups.com
> >>Cc: ? ? ? kimukou_26<iv6k...@asahi-net.or.jp>
> >>Subject: ?Re: [groovyserv:88] [groovyserv]groovyClient から、 groovy.ui.
> > ? ? ? ? ?Console を立ち上げた時の挙動の質問


> >
> >
> >>肝心の質問が書いてないのですが、予期しないエラーが困っているがどうした
> >>らよいか、ということですか?
> >
> >>----------------------------------------------
> >>各位様)
> >>
> >>メールに不首尾が有りましたので再送いたします。
> >>御迷惑をおかけします
> >>
> >>
> >>検証環境)
> >> JDK6u24
> >> groovyserv-0.6
> >> groovy-1.7.10
> >> WindowsXPSP3
> >>
> >>添付ファイルの拡張子をzipに変更して解凍してください
> >>output.z => output.zip
> >>
> >>
> >>検証コード)

> >> ? ? ? https://github.com/kimukou/g100pon/blob/master/processing_test.groovy
> >>
> >>比較BAT)
> >> ? ? ? https://github.com/kimukou/g100pon/blob/master/run_processing_test.bat
> >> ? ? ? こちらはRunすると正常に動きます


> >>
> >>
> >>g100pon/libprocess に processingの core.jar が入っている状態です
> >>
> >>
> >>A) gv_test.bat processing_test.groovy
> >>で実行した時(groovyservのサーバープロセスは立ち上がっていません)
> >>
> >>GroovyConsole上でRunした時のコンソール上のエラー

> >> ? ? ? output_console.txt
> >> ? ? ? GroovyServログ1:1_groovyserver-1961.log
> >>
> >>B)GroovyConsoleを終了させて再度A)実行した時に
> >>GroovyConsole立ち上がらない
> >> ? ? ? ログ2:2_groovyserver-1961.log

Yasuharu Nakano

unread,
Apr 21, 2011, 4:14:15 AM4/21/11
to groov...@googlegroups.com
中野です。

> ▼Aについて
> > ------------------------
> > クライアントのCLASSPATH環境変数と-cp/--classpathの指定は、サーバ側のCLASSPATH環境変数には設定され
> ません。
> > サーバ側で実行されるgroovyスクリプトに対して、そのときの実行にのみ影響するようになっています。
> > ------------------------
>
> まずこの部分は確認したかった事なので、ベストな回答ありがとうございます
> <別の環境変数、引数等で指定しないと駄目なのかを懸念していましたので
>
> ・アクセスエラーについて
> groovy-allににクラスパスを指定してGroovyConsoleを立ち上げた場合は動いていますので、
> groovyserv=>groovyConsoleを呼ぶ
> 時に
>  「なにかおまじないがいる」
> のかな とお聞きしたかった面があります

- クライアント側のCLASSPATHで設定しただけだとサーバ上で起動されているGroovyConsoleで、そのCLASSPATHのjarが使えなかった
- $GROOVY_HOME/libにサードパーティのjarを入れた場合にはGroovyConsoleでもそのjarを使えた

ということですか?
YesであればそれはGroovyServというよりも、GroovyConsoleの動作も含めて現状の仕様なんだと思います。
GroovyConsoleで実行されるスクリプトでは、その時点のGroovyConsoleプロセスの環境変数は引き継いで利用できるけれど、GroovyConsoleを起動されたときの-cpは使えない、とか。GroovyServで特に何かしてるわけではないです。

$GROOVY_HOME/libを使わずにGroovyServ経由で任意のサードパーティライブラリを使いたい場合は、以下のいずれかの方法で実現できると思います。

- groovyserverのプロセスを起動するときにCLASSPATHを設定しておく
$ set CLASSPATH="C:\hoge\foo.jar;D:\bar.jar"
$ groovyserver.bat

- GroovyConsole起動前にクラスローダにパスを追加する
groovyclient -e "
Thread.currentThread().getContextClassLoader().addURL(new
URL('file:★追加したいjarのパス★'))
groovy.ui.Console.main(args)
" $*

前者は起動したgroovyserver上での全ての処理に影響します。
後者は一度コンテキストクラスローダにパスを指定した後は、その後のスクリプトの処理全てに影響します。もう少し局所的なやり方ができるかも知れませんが、GroovyConsoleのソースを見ながらハックする感じになるので今回はそこまで詰めていません。


> groovyスクリプトを業務で使う場合、
> griffon等で重厚な操作UIをガッツリ作るより、
> ちょっとしたSwingBuilderスクリプトで操作UIが欲しい
> みたいな話がどうしても多いので(簡易のログビューアとか)、
> その用途でgroovyservと組み合わせて使えないかと思った次第です<起動が速いほうがベターなので
>
> <Classpathにjarを指定しているのは、オフライン実行のケースが多い為に
>  分かりやすい例としてprocessing.jarを使用させて頂きました。
> 実際は業務上で使っているライブラリのjarを通したいイメージです
>
>
> ▼Bについて
> =-Dgroovyserver.verbose=true が指定されていると起動しない件
>
> 1)指定無しなら立ち上がるか
> 問題無く立ち上がります

なるほど。


> 2)なぜこのような質問をしたか?
> 以前から教えて頂いている方法だと、groovyservのサーバープロセスを-vで立ち上げて、クライアントを立ち
> 上げる
> という形で
>
> サーバープロセス(シングルトン)<=>クライアント(複数)
>
> のイメージだった為2度指定して立ち上げようとする=>2個目は立ち上がらない=>クライアントもその時点
> で終了
> というのが動作仕様なのかとお聞きしたかった形です

ちょっと確認されたいイメージがわからないのですが、

- 故意にポート番号を指定して起動しない限りサーバプロセスは基本的に1つ
(複数リクエストに対してはマルチスレッドで対応)
- クライアントはネイティブアプリで同時に複数アクセス可能

です。
別のポート番号を明示指定せずに複数回groovyserver.batを実行すると、1つめは正常に起動し、2つめ以降は起動途中で以下のエラーをgroovyserver-<PORT>.logに出力しながら異常終了します。
この動作は、-Dgroovyserver.verbose=trueの指定に依存しません。

2011/04/21 16:26:18.362 ---> java.net.BindException: Address
already in use: JVM_Bind

groovyclient.exe経由の場合は、1つめは正常にgroovyserverが起動してからスクリプトが実行されます。
2回目以降は既存のgroovyserverでスクリプトが実行されます。
この動作は、-Dgroovyserver.verbose=trueの指定に依存しません。
#実際に今回私の環境(WinXP)では動作が確認できています。


> 3)なぜ-Dgroovyserver.verbose=true が指定で起動?
>
> 状況の詳細ログを取得する為<ML報告用 で行った形です
>
> 通常運用では上記は指定する事無いオプションだと思いますので、優先度はかなり低いかなと思います。

まさにその用途のためのオプションなので目的としては全く問題はないです。


> ただベターな形とすれば
> サーバープロセスを二つ立ち上げない=>OK
> クライアントプロセスは立ち上がる
> の形か、
>  既に立ち上がっているよ なチェックをする方法があるか
> のどちらかがあると助かったりします
> <もちろんWin限定の挙動の可能性は大です(Winはスレッド管理やポート管理がいまいちな面があるので

前述の通り、上記の「ベターな形」が仕様であり実装されているつもりなので、起きている事象とその原因は少なくとも仕様ではなくて、単に何らかのトラブルと思われます。

トラブルが再現するできるだけシンプルかつ具体的手順とスクリプトセットをいただければ、もうすこしはっきりすると思います。

kimukou_26

unread,
Apr 21, 2011, 11:48:44 PM4/21/11
to groov...@googlegroups.com
中野様
kimukou_26です。
たびたびコメント有難うございます。

▼Aについて
中野様の以前のML上での御指摘のとおり、ClassNotFoundのエラーは出ていませんのでクラスパス自体は通って
いると思います。
ただ SecyrtyExceptionが出ているため、これは何らかの指定で回避可能かなと
<サーバープロセス側のログアクセス絡みの可能性もあるかも..(多重書き込みとか
アドバイスを頂きたかった状態です。


実行BAT(groovy)は別にしたいので、その場その場でclasspathに別のjarが通される認識の方が逆にベターな形
です。


2),3)に関して
ベターな実装がされていて、環境依存の可能性が高い
という回答を頂きましたので、もう少し時間をかけて状況を切り分けさせてください
(別のスクリプト等でも再検証してみます)

よろしくお願いいたします

Yasuharu Nakano

unread,
Apr 21, 2011, 11:57:48 PM4/21/11
to groov...@googlegroups.com
> ▼Aについて
> 中野様の以前のML上での御指摘のとおり、ClassNotFoundのエラーは出ていませんのでクラスパス自体は通って
> いると思います。
> ただ SecyrtyExceptionが出ているため、これは何らかの指定で回避可能かなと
> <サーバープロセス側のログアクセス絡みの可能性もあるかも..(多重書き込みとか
> アドバイスを頂きたかった状態です。

いただいたログ等にはSecurityExceptionはでていませんが、どういう事象ですか?


> 実行BAT(groovy)は別にしたいので、その場その場でclasspathに別のjarが通される認識の方が逆にベターな形
> です。

意図が伝わっているか自信がないのですが、
GroovyServの動作としては毎回クラスパスをその回のスクリプト実行にだけ影響するように設定してます。
が、今回のGroovyServで起動したGroovyConsoleの例において、クライアントからのCLASSPATH or
-cp指定はGroovyConsole上のスクリプト実行時には使えません。
それはGroovyConsoleの仕様だと思います(前メール参照)。

--
Yasuharu NAKANO / nobeans

Reply all
Reply to author
Forward
0 new messages