Каков предпочтительный способ разрыва соединения CycAPI Cyc?
В примере кода Cyc API на странице кода примера Cyc API System.exit() используется для завершения соединения Cyc. Обычно кажется, что он использует молоток, чтобы взломать яйцо. Есть ли более узко сфокусированный способ завершить поток, который поддерживает соединение Cyc, так что простое падение до конца main (например) приводит к завершению программы?
1 ответ
(Отказ от ответственности: я один из разработчиков Cyc APIs...)
Завершение соединений было более сложным, чем это требовалось в более ранних версиях Cyc Core API, но выпуск 1.0.0-rc4 добавляет некоторые функциональные возможности для решения этой проблемы.
SessionManager API Session предназначен для конечной ответственности за контроль над управлением пулом соединений. Соединения могут повторно использоваться между сеансами, и в большинстве случаев вам не нужно беспокоиться о непосредственном создании, кэшировании или закрытии соединений с серверами Cyc. Обоснование таково: лежащие в основе соединения CycAccess на самом деле довольно тяжелые (создание одного может занять 100 мс или более), поэтому вы не хотите прерывать их случайно, и вам, вероятно, не понадобится хлопот с непосредственным управлением ими, например многопоточные среды, такие как сервлеты.
Как правило, вам нужно только закрывать отдельные CycSessions, когда вы закончите с ними; 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
На самом деле избыточно (хотя и безвредно) вызывать SessionManager#close() перед CycSessionManager#reloadInstance(); reloadInstance гарантирует, что предыдущий SessionManager был закрыт перед его заменой. В любом случае, я бы не рекомендовал писать код, который сильно зависит от перезагрузки SessionManager (по причинам, описанным выше), но он есть, если вам это нужно.
Это суть этого. Дальнейшая документация здесь: http://dev.cyc.com/api/core/session/connection-management/