我问了question有关如何访问上传的 Assets ,将其发送到第三方服务,然后用第三方服务发回的 Assets 替换该 Assets 。
我得到了一个很棒的answer对于这个问题,我可以使用它编写下面的代码,当我上传单个 Assets 时,该代码运行良好,但是,当我同时上传多个 Assets 时,它不起作用。当我同时上传多个 Assets 时, Assets 名称和内容不是上传的。例如,如果我上传 1.jpg 2.jpg 3.jpg 4.jpg 5.jpg
那么它会随机用 2 替换 1.jpg
的内容。 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) {...}
}
问题
- 我想知道是否有办法更改我的代码来处理同时上传多个 Assets 的用例。我相信发生这种情况是因为在 CQ5 发送新 Assets 之前,我的服务返回输入流的响应可能尚未完成。有没有办法阻止这种情况,以便我的处理步骤一次只处理一张图像?
注意:
- 我为我的
流程步骤
选中了Handler Advance
选项
- 根据我的测试:如果我同时上传两个 Assets ,一切都会正常……超过这个数量就会导致问题。
上传 Assets 会创建一个新的工作流实例(您可能会在工作流控制台中看到这些实例),其中包含单独的 WorkflowData
、有效负载等。因此,开箱即用的工作流 < em>更新 Assets 即使对于同时上传的许多 Assets 也能正常工作。
如果您遇到此类情况的问题,请检查您的自定义流程和 myService
以查看它是否是线程安全的。请记住,OSGi 仅创建 @Component
的一个实例,因此此类组件不应具有依赖于当前请求、当前工作流程以及(通常)当前线程的状态。
作为一个经验法则:作为 OSGi 组件的类应该只声明包含可以在多个线程之间共享的对象的字段,例如其他服务和配置属性的 @Reference
。
我是一名优秀的程序员,十分优秀!