ОБНОВЛЕНИЕ
Билет Liferay принят, решение в dev: https://issues.liferay.com/browse/LPS-82954
Ситуация
Мой контекст - это параллельный импорт макетов liferay через портлет liferay;строить с весны.Когда я выполняю это в Liferay dxp;вызов API для добавления макета вызывает исключение StaleObjectStateException.(https://github.com/liferay/liferay-portal/blob/d969e0e839db9ea64267f7bff0a76be93cd26fa0/portal-impl/src/com/liferay/portal/service/impl/LayoutLocalServiceImpl.java)
Это исключение возникает, когда API-интерфейс внутренне обновляет соответствующий LayoutSet (обновляет PageCount для той группы, в которую был добавлен макет, всего минуту назад).
Этого не происходит в однопоточном исполнении!
Действия
- Сначала я синхронизировал этот вызов ... без каких-либо лучших результатов
- Тем временем я что-то читало том, что только синхронизация потоков не поможет, потому что сама транзакция не может быть внутри блока синхронизированного выполнения, поэтому я также добавил транзакционную аннотацию ... без лучших результатов
до сих пор яполучил следующее понимание:
Отрывки кода
-> Доступен тестовый проект: 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;
}