终止CycAPI Cyc连接的首选方法是什么?

时间:2015-05-28 12:24:12

标签: java artificial-intelligence opencyc

The Cyc API example code page的Cyc API示例代码中,System.exit()用于终止Cyc连接。一般来说,这似乎可能是使用木槌打破鸡蛋。是否有更狭隘的方式来终止维护Cyc连接的线程,以便简单地落到main(例如)的末尾导致程序终止?

1 个答案:

答案 0 :(得分:3)

(免责声明:我是Cyc API的开发人员之一......)

终止连接比在早期版本的Cyc Core API中所需要的更困难,但1.0.0-rc4版本增加了一些功能来解决这个问题。

Session API的SessionManager旨在最终负责监督连接池管理。连接可以跨会话重用,在大多数情况下,您不必担心直接创建,缓存或关闭与Cyc服务器的连接。理由是:底层的CycAccess连接实际上是相当重量级的(创建一个可能需要100ms或更长时间),所以你不想随便终止它们,你可能不想直接管理麻烦它们在例如像servlet这样的多线程环境中。

通常情况下,只需要在完成后关闭各个CycSession;一旦没有依赖它的资源,SessionManager将关闭底层连接。 CycSession接口扩展了java.io.Closeable,因此您可以执行以下操作:

try {
  // Some calls to KB API, Query API, etc...
} finally {
  CycSessionManager.getCurrentSession().close();
}

在Java 7及更高版本中,这意味着CycSessions实现了java.lang.AutoCloseable,因此您可以将它们包装在try-with-resources语句中:

try (CycSession session = CycSessionManager.getCurrentSession()) {
  // Some calls to KB API, Query API, etc...
}

// The session has been automatically closed. The next call will return a new session:
CycSession newSession = CycSessionManager.getCurrentSession();

也可以关闭 SessionManager ,强制它关闭所有连接。这在例如退出应用程序时很有用:

public static void main(String[] args) throws IOException {
  try (SessionManager sessionMgr = CycSessionManager.getInstance()) {
    // Some calls to KB API, Query API, etc...
  }
}

或者,您可以手动关闭它:

try {
  // Some calls to KB API, Query API, etc...
} finally {
  CycSessionManager.getInstance().close();
}

关闭SessionManager实例后,它就不能再用于创建或检索会话。但是,您可以指示CycSessionManager加载新的SessionManager实例:

CycSessionManager.getInstance().close();
CycSessionManager.getInstance().isClosed(); // true
CycSessionManager.reloadInstance();
CycSessionManager.getInstance().isClosed(); // false

在CycSessionManager #reloadInstance()之前调用SessionManager #close()实际上是多余的(虽然无害); reloadInstance确保在替换之前关闭了先前的SessionManager。无论如何,我通常不会建议编写严重依赖于重新加载SessionManager的代码(出于上述原因),但如果你需要它,那就在那里。

这是它的要点。此处还有其他文档:http://dev.cyc.com/api/core/session/connection-management/