Sri*_*Sri 3 jackrabbit jcr sling aem
我在单盒 cq5 作者环境中遇到以下异常。
javax.jcr.InvalidItemStateException: Item cannot be saved
because node property has been modified externally
Run Code Online (Sandbox Code Playgroud)
更多异常详情:
Caused by: javax.jcr.InvalidItemStateException: Unable to update a stale item: item.save()
at org.apache.jackrabbit.core.ItemSaveOperation.perform(ItemSaveOperation.java:262)
at org.apache.jackrabbit.core.session.SessionState.perform(SessionState.java:216)
at org.apache.jackrabbit.core.ItemImpl.perform(ItemImpl.java:91)
at org.apache.jackrabbit.core.ItemImpl.save(ItemImpl.java:329)
at org.apache.jackrabbit.core.session.SessionSaveOperation.perform(SessionSaveOperation.java:65)
at org.apache.jackrabbit.core.session.SessionState.perform(SessionState.java:216)
at org.apache.jackrabbit.core.SessionImpl.perform(SessionImpl.java:361)
at org.apache.jackrabbit.core.SessionImpl.save(SessionImpl.java:812)
at com.day.crx.core.CRXSessionImpl.save(CRXSessionImpl.java:142)
at org.apache.sling.jcr.resource.internal.helper.jcr.JcrResourceProvider.commit(JcrResourceProvider.java:511)
... 215 more
Caused by: org.apache.jackrabbit.core.state.StaleItemStateException: 3bec1cb7-9276-4bed-a24e-0f41bb3cf5b7/{}ssn has been modified externally
at org.apache.jackrabbit.core.state.SharedItemStateManager$Update.begin(SharedItemStateManager.java:679)
at org.apache.jackrabbit.core.state.SharedItemStateManager.beginUpdate(SharedItemStateManager.java:1507)
at org.apache.jackrabbit.core.state.SharedItemStateManager.update(SharedItemStateManager.java:1537)
at org.apache.jackrabbit.core.state.LocalItemStateManager.update(LocalItemStateManager.java:400)
at org.apache.jackrabbit.core.state.XAItemStateManager.update(XAItemStateManager.java:354)
at org.apache.jackrabbit.core.state.LocalItemStateManager.update(LocalItemStateManager.java:375)
at org.apache.jackrabbit.core.state.SessionItemStateManager.update(SessionItemStateManager.java:275)
at org.apache.jackrabbit.core.ItemSaveOperation.perform(ItemSaveOperation.java:258)
Run Code Online (Sandbox Code Playgroud)
这是代码示例:
adminResourceResolver = resourceResolverFactory
.getAdministrativeResourceResolver(null);
Resource fundPageResource = adminResourceResolver.getResource(page
.getPath() + "/jcr:content");
ModifiableValueMap homePageResourceProperties = fundPageResource
.adaptTo(ModifiableValueMap.class);
homePageResourceProperties.put("ssn",(person.getSsn());
adminResourceResolver.commit();
Run Code Online (Sandbox Code Playgroud)
有任何想法吗 ?可能有多个线程访问此代码,因为多个页面上的多个作者从一个编写的组件调用此代码。
谢谢你,斯里
这是您在 CQ5.5 中经常看到的错误(并且随着每个版本向上而减少)。此问题的根本原因是多个进程/服务在大致相同的时间跨度内修改相同的资源(通常使用不同的会话,有时甚至使用不同的用户)。
一个小例子来演示一下。会话 A 和 B 都引用了资源 X。会话 A 修改了 X 上的一些属性,保存并提交,然后被销毁。这一切都很顺利。会话 B 在 A 进行修改之前仍然有情况的快照,会话 B 进行修改并且一切似乎都很好,直到它尝试保存。此时,会话 B 检测到它无法提交其更改,因为它没有最新的节点状态。它检测到一些其他会话对同一节点进行了更改。本质上,当前节点状态与会话 A 所做的修改发生冲突,并引发 ItemStale 异常。此异常的原因是 API 不知道您是否要保留 A 所做的更改,保留当前会话所做的更改并丢弃 A 所做的更改,
此错误经常发生在长时间运行的会话和工作流/侦听器组合中。因此,建议尽可能缩短会话时间,以尽可能防止此类冲突。
处理这个问题的一种方法是在调用 .save() 之前调用 session.refresh(keepChangesBoolean)。这会指示当前会话检查其他会话所做的更新并根据您提交的布尔标志进行处理。然而,这不是一个保证,因为在您的刷新和保存调用之间仍有可能,另一个会话已经完成了相同的操作。它只会降低发生此异常的几率。解决此问题的另一种方法是从头开始重试。
| 归档时间: |
|
| 查看次数: |
2268 次 |
| 最近记录: |