3

Java Domino API (NCSO.jar を使用) を使用して、IIOP 経由で Domino データベースに接続する Java コードをいくつか入手しました。新しい要件は、接続先のサーバーがクラスター化されている場合、これを利用して、現在接続されているサーバーに障害が発生した場合にクラスター内のフェールオーバー サーバーに切り替えることができるようにすることです。

残念ながら、Domino Java API はまったく不可解であり、API をローカルで使用する場合と IIOP を介してリモートで使用する場合では微妙な違いがあり、本当に明確な説明はほとんどなく、メソッドに与える引数に応じた奇妙な違いがあります。

ここから何とか情報を収集できました... openWithFailoverMethod は機能しますか?

IBM インフォセンターのドキュメントも確認しました。

私が最初に試したのはこれでした:

Session session = NotesFactory.createSession(host + ":" + port, user, password);
Database db = session.getDatabase(null, databaseName, false);
db.openWithFailover(host, databaseName);

の最初の引数 (getDatabaseサーバー名) は、IIOP 操作では明らかに null でなければなりません。すでにセッションに入っているのに、メソッドでサーバー名を再度指定する必要があることにかなり戸惑いましたがopenWithFailover、セッションでクラスターに接続し、open メソッドでプライマリ サーバーを指定できると思います。ただし、データベース名を 2 回指定する必要がある理由は明確ではありませんでした。最後の引数は、データベースにアクセスできない場合はデータベースを作成しないことを示しています (それを省略すると、デフォルトで true になります。すばらしいことです)。

NotesException: This database object is already open as E:\Lotus\Domino\data\mail-in\EDITEST.nsf残念ながら、これは私の顔に例外を吐き出しました。メソッドのある行で発生しopenWithFailoverます。

どうやら最初の呼び出しでgetDatabase既に開いており、実際に開かずにオブジェクトを取得するだけの close メソッドやオプションはありません。クラスはインターフェースであるため、そのDatabaseようなオブジェクトを取得するための静的メソッドや、インスタンス化する方法はありません。私は周りをチェックしましたが、私が見つけた唯一の代替手段はopenDatabasein classを使用することですDbDirectory。それが何をするかを推測してください。現在、そのメソッドには、フェイルオーバーを使用するかどうかを示すブール値を持つ代替手段がありますが、ドキュメントによると、 IIOP 操作では常に false です。

このページによると、 null 引数を 2 つ指定Databaseして呼び出すと、空のオブジェクトを取得できます。getDatabaseだから私はこれを試しました:

Session session = NotesFactory.createSession(host + ":" + port, user, password);
Database db = session.getDatabase(null, null, false);
db.openWithFailOver(host, databaseName);

どのプロンプトが私に例外を与えますかNotesException: A database name must be provided。2 行目を に変更してDatabase db = session.getDatabase(null, null);も違いはありません。

リモート操作にはデータベース名が必須であるとしか思えませんか? しかし、リモート接続時にフェールオーバーを使用するにはどうすればよいでしょうか。それとも私はこれを間違ってやっていますか?サーバー自体ではなくクラスターに接続する必要があり、フェイルオーバーは自動的に処理されますか? それとも、リモート接続のフェイルオーバーは明らかに不可能ですか? ノーツ クライアントでできるので、独自の Java コードでもできると思います。

ドキュメントだけでは十分な情報が得られないため、誰か助けてください。

4

1 に答える 1

6

APIに問題はありません。Lotus Notes と Domino のクラスタ フェイルオーバーが、Domino 独自のネットワーク プロトコル (NRPC) 用に設計されているという単純なケースです。Notes クライアントは NRPC を使用します。そのため、フェイルオーバーを実行できます。NCSO.jar の代わりに notes.jar を使用する Java コードでもそれを実行できます。これは、NRPC も使用しているためです。

しかし、IIOP を使用しているため、NCSO.jar では機能しません。

これがその理由です。一般に、標準プロトコルは、どのタイプのクラスタリングについても何も知りません。これらの標準プロトコルをクラスタ化するためのソリューションは、ほぼすべて、ある種の高可用性ネットワーク デバイスに依存して、トラフィックをクラスタ内のさまざまなサーバーに転送します。ただし、標準プロトコルのクラスタリング ソリューションとは異なり、Domino クラスタリングは、ネットワーク上に外部ロード バランサ/フェイルオーバー デバイスがなくても動作します。では、Domino サーバーがクラスター内にあるのに応答しない場合、Notes クライアントはどのようにしてフェイルオーバー先の別のサーバーのアドレスを知るのでしょうか? 通信するトラフィック コップ デバイスはなく、サーバーが応答していないため、明らかにサーバーに問い合わせることができません。そのため、ローカルに既に保存されている構成情報を調べて、ターゲット データベースのレプリカを持つ他のサーバーが利用可能かどうかを判断する必要があります。この情報は、ノーツ クライアント インストールの一部であるノーツ コア DLL によって維持されるため、ノーツ クライアントが機能する可能性があるようにするには、ノーツ クライアントをインストールする必要があります。しかし、NCSO.jar を使用している場合、ローカルのノーツ クライアントが存在するという前提はありません。Notes クライアントがインストールされていても、NCSO.jar はそれを認識しません。そのため、IIOP ベースの Notes Java API クラスが、Domino クラスタで利用可能なサーバーに関する情報を検索する場所を知る方法はありません。そのため、動作する可能性があるようにするには、Notes クライアントをインストールする必要があります。しかし、NCSO.jar を使用している場合、ローカルのノーツ クライアントが存在するという前提はありません。Notes クライアントがインストールされていても、NCSO.jar はそれを認識しません。そのため、IIOP ベースの Notes Java API クラスが、Domino クラスタで利用可能なサーバーに関する情報を検索する場所を知る方法はありません。そのため、動作する可能性があるようにするには、Notes クライアントをインストールする必要があります。しかし、NCSO.jar を使用している場合、ローカルのノーツ クライアントが存在するという前提はありません。Notes クライアントがインストールされていても、NCSO.jar はそれを認識しません。そのため、IIOP ベースの Notes Java API クラスが、Domino クラスタで利用可能なサーバーに関する情報を検索する場所を知る方法はありません。

Domino HTTP フェイルオーバー用に動作する Domino Internet Cluster Manager というものがありますが、IIOP もサポートしていないと思います。とはいえ、よくわからないので、調べてみてはいかがでしょうか。しかし、IIOP フェイルオーバーが必要な場合は、おそらくサード パーティの負荷分散/クラスタリング ソリューションをネットワークに追加する必要があると思います。ただし、これを利用するために特別な API は必要ないでしょう。または、ネットワーク上に IIOP をサポートするクラスタリング ソリューションがなく、追加できない場合は、複数のサーバーで動作するようにコードをプログラムするだけです。1 つのサーバー名/アドレスだけをプログラムするのではなく、複数のサーバー名/アドレスをプログラムするようにコードを記述し、成功するまでそれらのデータベースを順番に開いてみてください。

于 2013-01-16T17:22:21.657 に答える