サンプルコードの補足
初心者向けに書いたのに何の説明もしていませんでした。。。
解説するほどのコードでは無いのですが、リモートアクセスアプリケーションでは以下のような行が特徴です。
Session s = NotesFactory.createSession(host,cName,password) ;
よくよく考えると当たり前なのですが、リモートアクセスアプリケーションの場合にはリモートに対してセッションを張るので、createSession()メソッドではhostを指定しないといけないのです。
ローカルアクセスアプリケーションでは、以下のようにhost無しでcreateSession() を呼びます。
Session s = NotesFactory.createSession() ;
それと、あのサンプルを見て、「定数宣言しているhostやユーザーネームの値が格好悪い」て思った人は多いと思います。
接続先を変える度にコンパイルしなくてもいいように引数にして処理すればいいのに・・・て言うのはごもっともな意見なのですが、この手のテストコードでは僕はあまり気にしていないです。
引数の順番とか数を覚えるの面倒くさいし、コンパイル環境が整っていないと十分な調査はどうせ出来ないので効率よくコンパイルできるようにしておいたほうがデバッグコードとかを入れる上でも都合がいいし、この手のコードは出来るだけコードを短くしたいので、引数チェックや引数処理のコードを入れるのがどうしても好きになれない、て理由なのですが好みの問題だと思って流してください。。
ところで、リモートアクセスアプリケーションではNCSO.jarしか使いません。
Notes JavaクラスはLSXBEを使う、と言っていたのですがnlsxbe.dllやliblsxbe.so などはどのようにして使われるのでしょうか。
この場合、LSXBE はサーバー上でDIIOPタスクが代理で呼び出すような形式になります。当然DIIOPタスクには通信の媒介となる役目もあるので、サーバー上でDIIOPタスク上で作られたORBスタブとクライアントのORBスタブ同士で通信を行う訳ですが、DIIOPタスク上ではこのために、以下の二つのオブジェクトが存在する事になります。
1. 主にクライアント通信のために必要になるJavaオブジェクト
2. LSXBEのために必要になる C++ オブジェクト
1.と2.のオブジェクトは当然相関があるのですが、Garbage Collectionの対象になるのは1.だけなのでここで2.のC++ オブジェクトだけが浪費されてしまう事があります。(もちろんこれは一時的な浪費で、エージェントが終了すれば解放されるべきものです。)
これが、いわゆるNotes Javaクラス特有の recycle() が必要になる背景です。
この話も以下のTechnoteの4章に詳細が述べられています。LotusScriptではあまり意識する必要が無いのですが、Javaアプリケーションで大きなループをするときには必ずこの点について一度は考慮した方がよいと思います。たまにこういう問題に遭遇するとNotes のJVMはGCがちゃんと動かないような理由があるのではないか?と考えて、System.gc() を呼んでみようと考える人もいますが、これは予期しない結果を引き起こすのでしないようにして下さい。
Lotus Notes/Domino における Java 実行環境とその問題判別について (#729912)
解説するほどのコードでは無いのですが、リモートアクセスアプリケーションでは以下のような行が特徴です。
Session s = NotesFactory.createSession(host,cName,password) ;
よくよく考えると当たり前なのですが、リモートアクセスアプリケーションの場合にはリモートに対してセッションを張るので、createSession()メソッドではhostを指定しないといけないのです。
ローカルアクセスアプリケーションでは、以下のようにhost無しでcreateSession() を呼びます。
Session s = NotesFactory.createSession() ;
それと、あのサンプルを見て、「定数宣言しているhostやユーザーネームの値が格好悪い」て思った人は多いと思います。
接続先を変える度にコンパイルしなくてもいいように引数にして処理すればいいのに・・・て言うのはごもっともな意見なのですが、この手のテストコードでは僕はあまり気にしていないです。
引数の順番とか数を覚えるの面倒くさいし、コンパイル環境が整っていないと十分な調査はどうせ出来ないので効率よくコンパイルできるようにしておいたほうがデバッグコードとかを入れる上でも都合がいいし、この手のコードは出来るだけコードを短くしたいので、引数チェックや引数処理のコードを入れるのがどうしても好きになれない、て理由なのですが好みの問題だと思って流してください。。
ところで、リモートアクセスアプリケーションではNCSO.jarしか使いません。
Notes JavaクラスはLSXBEを使う、と言っていたのですがnlsxbe.dllやliblsxbe.so などはどのようにして使われるのでしょうか。
この場合、LSXBE はサーバー上でDIIOPタスクが代理で呼び出すような形式になります。当然DIIOPタスクには通信の媒介となる役目もあるので、サーバー上でDIIOPタスク上で作られたORBスタブとクライアントのORBスタブ同士で通信を行う訳ですが、DIIOPタスク上ではこのために、以下の二つのオブジェクトが存在する事になります。
1. 主にクライアント通信のために必要になるJavaオブジェクト
2. LSXBEのために必要になる C++ オブジェクト
1.と2.のオブジェクトは当然相関があるのですが、Garbage Collectionの対象になるのは1.だけなのでここで2.のC++ オブジェクトだけが浪費されてしまう事があります。(もちろんこれは一時的な浪費で、エージェントが終了すれば解放されるべきものです。)
これが、いわゆるNotes Javaクラス特有の recycle() が必要になる背景です。
この話も以下のTechnoteの4章に詳細が述べられています。LotusScriptではあまり意識する必要が無いのですが、Javaアプリケーションで大きなループをするときには必ずこの点について一度は考慮した方がよいと思います。たまにこういう問題に遭遇するとNotes のJVMはGCがちゃんと動かないような理由があるのではないか?と考えて、System.gc() を呼んでみようと考える人もいますが、これは予期しない結果を引き起こすのでしないようにして下さい。
Lotus Notes/Domino における Java 実行環境とその問題判別について (#729912)
コメント