并行API LayoutLocalService.addLayout在LayoutSetLocalService中抛出StaleObjectStateException

时间:2018-05-25 11:29:46

标签: java liferay liferay-7 liferay-dxp staleobjectstate

更新

接受Liferay门票,开发中的解决方案:https://issues.liferay.com/browse/LPS-82954

情况

我的上下文是通过liferay portlet并行导入liferay布局;用春天建造。当我在Liferay dxp中执行它时; api调用添加一个Layout会抛出一个StaleObjectStateException。 (https://github.com/liferay/liferay-portal/blob/d969e0e839db9ea64267f7bff0a76be93cd26fa0/portal-impl/src/com/liferay/portal/service/impl/LayoutLocalServiceImpl.java

当api在内部对相应的LayoutSet进行更新时更新此异常(更新该组的PageCount,其中布局已添加到,只是片刻之前)。

在单线程执行中不会发生这种情况!

操作

  1. 首先我同步了这个电话..没有任何更好的结果
  2. 同时我读到了一些事情,只有同步线程才有帮助,因为事务本身可能不在同步执行块内。因此我还添加了一个事务注释。 ..没有更好的结果
  3. 到目前为止,我获得了以下见解:

    代码摘录

    - >可用的测试项目:https://github.com/andrebiegel/liferay-layout-issue.git

    private static final Object layoutCreationLock = new Object();
                synchronized (layoutCreationLock) {
                    newLayout = addLayoutApiCall(pageContext, serviceContext, typeSettings, friendlyURLMap);
                }
    
    
    
    
    
        @Transactional(propagation = Propagation.REQUIRES_NEW)
    public Layout addLayoutApiCall(IPageContext pageContext, ServiceContext serviceContext, String typeSettings,
            Map<Locale, String> friendlyURLMap) throws PortalException {
        Layout newLayout;
        newLayout = LayoutLocalServiceUtil.addLayout( pageContext.getProjectConfiguration().getUserId(), pageContext.getProjectConfiguration()
                                                      .getSiteId(), pageContext.isPrivatePage(), pageContext.getParentLayoutId(), pageContext
                                                      .getNamesMap(), pageContext.getTitleMap(), pageContext.getDescriptionMap(), pageContext
                                                      .getKeywordsMap(), pageContext.getRobotsMap(), pageContext.getPageType(), typeSettings,
                                                      pageContext.isHiddenPage(), friendlyURLMap, serviceContext );
        return newLayout;
    }
    

1 个答案:

答案 0 :(得分:0)

不幸的是,Liferay无法解决此问题。门票已关闭;声明为非用例。原因是该解决方案在其他用例中产生了负面影响。因此,Liferay似乎在其交易管理中存在问题。顺便说一句,当同时添加Expandos时,我也看到了此类异常。