有没有一种方法可以创建一个在整个应用程序生命周期中保持活动状态的持久jcr会话?背景是我想将这个会话用于一个JCR EventListener,它更新我对任何传入事件的视图。因此,我认为这个监听器必须始终与会话连接。
发布于 2012-11-13 08:19:44
是的,您确实可以创建一个常规会话,使用它来注册您的事件侦听器,并在必要的时间内保持它的活动状态。
实际上,只有在用于注册侦听器的会话仍处于活动状态时,事件侦听器才会收到事件通知。当然,长时间的会话可能会阻止存储库关闭,因此当应用程序或服务关闭时,请始终注销会话。
一种常见的最佳实践是让侦听器做尽可能少的工作。监听程序是异步调用的(这意味着在监听程序完成之前,存储库不会等待完成更改),这意味着这可能是在单独的线程上完成的,如果需要很长时间才能完成,则监听程序可能会导致资源问题。因此,如果工作不是微不足道的,那么通过(例如)将工作提交到队列并单独处理队列来尽可能快地离开线程。
另一种最佳实践是侦听器不使用用于注册它们的同一会话来读取或写入内容。JCR会话不需要是线程安全的,大多数实现都是do not implement concurrency的。这意味着它们不能被多个线程安全地使用,即使这只需要读取内容。(有些实现确实保证会话是are thread safe的,但最好避免依赖该特性,除非您想要或需要锁定该实现。)
总而言之,如果侦听器需要做任何工作,就离开调用线程,使用单独的会话来读取或更新内容。
https://stackoverflow.com/questions/13347595
复制相似问题