我应该怎么做才能通过导入语句从DominoDesigner中的外部jar获取类



我使用Domino服务器并开发java代理。通常我会将外部jar文件放入脚本库,但会定期获取OutOfMemory。我将jar从脚本库提取到jvm/lib/ext。我可以通过ClassLoader获取类,但不能通过import语句获取。我应该怎么做才能通过import语句使其工作?

  1. 关闭Lotus Notes客户端和Designer
  2. 将JAR放置到本地jvm/lib/ext
  3. 打开Lotus Notes客户端和设计器

现在您可以导入类了。

您实际上可以显式地将jar添加到Java代理中。请注意,Java Agent默认情况下没有包名称,在import语句中引用包时需要引用正确的包名称。这里描述了将jar导入代理,对于8.5版本,这里和这里介绍了

此外,我怀疑您没有明确地清理您的java对象。JVM和Domino内存堆之间的连接是"弱"的。因此,为了保持服务器的内存清洁,您必须对Domino对象进行自己的垃圾收集。对我来说,这仍然是一个黑魔法,但我的理解是,即使代理应该"包含"会话,然后在终止时释放内存,但没有正确回收的Domino对象可能会耗尽Domino的堆内存。以下是我保持记忆清洁的简单提示:

1/将会话对象保存在包装器对象中。创建一个包含Domino会话对象的类(我称之为SessionWrapper)。然后只在NotesMain方法中声明SessionWrapper对象,不要在类级别声明它。这个SessionWrapper类需要有自己的调用Session.recycle()的回收方法,并且您需要在NotesMain结束时调用它。第2点对此进行了解释。如果您没有在NotesMain中调用任何其他方法,那么您实际上并不需要这个包装器。请参阅关于回收会话的第4点。

2/将SessionWrapper传递给所有需要Domino访问的方法。基本上,您将会话作为参数在这个包装类中传递。这是因为我们不想在类级别声明会话对象。这并不理想,但它可以防止由于将会话类保持在类级别而导致的内存泄漏。

3/强制回收。这对我来说从来没有多大意义,直到我看到这个例子循环

ViewEntryCollection vec = view.getAllEntries();
ViewEntry ve = vec.getFirstEntry();
While (ve!=null) {
 ViewEntry veNext = vec.getNextEntry(ve);
 // do stuff
 ve.recycle;
 ve = null;
 ve = veNext;
}

查看"ve"对象是如何被回收的,veNext是如何获得下一个对象的。基本上,一旦处理完每个对象,就需要回收它,"getNext"方法实际上不会回收Domino堆内存中的对象,如果不回收,它就会成为孤立对象,Domino也不会清理它,服务器最终会耗尽Domino对象的内存。请注意,我不是在回收veNext。我不需要,因为我分配了ve=>veNext。"ve"将有一个指向相同Domino对象的链接,我在循环结束时调用recycle ve。从中可以看出,许多java对象可以在后端指向同一个Domino实例对象。如果我试图在ve.recycle之后调用veNext.recycle,我会得到一个"Object has been removed or recycle"错误。

4/NotesMain结束时的Recylce会话。请确保在NotesMain的末尾调用SessionWrapper.recycle(),以确保将该内存释放回服务器。

5/确保为服务器上的JVM提供足够的内存。看看这位技术专家。还要注意"HTTPJVMMaxHeapSizeSet=1",这是一个奇怪的设置,可以确保内存设置"保持不变"。。点击此处了解更多信息。

多年来,IBM一直没有提供消除开发人员开销所急需的对象内部清理任务。然后,您需要显式释放内存,这也会影响性能,但这是稳定性的必要折衷。这些要点并非详尽无遗,但我发现,当遵守这些规则时,代理和servlet的稳定性大大提高。

最新更新