我们有一个REST层和后端作为Jackrabbit实现。我们使用TransientRepository和默认设置。 当两个请求(仅用于读取节点)同时被触发时,我们面临以下错误:
:RepositoryLock.acquire(134)::检测到现有锁定文件{tomcat} / .lock。存储库未正确关闭。 javax.jcr.RepositoryException:存储库home {tomcat}似乎正在使用中,因为名为.lock的文件已被当前进程锁定。
jackrabbit wiki页面:http://wiki.apache.org/jackrabbit/RepositoryLock提到当存储库已在同一进程中打开但在另一个类加载器中(例如,在另一个Web应用程序中)时,会发生这种情况。在这种情况下,您需要确保在Web应用程序停止时关闭存储库。
我们使用以下代码获取存储库并创建会话:
try {
Repository repository = new TransientRepository(REPO_CONFIG_FILE, REPO_HOME_DIR);
session = repository.login(new SimpleCredentials(REPOSITORY_USERNAME, REPOSITORY_PASSWORD.toCharArray()));
} finally {
if(session != null){
session.logout();
}
}
以上代码适用于Jackrabbit的每个操作,因此会话在每次操作后关闭。并且只有一个Web应用程序可以访问Jackrabbit存储库。
RepositoryLock页面上给出的解决方案建议使用Repository Server。这是唯一的解决方案,还是我在配置或编码时遗漏了什么?
答案 0 :(得分:1)
也许你应该使用方法
loggedOut(SessionImpl session) 从打开的会话集中删除给定的会话。 具体到这个存储库 或者在应用程序监听器中使用Repository Server并通过JNDI访问它,以便您可以干净地启动/停止它?