2016-12-13 6 views
1

Я делаю обновление для нескольких узлов, а затем пакетное публикацию (большое количество данных) с помощью команды «Активировать», чтобы публиковать узлы программно, но иногда я не знаю, почему Иногда я получаю сообщение об ошибке. Это произошло только несколько раз, поэтому мне трудно понять, что вызывает проблему.Связанная активацияСтатус был изменен извне при публикации

Приведенная ошибка.

Caused by: org.apache.jackrabbit.core.state.StaleItemStateException: 8b3ce2d4-eb7b-4838-901c-413aa9eeee84/{http://www.magnolia.info/jcr/mgnl}activationStatus has been modified externally 
    at org.apache.jackrabbit.core.ItemSaveOperation.removeTransientItems(ItemSaveOperation.java:723) 
    at org.apache.jackrabbit.core.ItemSaveOperation.perform(ItemSaveOperation.java:228) 

Неужели кто-нибудь сталкивался с подобной проблемой? Или любая идея, где посмотреть эту проблему?

Спасибо! :)

+0

Я предполагаю, что вы используете асинхронные команды, поэтому можно изменить его состояние, пока другой не обработает случай. Если вы сделаете это программно, я предлагаю попробовать, если это помогает время Thread.sleep() между ними. Если проблема в том, что это действительно время, мы можем что-то сделать, например, слушать, когда операция завершена и т. Д. И т. Д. – Ducaz035

+0

Привет @ Ducaz035, это команда async? Я выполняю этот: Команда cmd = ((CommandsManager) Components.getComponent (CommandsManager.class)). GetCommand ("", "activate"); Контекст ctx = новый SimpleContext(); Map params = new HashMap <>(); params.put ("репозиторий", имя_рабочего пространства); params.put ("uuid", uuid); params.put ("рекурсивный", true); ctx.putAll (params); cmd.execute (ctx); –

+0

Кроме того, я не совсем понимаю, что произошло на самом деле? почему активацияStatus изменена извне? существует только один экземпляр автора, и никто не затрагивает публичный экземпляр, кроме этого экземпляра автора. Не могли бы вы объяснить, где это может произойти? Большое спасибо! –

ответ

1

В основном операция обновления внутренне заставляет Magnolia изменять состояние активации (что является правильным). Когда эта операция продолжается, операция обновления берет верх и пытается изменить состояние. В этом случае, если вам не повезло, вы можете поразить полученное вами исключение. Рассуждение заключается в том, что эти команды запускают async, но касаются одних и тех же узлов.

Потенциальное решение:

1) Вы можете просто дать некоторое время для первой операции, чтобы завершить и выполнить вторую после.

2) Это требует некоторых усилий развития, но здесь мы идем:

Вы можете использовать LockManager для блокировки узлов, используемых в первой операции и разблокировать его, когда операция выполняется полностью. Вторая операция пока проверит, заблокированы ли узлы, и если да, то не будет продолжаться, но дождитесь ее разблокировки от первого процесса.

+0

Хорошо, спасибо! Я попробую первый. благодаря! :) –