【问题标题】:How to wait until dam update asset workflow is completed instead of thread dot sleep如何等到大坝更新资产工作流程完成而不是线程点睡眠
【发布时间】:2023-03-11 23:00:01
【问题描述】:

在 AEM CQ 中,我正在使用资产管理器 api 在 dam 中编写内容(上传的图像)。这会触发开箱即用的 Dam Update Asset 工作流程。我需要阅读工作流完成后将写入可用的演绎版和资产属性。 我的问题是如何等到工作流程完成才能读取资产属性而不是 thread.sleep。

我尝试在资产属性存在时使用递归函数调用进行迭代。这给出了空指针异常。但是当我在迭代中放置一个 50 毫秒的 thread.sleep 时,它对我有用。

另一种方法我尝试让服务内的工作流对象读取工作流状态,但发现在写入内容后启动 ootb 工作流需要几毫秒。这里还得给thread.sleep。

再次尝试使用事件处理程序来侦听工作流事件。我们可以在工作流程完成时输入事件类型。如何通知服务或 jsp 工作流完成,我们可以读取资产属性和演绎版?

如果有人可以分享他们对该方法的建议反馈,那就太好了。谢谢。

【问题讨论】:

    标签: workflow aem wait dam


    【解决方案1】:

    你有错误的方法来解决这个问题。在我看来,您对此有两个合理的解决方案。

    创建workflow process/step 并使用您的自定义步骤扩展大坝更新资产工作流程

    例如创建 JCR observation listener 并监听 Event.PROPERTY_ADDED 或使用更高级别的 sling API 并使用适当的主题创建 event handler,然后在添加或更改您查找的属性后立即执行您的业务逻辑。

    为什么不使用 Thread.sleep() 或其他类似的解决方案

    • 您不知道工作流的确切执行时间。可能是 如果上传了许多资产或只是卡住了,则会延迟
    • 你不能保证你的线程能够执行它 逻辑。例如,实例可能会停止
    • 为每个上传的资源创建一个新的线程可能是一项昂贵的任务。当您创建无限循环并使这些线程进入睡眠状态时,您也会浪费资源,而不是唤醒它们并一次又一次地检查......等等,直到最终线程能够完成它的工作

    【讨论】:

    • 感谢您的回答。正如你所解释的,我得到了读取持久数据的方法。但仍然不确定,它如何适合我的问题。我有一个使用 htmlsmartimage xtype 的图像组件,在其渲染脚本中,我使用资产管理器 api 在 dam 中写入内容(使用浏览选项上传的图像)以创建其再现。然后在 image.jsp 中读取此再现以使灯箱运行。现在使用建议的方法,我的问题是如何在不中断流程的情况下将控制从 image.jsp 转移到 jcr 侦听器并返回到 jsp。请帮助我理解这一点。
    • 使用 listener/handler 选项,您不必等待或与 image.jsp 同步,您只需在其他数据(例如属性)可用时立即写入数据。通过另一方面的工作流过程步骤,您可以确保在提取元数据或创建再现后立即执行您的逻辑。
    • 从 image.jsp 调用 writeContentToDam 服务,触发 dam 更新资产工作流(工作流将写入资产属性和再现)。 image.jsp 中的下一步是读取资产属性和再现。但问题是 ootb 工作流触发时有轻微的毫秒延迟,并且需要一些时间才能完成。
    • 好像跟不上你了。 “我正在写内容”到底是什么意思。请扩展或修改您的问题以使其足够清晰,也许还提供示例或流程图。
    • 我正在使用资产管理器 api 以编程方式将图像上传到 dam,以便由 ootb 工作流程创建其再现。由于使用浏览选项上传的图像仅存储为带有二进制文件的对话框属性,我们没有它的演绎版。工作流程完成后,再现可用并可在后续行中读取,以提供图像灯箱的 url。所有这些编码都是使用 xtype htmlsmartimage 在自定义图像组件的 image.jsp 中完成的。工作流程需要时间来启动和完成。在我们阅读之前如何确保属性可用
    猜你喜欢
    • 1970-01-01
    • 2020-08-05
    • 1970-01-01
    • 1970-01-01
    • 2014-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多