OpenNTF Domino API 在服务器上无法正常工作
OpenNTF Domino API does not work properly on server
我有带有 ExtLib (9.0.1.v00_12_20150311-1316) 和 OpenNTF Domino API (2.0.0.201510032142) 运行 的 Domino 服务器 (9.0.1 FP2 HF384) 作为 OSGI插件。
我尝试一个简单的代码:
Database db = Factory.getSession().getCurrentDatabase();
System.out.println(db.getApiPath());
for (View view : db.getViews()) {
System.out.println(view.getName());
}
当第一次代码 运行s 时(在 HTTP 任务启动后)我得到一个错误堆栈(较低)和正确的结果:
HTTP JVM: java.security.PrivilegedActionException: NotesException: Cannot create a session from an agent
HTTP JVM: at java.security.AccessController.doPrivileged(AccessController.java:331)
HTTP JVM: at org.openntf.domino.utils.Factory$SetupJob.run(Factory.java:63)
HTTP JVM: at lotus.domino.NotesThread.run(Unknown Source)
HTTP JVM: Caused by:
HTTP JVM: NotesException: Cannot create a session from an agent
HTTP JVM: at lotus.domino.local.Session.checkSecurityManagerExtender(Unknown Source)
HTTP JVM: at lotus.domino.local.Session.createSession(Unknown Source)
HTTP JVM: at lotus.domino.NotesFactory.createSession(Unknown Source)
HTTP JVM: at org.openntf.domino.utils.Factory$SetupJob.run(Factory.java:66)
HTTP JVM: at java.security.AccessController.doPrivileged(AccessController.java:327)
HTTP JVM: ... 2 more
HTTP JVM: java.security.PrivilegedActionException: java.io.FileNotFoundException: C:\Lotus\Domino\null\IBM_TECHNICAL_SUPPORT\org.openntf.0.0.log.lck (The system cannot find the path specified.)
HTTP JVM: at java.security.AccessController.doPrivileged(AccessController.java:331)
HTTP JVM: at org.openntf.domino.utils.Factory$SetupJob.run(Factory.java:79)
HTTP JVM: at lotus.domino.NotesThread.run(Unknown Source)
HTTP JVM: Caused by:
HTTP JVM: java.io.FileNotFoundException: C:\Lotus\Domino\null\IBM_TECHNICAL_SUPPORT\org.openntf.0.0.log.lck (The system cannot find the path specified.)
HTTP JVM: at java.io.FileOutputStream.<init>(FileOutputStream.java:204)
HTTP JVM: at java.io.FileOutputStream.<init>(FileOutputStream.java:94)
HTTP JVM: at java.util.logging.FileHandler.initOutputFiles(FileHandler.java:225)
HTTP JVM: at java.util.logging.FileHandler.init(FileHandler.java:195)
HTTP JVM: at java.util.logging.FileHandler.<init>(FileHandler.java:517)
HTTP JVM: at org.openntf.domino.logging.DefaultFileHandler.<init>(DefaultFileHandler.java:98)
HTTP JVM: at org.openntf.domino.utils.Factory$SetupJob.run(Factory.java:86)
HTTP JVM: at java.security.AccessController.doPrivileged(AccessController.java:327)
但是,当我运行这段代码再次上线时
for (View view : db.getViews()) {
我得到:
[ODA::WARNING] null
[ODA::WARNING] (source:org.openntf.domino.utils.DominoUtils.run - See IBM_TECHNICAL_SUPPORT\org.openntf.log.X.Y.txt for full stack trace.)
[ODA::WARNING] null
[ODA::WARNING] (source:org.openntf.domino.utils.DominoUtils.run - See IBM_TECHNICAL_SUPPORT\org.openntf.log.X.Y.txt for full stack trace.)
HTTP JVM: javax.faces.el.EvaluationException: java.lang.NullPointerException
HTTP JVM: at com.sun.faces.el.MethodBindingImpl.invoke(MethodBindingImpl.java:142)
HTTP JVM: at com.ibm.xsp.component.UIViewRootEx.initAfterContents(UIViewRootEx.java:1690)
HTTP JVM: at com.ibm.xsp.page.compiled.AbstractCompiledPage.initComponent(AbstractCompiledPage.java:335)
HTTP JVM: at com.ibm.xsp.page.compiled.AbstractCompiledPage.createTree(AbstractCompiledPage.java:256)
HTTP JVM: at com.ibm.xsp.page.compiled.AbstractCompiledPage.createViewRoot(AbstractCompiledPage.java:167)
HTTP JVM: at com.ibm.xsp.application.ViewHandlerExImpl._createViewRoot(ViewHandlerExImpl.java:521)
HTTP JVM: at com.ibm.xsp.application.ViewHandlerExImpl.createViewRoot(ViewHandlerExImpl.java:567)
HTTP JVM: at com.ibm.xsp.application.ViewHandlerExImpl.doCreateView(ViewHandlerExImpl.java:142)
HTTP JVM: at com.ibm.xsp.application.ViewHandlerEx.createView(ViewHandlerEx.java:90)
HTTP JVM: at frostillicus.controller.ControllingViewHandler.createView(ControllingViewHandler.java:70)
HTTP JVM: at com.ibm.xsp.webapp.FacesServlet.serviceView(FacesServlet.java:251)
HTTP JVM: at com.ibm.xsp.webapp.FacesServletEx.serviceView(FacesServletEx.java:157)
HTTP JVM: at com.ibm.xsp.webapp.FacesServlet.service(FacesServlet.java:160)
HTTP JVM: at com.ibm.xsp.webapp.FacesServletEx.service(FacesServletEx.java:138)
HTTP JVM: at com.ibm.xsp.webapp.DesignerFacesServlet.service(DesignerFacesServlet.java:103)
HTTP JVM: at com.ibm.designer.runtime.domino.adapter.ComponentModule.invokeServlet(ComponentModule.java:576)
HTTP JVM: at com.ibm.domino.xsp.module.nsf.NSFComponentModule.invokeServlet(NSFComponentModule.java:1335)
HTTP JVM: at com.ibm.designer.runtime.domino.adapter.ComponentModule$AdapterInvoker.invokeServlet(ComponentModule.java:853)
HTTP JVM: at com.ibm.designer.runtime.domino.adapter.ComponentModule$ServletInvoker.doService(ComponentModule.java:796)
HTTP JVM: at com.ibm.designer.runtime.domino.adapter.ComponentModule.doService(ComponentModule.java:565)
HTTP JVM: at com.ibm.domino.xsp.module.nsf.NSFComponentModule.doService(NSFComponentModule.java:1319)
HTTP JVM: at com.ibm.domino.xsp.module.nsf.NSFService.doServiceInternal(NSFService.java:662)
HTTP JVM: at com.ibm.domino.xsp.module.nsf.NSFService.doService(NSFService.java:482)
HTTP JVM: at com.ibm.designer.runtime.domino.adapter.LCDEnvironment.doService(LCDEnvironment.java:357)
HTTP JVM: at com.ibm.designer.runtime.domino.adapter.LCDEnvironment.service(LCDEnvironment.java:313)
HTTP JVM: at com.ibm.domino.xsp.bridge.http.engine.XspCmdManager.service(XspCmdManager.java:272)
HTTP JVM: Caused by:
HTTP JVM: java.lang.NullPointerException
这就是 org.openntf.x.y.txt 中的内容:
lotus.domino.local.NotesBase.CheckObject - null
NotesException: Object has been removed or recycled
at lotus.domino.local.NotesBase.CheckObject(Unknown Source)
at lotus.domino.local.Session.getDatabase(Unknown Source)
at org.openntf.domino.impl.Database.resurrect(Database.java:2648)
at org.openntf.domino.impl.Database.getDelegate(Database.java:2638)
at org.openntf.domino.impl.Database.getViews(Database.java:1642)
怎么了?我有另一个(类似 Domino 服务器、版本和插件),其中一切 运行 都完美无缺!
已更新
在 HTTP 任务开始时,我得到:
[ODA] Starting the OpenNTF Domino API... Using notes.ini: C:\Lotus\Domino\notes.ini
[ODA] OpenNTF API Version 2.0.0.201510032142 started
HTTP JVM: Logging.logCfgFilePrecheck: File 'E:\Lotus\Domino\data/IBM_TECHNICAL_SUPPORT/org.openntf.domino.logging.logconfig.properties' not found
HTTP JVM: Logging: Couldn't initialize from PropertyFile; activating fallback ...
[ODA] !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
[ODA] Operation of BackendBridge.getViewEntryByKeyWithOptions FAILED
[ODA] Please read the comments in org.openntf.domino.xsp.ODAPlatform
[ODA] !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
[ODA::Xots] Starting XPages OSGi Tasklet Service with 10 core threads.
[ODA::XOTS] Registering tasklet org.openntf.domino.xsp.xots.XotsNsfScanner@4c904c9
XSP Command Manager initialized
HTTP Server: Restarted
要获取会话,我建议使用隐式变量。如果你有:
org.openntf.domino.xsp=godmode
您从 XPages 中熟悉的隐式变量 session
和 database
被覆盖,因此它们是 ODA 当前会话和数据库。如果您不使用 godmode,我们会添加变量 opensession
和 opendatabase
。类似的命名约定用于 sessionAsSigner 和 sessionAsSignerFullAccess。然后,您可以像往常一样使用 ExtLibUtil.resolveVariable()
来获取隐式变量。
查看日志消息,它似乎没有找到正确安装 Domino 的路径 - java.io.FileNotFoundException: C:\Lotus\Domino\null\IBM_TECHNICAL_SUPPORT\org.openntf.0.0.log.lck
。这很可能与原因有关。我怀疑当 HTTP 启动时,它会向控制台写入一个错误,说它找不到配置,所以没有启动 ODA Factory。
关键方法是Factory.getConfigFileFallback。在下面的代码中,它在启动工厂时使用系统变量来识别 notes.ini 路径。如果找不到 notes.ini,它将无法成功启动 Factory,因此 session
和 database
将不可用。
private static File getConfigFileFallback() {
String progpath = System.getProperty("notes.binary");
File iniFile = new File(progpath + System.getProperty("file.separator") + "notes.ini");
if (!iniFile.exists()) {
// System.out.println("Inifile not found on notes.binary path: " + progpath);
progpath = System.getProperty("user.dir");
iniFile = new File(progpath + System.getProperty("file.separator") + "notes.ini");
}
if (!iniFile.exists()) {
// System.out.println("Inifile not found on notes.binary path: " + progpath);
progpath = System.getProperty("java.home");
if (progpath.endsWith("jvm")) {
iniFile = new File(progpath + System.getProperty("file.separator") + ".." + System.getProperty("file.separator")
+ "notes.ini");
} else {
iniFile = new File(progpath + System.getProperty("file.separator") + "notes.ini");
}
}
if (!iniFile.exists()) {
progpath = System.getProperty("java.library.path"); // Otherwise the tests will not work
iniFile = new File(progpath + System.getProperty("file.separator") + "notes.ini");
}
if (!iniFile.exists()) {
// System.out.println("Inifile still not found on user.dir path: " + progpath);
if (progpath.contains("framework")) {
String pp2 = progpath.replace("framework", "");
iniFile = new File(pp2 + "notes.ini");
// System.out.println("Attempting to use path: " + pp2);
if (!iniFile.exists()) {
Factory.println("WARNING: Unable to read environment for log setup. Please look at the following properties...");
for (Object rawName : System.getProperties().keySet()) {
if (rawName instanceof String) {
Factory.println((String) rawName + " = " + System.getProperty((String) rawName));
}
}
}
}
}
return iniFile;
}
请确认 notes.binary 系统 属性 指向 notes.ini 的正确位置并且对其中数据文件夹的引用是正确的。
你在哪里添加代码?到 XPage?不是在代理中,是吗...?据我所知,它不会通过代理工作...
我大量使用来自托管 bean 的 ODA - 我没有发现这些问题。
您可以忽略加载 http 任务时收到的警告。这些消息不应该写入控制台,并且在版本发布时被错误地留在了那里(据我所知 - 但 Paul Withers 会知道更多细节)。
/约翰
所以其实我也不知道是什么原因造成的。可能是一些服务器补丁和修复程序安装在另一个服务器上,但解决问题的方法是重新安装干净的服务器。服务器文档和其他设置保持不变。
我有带有 ExtLib (9.0.1.v00_12_20150311-1316) 和 OpenNTF Domino API (2.0.0.201510032142) 运行 的 Domino 服务器 (9.0.1 FP2 HF384) 作为 OSGI插件。 我尝试一个简单的代码:
Database db = Factory.getSession().getCurrentDatabase();
System.out.println(db.getApiPath());
for (View view : db.getViews()) {
System.out.println(view.getName());
}
当第一次代码 运行s 时(在 HTTP 任务启动后)我得到一个错误堆栈(较低)和正确的结果:
HTTP JVM: java.security.PrivilegedActionException: NotesException: Cannot create a session from an agent
HTTP JVM: at java.security.AccessController.doPrivileged(AccessController.java:331)
HTTP JVM: at org.openntf.domino.utils.Factory$SetupJob.run(Factory.java:63)
HTTP JVM: at lotus.domino.NotesThread.run(Unknown Source)
HTTP JVM: Caused by:
HTTP JVM: NotesException: Cannot create a session from an agent
HTTP JVM: at lotus.domino.local.Session.checkSecurityManagerExtender(Unknown Source)
HTTP JVM: at lotus.domino.local.Session.createSession(Unknown Source)
HTTP JVM: at lotus.domino.NotesFactory.createSession(Unknown Source)
HTTP JVM: at org.openntf.domino.utils.Factory$SetupJob.run(Factory.java:66)
HTTP JVM: at java.security.AccessController.doPrivileged(AccessController.java:327)
HTTP JVM: ... 2 more
HTTP JVM: java.security.PrivilegedActionException: java.io.FileNotFoundException: C:\Lotus\Domino\null\IBM_TECHNICAL_SUPPORT\org.openntf.0.0.log.lck (The system cannot find the path specified.)
HTTP JVM: at java.security.AccessController.doPrivileged(AccessController.java:331)
HTTP JVM: at org.openntf.domino.utils.Factory$SetupJob.run(Factory.java:79)
HTTP JVM: at lotus.domino.NotesThread.run(Unknown Source)
HTTP JVM: Caused by:
HTTP JVM: java.io.FileNotFoundException: C:\Lotus\Domino\null\IBM_TECHNICAL_SUPPORT\org.openntf.0.0.log.lck (The system cannot find the path specified.)
HTTP JVM: at java.io.FileOutputStream.<init>(FileOutputStream.java:204)
HTTP JVM: at java.io.FileOutputStream.<init>(FileOutputStream.java:94)
HTTP JVM: at java.util.logging.FileHandler.initOutputFiles(FileHandler.java:225)
HTTP JVM: at java.util.logging.FileHandler.init(FileHandler.java:195)
HTTP JVM: at java.util.logging.FileHandler.<init>(FileHandler.java:517)
HTTP JVM: at org.openntf.domino.logging.DefaultFileHandler.<init>(DefaultFileHandler.java:98)
HTTP JVM: at org.openntf.domino.utils.Factory$SetupJob.run(Factory.java:86)
HTTP JVM: at java.security.AccessController.doPrivileged(AccessController.java:327)
但是,当我运行这段代码再次上线时
for (View view : db.getViews()) {
我得到:
[ODA::WARNING] null
[ODA::WARNING] (source:org.openntf.domino.utils.DominoUtils.run - See IBM_TECHNICAL_SUPPORT\org.openntf.log.X.Y.txt for full stack trace.)
[ODA::WARNING] null
[ODA::WARNING] (source:org.openntf.domino.utils.DominoUtils.run - See IBM_TECHNICAL_SUPPORT\org.openntf.log.X.Y.txt for full stack trace.)
HTTP JVM: javax.faces.el.EvaluationException: java.lang.NullPointerException
HTTP JVM: at com.sun.faces.el.MethodBindingImpl.invoke(MethodBindingImpl.java:142)
HTTP JVM: at com.ibm.xsp.component.UIViewRootEx.initAfterContents(UIViewRootEx.java:1690)
HTTP JVM: at com.ibm.xsp.page.compiled.AbstractCompiledPage.initComponent(AbstractCompiledPage.java:335)
HTTP JVM: at com.ibm.xsp.page.compiled.AbstractCompiledPage.createTree(AbstractCompiledPage.java:256)
HTTP JVM: at com.ibm.xsp.page.compiled.AbstractCompiledPage.createViewRoot(AbstractCompiledPage.java:167)
HTTP JVM: at com.ibm.xsp.application.ViewHandlerExImpl._createViewRoot(ViewHandlerExImpl.java:521)
HTTP JVM: at com.ibm.xsp.application.ViewHandlerExImpl.createViewRoot(ViewHandlerExImpl.java:567)
HTTP JVM: at com.ibm.xsp.application.ViewHandlerExImpl.doCreateView(ViewHandlerExImpl.java:142)
HTTP JVM: at com.ibm.xsp.application.ViewHandlerEx.createView(ViewHandlerEx.java:90)
HTTP JVM: at frostillicus.controller.ControllingViewHandler.createView(ControllingViewHandler.java:70)
HTTP JVM: at com.ibm.xsp.webapp.FacesServlet.serviceView(FacesServlet.java:251)
HTTP JVM: at com.ibm.xsp.webapp.FacesServletEx.serviceView(FacesServletEx.java:157)
HTTP JVM: at com.ibm.xsp.webapp.FacesServlet.service(FacesServlet.java:160)
HTTP JVM: at com.ibm.xsp.webapp.FacesServletEx.service(FacesServletEx.java:138)
HTTP JVM: at com.ibm.xsp.webapp.DesignerFacesServlet.service(DesignerFacesServlet.java:103)
HTTP JVM: at com.ibm.designer.runtime.domino.adapter.ComponentModule.invokeServlet(ComponentModule.java:576)
HTTP JVM: at com.ibm.domino.xsp.module.nsf.NSFComponentModule.invokeServlet(NSFComponentModule.java:1335)
HTTP JVM: at com.ibm.designer.runtime.domino.adapter.ComponentModule$AdapterInvoker.invokeServlet(ComponentModule.java:853)
HTTP JVM: at com.ibm.designer.runtime.domino.adapter.ComponentModule$ServletInvoker.doService(ComponentModule.java:796)
HTTP JVM: at com.ibm.designer.runtime.domino.adapter.ComponentModule.doService(ComponentModule.java:565)
HTTP JVM: at com.ibm.domino.xsp.module.nsf.NSFComponentModule.doService(NSFComponentModule.java:1319)
HTTP JVM: at com.ibm.domino.xsp.module.nsf.NSFService.doServiceInternal(NSFService.java:662)
HTTP JVM: at com.ibm.domino.xsp.module.nsf.NSFService.doService(NSFService.java:482)
HTTP JVM: at com.ibm.designer.runtime.domino.adapter.LCDEnvironment.doService(LCDEnvironment.java:357)
HTTP JVM: at com.ibm.designer.runtime.domino.adapter.LCDEnvironment.service(LCDEnvironment.java:313)
HTTP JVM: at com.ibm.domino.xsp.bridge.http.engine.XspCmdManager.service(XspCmdManager.java:272)
HTTP JVM: Caused by:
HTTP JVM: java.lang.NullPointerException
这就是 org.openntf.x.y.txt 中的内容:
lotus.domino.local.NotesBase.CheckObject - null
NotesException: Object has been removed or recycled
at lotus.domino.local.NotesBase.CheckObject(Unknown Source)
at lotus.domino.local.Session.getDatabase(Unknown Source)
at org.openntf.domino.impl.Database.resurrect(Database.java:2648)
at org.openntf.domino.impl.Database.getDelegate(Database.java:2638)
at org.openntf.domino.impl.Database.getViews(Database.java:1642)
怎么了?我有另一个(类似 Domino 服务器、版本和插件),其中一切 运行 都完美无缺!
已更新 在 HTTP 任务开始时,我得到:
[ODA] Starting the OpenNTF Domino API... Using notes.ini: C:\Lotus\Domino\notes.ini
[ODA] OpenNTF API Version 2.0.0.201510032142 started
HTTP JVM: Logging.logCfgFilePrecheck: File 'E:\Lotus\Domino\data/IBM_TECHNICAL_SUPPORT/org.openntf.domino.logging.logconfig.properties' not found
HTTP JVM: Logging: Couldn't initialize from PropertyFile; activating fallback ...
[ODA] !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
[ODA] Operation of BackendBridge.getViewEntryByKeyWithOptions FAILED
[ODA] Please read the comments in org.openntf.domino.xsp.ODAPlatform
[ODA] !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
[ODA::Xots] Starting XPages OSGi Tasklet Service with 10 core threads.
[ODA::XOTS] Registering tasklet org.openntf.domino.xsp.xots.XotsNsfScanner@4c904c9
XSP Command Manager initialized
HTTP Server: Restarted
要获取会话,我建议使用隐式变量。如果你有:
org.openntf.domino.xsp=godmode
您从 XPages 中熟悉的隐式变量 session
和 database
被覆盖,因此它们是 ODA 当前会话和数据库。如果您不使用 godmode,我们会添加变量 opensession
和 opendatabase
。类似的命名约定用于 sessionAsSigner 和 sessionAsSignerFullAccess。然后,您可以像往常一样使用 ExtLibUtil.resolveVariable()
来获取隐式变量。
查看日志消息,它似乎没有找到正确安装 Domino 的路径 - java.io.FileNotFoundException: C:\Lotus\Domino\null\IBM_TECHNICAL_SUPPORT\org.openntf.0.0.log.lck
。这很可能与原因有关。我怀疑当 HTTP 启动时,它会向控制台写入一个错误,说它找不到配置,所以没有启动 ODA Factory。
关键方法是Factory.getConfigFileFallback。在下面的代码中,它在启动工厂时使用系统变量来识别 notes.ini 路径。如果找不到 notes.ini,它将无法成功启动 Factory,因此 session
和 database
将不可用。
private static File getConfigFileFallback() {
String progpath = System.getProperty("notes.binary");
File iniFile = new File(progpath + System.getProperty("file.separator") + "notes.ini");
if (!iniFile.exists()) {
// System.out.println("Inifile not found on notes.binary path: " + progpath);
progpath = System.getProperty("user.dir");
iniFile = new File(progpath + System.getProperty("file.separator") + "notes.ini");
}
if (!iniFile.exists()) {
// System.out.println("Inifile not found on notes.binary path: " + progpath);
progpath = System.getProperty("java.home");
if (progpath.endsWith("jvm")) {
iniFile = new File(progpath + System.getProperty("file.separator") + ".." + System.getProperty("file.separator")
+ "notes.ini");
} else {
iniFile = new File(progpath + System.getProperty("file.separator") + "notes.ini");
}
}
if (!iniFile.exists()) {
progpath = System.getProperty("java.library.path"); // Otherwise the tests will not work
iniFile = new File(progpath + System.getProperty("file.separator") + "notes.ini");
}
if (!iniFile.exists()) {
// System.out.println("Inifile still not found on user.dir path: " + progpath);
if (progpath.contains("framework")) {
String pp2 = progpath.replace("framework", "");
iniFile = new File(pp2 + "notes.ini");
// System.out.println("Attempting to use path: " + pp2);
if (!iniFile.exists()) {
Factory.println("WARNING: Unable to read environment for log setup. Please look at the following properties...");
for (Object rawName : System.getProperties().keySet()) {
if (rawName instanceof String) {
Factory.println((String) rawName + " = " + System.getProperty((String) rawName));
}
}
}
}
}
return iniFile;
}
请确认 notes.binary 系统 属性 指向 notes.ini 的正确位置并且对其中数据文件夹的引用是正确的。
你在哪里添加代码?到 XPage?不是在代理中,是吗...?据我所知,它不会通过代理工作...
我大量使用来自托管 bean 的 ODA - 我没有发现这些问题。
您可以忽略加载 http 任务时收到的警告。这些消息不应该写入控制台,并且在版本发布时被错误地留在了那里(据我所知 - 但 Paul Withers 会知道更多细节)。
/约翰
所以其实我也不知道是什么原因造成的。可能是一些服务器补丁和修复程序安装在另一个服务器上,但解决问题的方法是重新安装干净的服务器。服务器文档和其他设置保持不变。