Jakarta ee 创建持久的jcr会话

Jakarta ee 创建持久的jcr会话,jakarta-ee,jackrabbit,jcr,content-repository,Jakarta Ee,Jackrabbit,Jcr,Content Repository,有没有办法创建在整个应用程序生命周期中保持活动的持久jcr会话?背景是,我想将此会话用于JCR EventListener,它会更新我对任何传入事件的视图。因此,我认为此侦听器必须始终与会话连接。是的,您确实可以创建一个常规会话,使用它注册事件侦听器,并在必要时保持其活动状态 事实上,事件监听器只会在用于注册监听器的会话仍处于活动状态时收到事件通知。当然,长时间的会话可能会阻止存储库关闭,因此在应用程序或服务关闭时,请始终注销会话 一个常见的最佳实践是让听者尽可能少做工作。侦听器是异步调用的(这

有没有办法创建在整个应用程序生命周期中保持活动的持久jcr会话?背景是,我想将此会话用于JCR EventListener,它会更新我对任何传入事件的视图。因此,我认为此侦听器必须始终与会话连接。

是的,您确实可以创建一个常规会话,使用它注册事件侦听器,并在必要时保持其活动状态

事实上,事件监听器只会在用于注册监听器的会话仍处于活动状态时收到事件通知。当然,长时间的会话可能会阻止存储库关闭,因此在应用程序或服务关闭时,请始终注销会话

一个常见的最佳实践是让听者尽可能少做工作。侦听器是异步调用的(这意味着存储库不会等到侦听器完成更改后才完成),这意味着这可能是在单独的线程上完成的,如果侦听器需要很长时间才能完成,则可能会导致资源问题。因此,如果工作不是琐碎的,那么通过(例如)将工作提交到队列并单独处理队列,尽快脱离线程

另一个最佳实践是,侦听器不要使用用于注册内容的同一会话来读取或写入内容。JCR会话不需要是线程安全的,大多数实现都是这样。这意味着它们不能被多个线程安全地使用,即使这只需要读取内容。(有些实现确实保证了会话的安全性,但最好避免依赖该特性,除非您希望或需要锁定到该实现中。)

总之,如果侦听器需要执行任何工作,请退出调用线程并使用单独的会话来读取或更新内容