我有一些Java代码,它使用Java Domino API(使用NCSO.jar)通过IIOP与Domino数据库连接。现在的一个新要求是,如果连接到的服务器是集群的,那么在当前连接到的服务器发生故障时,应该可以利用这一点并切换到集群中的故障转移服务器。
不幸的是,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);
对于IIOP操作,getDatabase
的第一个参数(服务器名)显然必须为空。当服务器名称已经在会话中时,我对如何在openWithFailover
方法中再次指定服务器名称感到相当困惑,但我认为您可以使用会话连接到集群,然后在open方法中指定主服务器。但是,为什么需要提供两次数据库名称并不十分清楚。最后一个参数声明,如果数据库不能被访问,就不应该被创建(省略它,默认为true;多么美妙)。
不幸的是,这吐痰的例外NotesException: This database object is already open as E:LotusDominodatamail-inEDITEST.nsf
在我的脸。它发生在openWithFailover
方法的线上。
所以很明显,第一次调用getDatabase
已经打开了它,并且没有close方法或选项只获得对象而不实际打开它。Database
类是一个接口,因此没有静态方法来获取这样的对象,也没有方法来实例化它。我检查了一下,我发现唯一的选择是在DbDirectory
类中使用openDatabase
。猜猜这是怎么回事。现在,该方法确实有一个布尔值替代,该布尔值表示您是否希望使用故障转移,但根据文档,对于IIOP操作,它总是为false。
根据这个页面,你可以通过调用getDatabase
和两个空参数来获得一个空的Database
对象。所以我试着这样做:
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代码中也可以做到。
谁来帮帮我,因为文档没有提供足够的信息。
API没有任何问题。很简单,Lotus Notes和Domino中的集群故障转移是为Domino的专有网络协议(NRPC)设计的。Notes客户机使用NRPC。这就是为什么它可以进行故障转移。使用Notes .jar而不是NCSO.jar的Java代码也可以做到这一点,因为它也使用NRPC——以及一些底层Notes客户机配置信息。
但是它不能与NCSO.jar一起工作,因为它使用的是IIOP。
原因如下:一般来说,标准协议不了解任何类型的集群。集群化这些标准协议的解决方案几乎都依赖于某种高可用性网络设备来将流量引导到集群中的各种服务器。但是,与标准协议的集群解决方案不同,Domino集群在网络上没有任何外部负载平衡器/故障转移设备的情况下工作。因此,如果Domino服务器在集群中,但它没有响应,Notes客户机如何知道故障转移到的另一台服务器的地址呢?没有交警设备可与之通信,而且它显然无法请求服务器,因为它没有响应。因此,它必须查看已经存储在本地的配置信息,以告诉它还有哪些具有目标数据库副本的服务器可用!该信息由Notes核心dll维护,这些dll是Notes客户机安装的一部分,因此必须安装Notes客户机才能使其正常工作。但是在使用NCSO.jar时,不假设存在本地Notes客户机。即使安装了Notes客户机,NCSO.jar也不知道。因此,基于iio的Notes Java API类无法知道在哪里查找Domino集群中可用服务器的任何信息。
有一个叫做Domino Internet Cluster Manager的东西可以用于Domino HTTP故障转移,但我认为它也不支持IIOP。但我不确定,所以你可能想调查一下。但是我认为,如果您想要IIOP故障转移,您可能必须在您的网络中添加第三方负载平衡/集群解决方案。不过,好消息是,您可能不需要任何特殊的api来利用它。或者,如果您的网络上没有支持IIOP的集群解决方案,并且无法添加这样的解决方案,那么您可以对代码进行编程,使其与多个服务器一起工作。编写代码时,不要只将一个服务器名/地址写入其中,而是要有多个服务器名/地址,并尝试按顺序打开数据库,直到成功为止。