如何在Lotus Domino数据库上使用openWithFailover()?

G_H*_*G_H 3 java lotus-notes iiop lotus-domino

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

不幸的是,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);
Run Code Online (Sandbox Code Playgroud)

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操作,它总是错误的.

根据此页面,您可以Database通过getDatabase使用两个空参数调用来获取空对象.所以我尝试了这个:

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

哪个提示让我例外NotesException: A database name must be provided.改变第二行Database db = session.getDatabase(null, null);是没有区别的.

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

有人请帮帮我,因为文档没有提供足够的信息.

Ric*_*rtz 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集群中可用服务器的任何信息.

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