При загрузке нескольких ресурсов в DAM нарушается шаг процесса рабочего процесса

1

Я задал вопрос о том, как получить доступ к загруженному ресурсу, отправить его на сторонний сервис и затем заменить его на тот, который был отправлен обратно из стороннего сервиса.

Я получил отличный ответ на этот вопрос, используя который я смог написать код, который хорошо работает при загрузке отдельных активов, однако он не работает, когда я загружаю сразу несколько активов. Когда я одновременно загружаю несколько активов, имена и контент ресурсов не загружаются. Например если я upload 1.jpg 2.jpg 3.jpg 4.jpg 5.jpg тогда в случайном случае оно заменит содержание 1.jpg с 2.jpg или 4.jpg содержание с 3.jpg etc.

    public void execute(WorkItem item, WorkflowSession wfsession,MetaDataMap args) throws WorkflowException {
        try
        {
            final Map<String, Object> map = new HashMap<String, Object>();
            map.put( "user.jcr.session", wfsession.getSession());

            ResourceResolver rr = resolverFactory.getResourceResolver(map);
            String path = item.getWorkflowData().getPayload().toString();
            Resource resource = rr.getResource(path);
            InputStream is = resource.adaptTo(InputStream.class);
            Rendition rendition = resource.adaptTo(Rendition.class);
            Asset asset = rendition.getAsset();
            //send the asset to service and get newInputStream from the service
            InputStream newInputStream = myService.sendFile(is);
            //replace the original rendition with the one received from the service
            asset.addRendition(rendition.getName(),newInputStream,asset.getMimeType());
        }
        catch (Exception e) {...}
   }

Вопрос

  • Мне интересно, есть ли способ изменить мой код, чтобы обрабатывать прецедент загрузки нескольких активов одновременно. Я считаю, что это происходит из-за ответа моего сервиса на возврат входного потока, возможно, не будет завершено до того, как CQ5 отправит новый актив. Есть ли способ заблокировать это, чтобы мой шаг процесса работал на одном изображении за раз?

Заметка:

  • У меня есть опция Handler Advance для моего Process Step
  • Из моего тестирования: все нормально, если я одновременно загружу два актива... что-то большее, чем это вызывает проблему.
Теги:
osgi
sling
cq5

1 ответ

0
Лучший ответ

Загрузка актива создает новый экземпляр рабочего процесса (вы можете увидеть его в консоли рабочего процесса), с отдельной WorkflowData нагрузкой, полезной нагрузкой и т.д. Поэтому готовый продукт Update Asset работает отлично даже для многих загруженных одновременно.

Если у вас возникли проблемы с таким случаем, просмотрите свой пользовательский процесс и myService чтобы убедиться, что он потокобезопасен. Помните, что OSGi создает только один экземпляр @Component, поэтому такие компоненты не должны иметь состояние, зависящее от текущего запроса, текущего рабочего потока и - в общем - от текущего потока.

Как правило, для классов, являющихся компонентами OSGi, должны быть объявлены только поля, содержащие объекты, которые могут быть разделены между многими потоками, например @Reference к другим службам и свойствам конфигурации.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню