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
ようなオブジェクトを取得するための静的メソッドや、インスタンス化する方法はありません。私は周りをチェックしましたが、私が見つけた唯一の代替手段はopenDatabase
in 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 コードでもできると思います。
ドキュメントだけでは十分な情報が得られないため、誰か助けてください。