Я задал вопрос о том, как получить доступ к загруженному ресурсу, отправить его на сторонний сервис и затем заменить его на тот, который был отправлен обратно из стороннего сервиса.
Я получил отличный ответ на этот вопрос, используя который я смог написать код, который хорошо работает при загрузке отдельных активов, однако он не работает, когда я загружаю сразу несколько активов. Когда я одновременно загружаю несколько активов, имена и контент ресурсов не загружаются. Например если я 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) {...}
}
Вопрос
Заметка:
Handler Advance
для моего Process Step
Загрузка актива создает новый экземпляр рабочего процесса (вы можете увидеть его в консоли рабочего процесса), с отдельной WorkflowData
нагрузкой, полезной нагрузкой и т.д. Поэтому готовый продукт Update Asset работает отлично даже для многих загруженных одновременно.
Если у вас возникли проблемы с таким случаем, просмотрите свой пользовательский процесс и myService
чтобы убедиться, что он потокобезопасен. Помните, что OSGi создает только один экземпляр @Component
, поэтому такие компоненты не должны иметь состояние, зависящее от текущего запроса, текущего рабочего потока и - в общем - от текущего потока.
Как правило, для классов, являющихся компонентами OSGi, должны быть объявлены только поля, содержащие объекты, которые могут быть разделены между многими потоками, например @Reference
к другим службам и свойствам конфигурации.