我向question询问了如何访问上传的资产,将其发送给第三方服务,然后将资产替换为从第三方服务发回的资产。
我为这个问题找到了一个很棒的answer,使用它可以编写下面的代码,当我上传单个资源时效果很好,但是,当我上传时,不工作同时上传多个资产。当我同时上传多个资产时,资产名称和内容不是上传的内容。例如,如果我上传1.jpg 2.jpg 3.jpg 4.jpg 5.jpg
,那么它将随机替换1.jpg
的内容2.jpg
或4.jpg
内容3.jpg
等。
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
选项
答案 0 :(得分:0)
上传资产会创建一个新的工作流实例(您可能会在工作流控制台中看到这些实例),具有单独的WorkflowData
,有效负载等。因此,开箱即用的工作流更新资产即使对于同时上传的许多资产也能正常工作。
如果您遇到此类问题,请检查您的自定义流程和myService
,看看它是否是线程安全的。请记住,OSGi只创建@Component
的一个实例,因此这些组件不应具有依赖于当前请求,当前工作流以及 - 通常 - 当前线程的状态。
作为一个经验法则:作为OSGi组件的类应该只声明包含可以在许多线程之间共享的对象的字段,例如@Reference
到其他服务和配置属性。