2017-02-09 27 views
0

В AEM CQ я использую менеджер активов api для записи контента (изображений, загруженных с) в плотину. Это запускает рабочий процесс Dam Update Asset. Мне нужно прочитать версии и свойства актива, которые будут записаны, как только рабочий процесс будет завершен. Мой вопрос: как дождаться завершения рабочего процесса для чтения свойств актива, а не thread.sleep.Как подождать до тех пор, пока не будет обновлен рабочий процесс обновления базы данных вместо потока dot sleep

Я попытался с вызовом рекурсивной функции итерации, пока свойство актива присутствует. Это дало исключение нулевого указателя. Но когда я помещаю thread.sleep из 50 мс внутри итерации, он работает для меня.

Другой подход Я попытался получить объект рабочего процесса внутри службы, чтобы прочитать статус рабочего процесса, но обнаружил, что для рабочего процесса ootb требуется несколько миллисекунд, чтобы начать после написания содержимого. Здесь также нужно было дать thread.sleep.

Еще одна попытка использования обработчика событий для прослушивания событий рабочего процесса. Мы можем ввести тип события по завершении рабочего процесса. Как уведомить службу или jsp о том, что рабочий процесс завершен, и мы можем прочитать свойства и исполнения активов?

Было бы здорово, если бы кто-то мог поделиться своими предложениями с отзывами о подходе. Спасибо.

ответ

1

У вас неправильный подход к решению этой проблемы. В моих глазах у вас есть ровно 2 разумных решения.

Создайте workflow process/step и увеличьте Рабочий процесс обновления плотины Damen с вашим пользовательским шагом.

ИЛИ

Создать JCR observation listener и слушать Event.PROPERTY_ADDED, например, или использовать более высокий API, строп и создать event handler с соответствующей темой и не выполнять бизнес-логику, как только недвижимость, которую ищет добавлен или изменена.

Почему бы не использовать Thread.sleep() или другое подобное решение:

  • вы не знаете, когда рабочий процесс выполняется точно. это может быть отложено, если загружено много asssets или просто застряли
  • вы не можете гарантировать, что ваш поток сможет выполнить его логику . экземпляр может быть остановлен, например,
  • создание нового протектора для каждого загруженного ресурса может быть дорогостоящей задачей. вы также теряете ресурсы при создании бесконечного цикла и помещаете эти потоки в сон, а затем разбудите их и проверьте снова и снова ... и так далее, пока, наконец, нить не сможет это сделать
+0

Благодарим вас за анс. Я получаю подходы к чтению данных persist, как объяснялось вами. Но все еще не уверен, как это поместится в моей проблеме. У меня есть компонент изображения, который использует htmlsmartimage xtype, и в его сценарии рендеринга я использую менеджер ресурсов api для записи контента (изображение, загруженное с помощью опции просмотра) в плотину для его создания, которое будет создано. Поскольку эти версии затем читаются в image.jsp для функции lighbox. С предлагаемым подходом теперь мой вопрос заключается в том, как передать управление из image.jsp в jcr-слушатель и обратно в jsp, не нарушая поток. Пожалуйста, помогите мне понять это. – ADM

+0

С помощью опции listener/handler вам не нужно ждать или синхронизировать с image.jsp, вы просто записываете свои данные, как только другие данные (например,свойство). С шагом процесса рабочего процесса с другой стороны вы можете убедиться, что ваша логика выполняется сразу после того, как метаданные были извлечены или созданы записи. – d33t

+0

Служба writeContentToDam вызывается из образа image.jsp, который запускает рабочий процесс обновления дампа обновления (рабочий процесс будет записывать свойство актива и выдачу). Следующим в image.jsp является чтение свойств и представлений свойств. Но проблема в том, что рабочий процесс ootb запускается с небольшой задержкой в ​​миллисекунды, а также занимает некоторое время в завершении. – ADM