1

Lotus Notes Java 库仅在 32 位 JVM 中运行,我需要从我的 64 位 JVM 应用程序中调用它,所以我编写了一个 RMI 桥:64 位应用程序运行 32 位 RMI 服务器,并与32 位服务器进行 Lotus Notes 调用。

Lotus Notes 要求每个线程(将调用任何 Lotus Notes 函数)调用 lotus.domino.NotesThread.sinitThread();在调用任何其他 Lotus Notes 函数之前,并在最后通过调用 un-init 函数进行清理,这些调用可能很昂贵。

由于 RMI 不保证单线程执行,如何将所有请求通过管道传输到已为 Lotus Notes 初始化的单个线程?我也对其他 RPC/“桥”方法持开放态度(更喜欢使用 Java)。目前,我必须确保我定义的每个 RMI 函数调用都确保其线程已初始化。

4

2 回答 2

1

使用单线程执行器服务,每次要调用lotus notes方法时,向执行器提交一个任务,获取返回的Future,从Future中获取方法调用的结果。

例如,要调用方法Bar getFoo(),您将使用以下代码:

Callable<Bar> getFoo = new Callable<Bar>() {
    @Override
    public Bar call() {
        return lotuNotes.getFoo();
    }
};
Future<Bar> future = executor.submit(getFoo);
return future.get();
于 2012-12-18T19:46:34.080 回答
0

getName() 是一个简单的示例,因此每个代码都得到了这种处理(这极大地使代码膨胀,但它确实有效!)

    @Override
    public String getName() throws RemoteException, NotesException {
        java.util.concurrent.Callable<String> callableRoutine =
                new java.util.concurrent.Callable<String>() {

                    @Override
                    public String call() throws java.rmi.RemoteException, NotesException {
                        return lnView.getName();
                    }
                };
        try {
            return executor.submit(callableRoutine).get();
        } catch (Exception ex) {
            handleExceptions(ex);
            return null; // not used
        }
    }


/**
 * Handle exceptions from serializing to a thread.
 *
 * This routine always throws an exception, does not return normally.
 *
 * @param ex
 * @throws java.rmi.RemoteException
 * @throws NotesException
 */
private void handleExceptions(Throwable ex) throws java.rmi.RemoteException, NotesException {
    if (ex instanceof ExecutionException) {
        Throwable t = ex.getCause();
        if (t instanceof java.rmi.RemoteException) {
            throw (java.rmi.RemoteException) ex.getCause();
        } else if (t instanceof NotesException) {
            throw (NotesException) ex.getCause();
        } else {
            throw new NotesException(LnRemote.lnErrorRmi, utMisc.getExceptionMessageClean(t), t);
        }
    } else {
        throw new NotesException(LnRemote.lnErrorRmi, utMisc.getExceptionMessageClean(ex), ex);
    }
}
于 2012-12-18T23:10:17.627 回答