3

我有一些使用 Java Domino API(使用 NCSO.jar)通过 IIOP 与 Domino 数据库连接的 Java 代码。现在的一个新要求是,如果正在连接的服务器是集群的,那么应该可以利用这一点并在当前连接的服务器出现故障时切换到集群中的故障转移服务器。

不幸的是,Domino Java API 完全是晦涩难懂的,在本地和通过 IIOP 远程使用 API 之间存在细微差别,很少有真正清晰的解释和奇怪的差异,具体取决于您为方法提供的参数。

我设法从这里收集到的一些信息...... 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 方法中指定主服务器。但是,为什么您需要提供两次数据库名称并不十分清楚。最后一个参数表明如果无法访问数据库,则不应创建数据库(省略它,默认为 true;多么美妙)。

不幸的是,这在我脸上吐出了异常NotesException: This database object is already open as E:\Lotus\Domino\data\mail-in\EDITEST.nsf。它发生在openWithFailover方法上。

显然,第一次调用getDatabase已经打开它,并且没有关闭方法或仅获取对象而不实际打开它的选项。该类Database是一个接口,因此没有获取此类对象的静态方法或实例化它的方法。我检查了一下,发现唯一的选择是openDatabase在课堂上使用DbDirectory。猜猜这是做什么的。现在该方法确实有一个带有布尔值的替代方法,它表明您是否希望使用故障转移,但根据文档,对于 IIOP 操作它总是错误的。

根据this page ,您可以通过使用两个空参数调用来获取一个空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。将第二行更改为Database db = session.getDatabase(null, null);没有任何区别。

我只能假设远程操作必须使用数据库名称?但是,远程连接时如何使用故障转移呢?还是我做错了?也许我应该连接到集群而不是服务器本身,并且故障转移会自动处理?或者远程连接显然不可能进行故障转移?Notes 客户端可以做到这一点,所以我希望它可以在您自己的 Java 代码中实现。

有人请在这里帮助我,因为文档没有提供足够的信息。

4

1 回答 1

6

API 没有任何问题。Lotus Notes 和 Domino 中的集群故障转移就是为 Domino 的专有网络协议 (NRPC) 设计的。Notes 客户端使用 NRPC。这就是它可以进行故障转移的原因。使用 notes.jar 而不是 NCSO.jar 的 Java 代码也可以做到这一点,因为它还使用 NRPC —— 以及一些不为人知的 Notes 客户端配置信息。

但它不适用于 NCSO.jar,因为它使用的是 IIOP。

这就是为什么会这样。一般来说,标准协议对任何类型的集群一无所知。集群这些标准协议的解决方案几乎都依赖某种高可用性网络设备来将流量引导到集群中的各种服务器。但与标准协议的集群解决方案不同,Domino 集群在网络上无需任何外部负载平衡器/故障转移设备即可工作。因此,如果 Domino 服务器在集群中,但它没有响应,那么 Notes 客户端如何知道要故障转移到的另一台服务器的地址?没有可与之交谈的交通警察设备,它显然无法询问服务器,因为它没有响应。所以它必须查看已经存储在本地的配置信息,以告诉它还有哪些具有目标数据库副本的服务器可用!该信息由作为 Notes 客户端安装一部分的 Notes 核心 DLL 维护,因此您必须安装 Notes 客户端才能使其正常工作。但是当您使用 NCSO.jar 时,不会假设有本地 Notes 客户端。即使您确实安装了 Notes 客户端,NCSO.jar 也不知道它。因此,基于 IIOP 的 Notes Java API 类无法知道在哪里查找有关 Domino 集群中可用服务器的任何信息。因此,您必须安装 Notes 客户端才能使其正常工作。但是当您使用 NCSO.jar 时,不会假设有本地 Notes 客户端。即使您确实安装了 Notes 客户端,NCSO.jar 也不知道它。因此,基于 IIOP 的 Notes Java API 类无法知道在哪里查找有关 Domino 集群中可用服务器的任何信息。因此,您必须安装 Notes 客户端才能使其正常工作。但是当您使用 NCSO.jar 时,不会假设有本地 Notes 客户端。即使您确实安装了 Notes 客户端,NCSO.jar 也不知道它。因此,基于 IIOP 的 Notes Java API 类无法知道在哪里查找有关 Domino 集群中可用服务器的任何信息。

有一种叫做 Domino Internet Cluster Manager 的东西适用于 Domino HTTP 故障转移,但我认为它也不支持 IIOP。不过,我不确定,所以你可能想调查一下。但我认为,如果您想要 IIOP 故障转移,您可能必须向您的网络添加第 3 方负载平衡/集群解决方案。不过,好消息是您可能不需要任何特殊的 API 来利用它。或者,如果您的网络上没有支持 IIOP 的集群解决方案并且您无法添加一个,那么您可以只编写代码以与多个服务器一起使用。编写您的代码,而不是仅将一个服务器名称/地址编程到其中,而是有多个,并尝试按顺序打开您的数据库,直到您成功。

于 2013-01-16T17:22:21.657 回答