有没有办法创建一个在整个应用程序生命周期内保持活动状态的持久 jcr 会话?背景是我想将此会话用于 JCR EventListener,它会更新我对任何传入事件的视图。因此,我认为该侦听器必须始终与会话连接。
问问题
195 次
1 回答
1
是的,您确实可以创建一个常规会话,使用它来注册您的事件侦听器,并在必要时使其保持活动状态。
实际上,事件侦听器只会在用于注册侦听器的会话仍然存在时才收到事件通知。当然,长期存在的会话可能会阻止存储库关闭,所以当您的应用程序或服务关闭时,请务必注销您的会话。
一种常见的最佳实践是让听众做尽可能少的工作。侦听器被异步调用(意味着存储库不会等到侦听器完成后才完成更改),这意味着这很可能在单独的线程上完成,如果需要很长时间才能完成,侦听器可能会导致资源问题。因此,如果工作不是微不足道的,请通过(例如)将工作提交到队列并单独处理队列来尽快离开线程。
另一个最佳实践是让听众不要使用用于注册它们的同一会话来读取或写入内容。JCR 会话不需要是线程安全的,并且大多数实现不实现并发。这意味着它们不能被多个线程安全地使用,即使这只需要读取内容。(某些实现确实保证 Sessions是线程安全的,但最好避免依赖该特征,除非您想要或需要锁定该实现。)
总之,如果监听器需要做任何工作,请离开调用线程并使用单独的 Session 来读取或更新内容。
于 2012-11-13T00:19:44.350 回答