在Cyc API示例代码页面的Cyc API示例代码中,使用了System.exit()来终止Cyc连接。一般来说,这似乎是用大锤子来敲碎一个鸡蛋。是否有更有针对性的方法来终止维护Cyc连接的线程,以便简单地执行到main方法的末尾(例如)就能使程序终止?
回答:
(免责声明:我是Cyc APIs的开发者之一…)
在早期版本的Cyc Core APIs中,终止连接比实际需要的要困难,但1.0.0-rc4版本发布了一些功能来解决这个问题。
Session API的SessionManager最终负责监督连接池管理。连接可以在多个会话中重用,在大多数情况下,您不需要直接创建、缓存或关闭到Cyc服务器的连接。其理由是:底层的CycAccess连接实际上相当重量级(创建一个可能需要100毫秒或更长时间),所以您不想随意终止它们,并且您可能不想在例如多线程环境(如servlet)中直接管理它们。
通常,当您完成使用时,只需关闭单个CycSession;一旦没有资源依赖于它,SessionManager将关闭底层连接。CycSession接口扩展了java.io.Closeable,因此您可以执行以下操作:
try { // 对KB API、Query API等的一些调用...} finally { CycSessionManager.getCurrentSession().close();}
在Java 7及更高版本中,这意味着CycSessions实现了java.lang.AutoCloseable,因此您可以将它们包装在try-with-resources语句中:
try (CycSession session = CycSessionManager.getCurrentSession()) { // 对KB API、Query API等的一些调用...}// 会话已自动关闭。下一次调用将返回一个新会话:CycSession newSession = CycSessionManager.getCurrentSession();
还可以关闭SessionManager,强制它关闭所有连接。这在例如退出应用程序时很有用:
public static void main(String[] args) throws IOException { try (SessionManager sessionMgr = CycSessionManager.getInstance()) { // 对KB API、Query API等的一些调用... }}
或者,您可以手动关闭它:
try { // 对KB API、Query API等的一些调用...} finally { CycSessionManager.getInstance().close();}
一旦SessionManager实例被关闭,就不能再用来创建或检索会话。然而,您可以指示CycSessionManager加载一个新的SessionManager实例:
CycSessionManager.getInstance().close();CycSessionManager.getInstance().isClosed(); // trueCycSessionManager.reloadInstance();CycSessionManager.getInstance().isClosed(); // false
实际上,在调用CycSessionManager#reloadInstance()之前调用SessionManager#close()是多余的(尽管无害);reloadInstance确保在替换之前关闭了之前的SessionManager。无论如何,我通常不建议编写严重依赖于重新加载SessionManager的代码(出于上述原因),但如果需要,它就在那里。
这就是它的要点。这里有进一步的文档:http://dev.cyc.com/api/core/session/connection-management/