AEM CQ 等待工作流完成
AEM CQ wait for workflow to finish
对于我当前的 AEM 6.0 项目,我需要创建自定义工作流来创建演绎版。正在与其他 AEM 项目在共享平台上工作。这就是我们不允许调整原始 DAMUpdateAsset 工作流(呈现 AEM 特定再现、缩略图等)的原因。
我的自定义再现工作流程呈现不同的再现。问题是,当我的工作流与 DAMUpdateAsset 工作流并行运行时,有时我会收到像 IllegalOakState 这样的异常。
我需要的是一个解决方案,等待我的工作流程,直到 DAMUpdateAsset 工作流程完成。
目前我正在尝试通过 oak 查询来完成这项工作
public static final String QUERY_STRING = "SELECT * FROM [nt:base] AS s WHERE ISDESCENDANTNODE([/etc/workflow/instances]) and CONTAINS('status', 'COMPLETED') and contains('modelId', '/etc/workflow/models/dam/update_asset/jcr:content/model') and [data/payload/path]='%s' and endTime > CAST('%s' AS DATE)";
private void waitForDamUpdateImage(Session session, String path) throws WorkflowException, InterruptedException
{
final DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX", Locale.GERMAN);
final Date now = new Date();
final Calendar calendar = Calendar.getInstance();
calendar.setTime(new Date(now.getTime() - 2 * 60 * 1000));
String queryString = String.format(QUERY_STRING, path, formatter.format(calendar.getTime()));
Iterator iterator;
do
{
//wait(100); this wait will produce IllegalMonitor... Exception
iterator = QueryUtils.query(session, queryString);
}
while (!iterator.hasNext());
}
我认为这不是最佳解决方案,我认为会有更简单的方法来解决这个问题。
希望你知道我的问题是什么,也许可以帮助我解决这个问题。
还是谢谢你 ;)
您可以创建一个工作流启动器,它将在针对节点类型 cq:workflow 和路径 /etc/workflow/instances(/.*) 修改节点事件时自动调用您的工作流。
并且条件是 status=COMPLETED 或 modeleid=/etc/workflow/models/dam/update_asset/jcr:content/model,您可能需要试验哪个条件具有最佳性能。
由于启动器中只允许一个条件,您需要在流程实施中检查其中一个条件,然后继续或中止。
我们意识到解决此问题的最佳方法是要求平台管理员在包含自定义工作流的 DamUpdateAsset 工作流末尾添加一个容器步骤。在自定义工作流程中,我们检查有效负载,如果内容正确,则只执行我们的步骤。现在所有其他解决方案都会出现多线程问题
对于我当前的 AEM 6.0 项目,我需要创建自定义工作流来创建演绎版。正在与其他 AEM 项目在共享平台上工作。这就是我们不允许调整原始 DAMUpdateAsset 工作流(呈现 AEM 特定再现、缩略图等)的原因。
我的自定义再现工作流程呈现不同的再现。问题是,当我的工作流与 DAMUpdateAsset 工作流并行运行时,有时我会收到像 IllegalOakState 这样的异常。
我需要的是一个解决方案,等待我的工作流程,直到 DAMUpdateAsset 工作流程完成。
目前我正在尝试通过 oak 查询来完成这项工作
public static final String QUERY_STRING = "SELECT * FROM [nt:base] AS s WHERE ISDESCENDANTNODE([/etc/workflow/instances]) and CONTAINS('status', 'COMPLETED') and contains('modelId', '/etc/workflow/models/dam/update_asset/jcr:content/model') and [data/payload/path]='%s' and endTime > CAST('%s' AS DATE)";
private void waitForDamUpdateImage(Session session, String path) throws WorkflowException, InterruptedException
{
final DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX", Locale.GERMAN);
final Date now = new Date();
final Calendar calendar = Calendar.getInstance();
calendar.setTime(new Date(now.getTime() - 2 * 60 * 1000));
String queryString = String.format(QUERY_STRING, path, formatter.format(calendar.getTime()));
Iterator iterator;
do
{
//wait(100); this wait will produce IllegalMonitor... Exception
iterator = QueryUtils.query(session, queryString);
}
while (!iterator.hasNext());
}
我认为这不是最佳解决方案,我认为会有更简单的方法来解决这个问题。
希望你知道我的问题是什么,也许可以帮助我解决这个问题。
还是谢谢你 ;)
您可以创建一个工作流启动器,它将在针对节点类型 cq:workflow 和路径 /etc/workflow/instances(/.*) 修改节点事件时自动调用您的工作流。 并且条件是 status=COMPLETED 或 modeleid=/etc/workflow/models/dam/update_asset/jcr:content/model,您可能需要试验哪个条件具有最佳性能。
由于启动器中只允许一个条件,您需要在流程实施中检查其中一个条件,然后继续或中止。
我们意识到解决此问题的最佳方法是要求平台管理员在包含自定义工作流的 DamUpdateAsset 工作流末尾添加一个容器步骤。在自定义工作流程中,我们检查有效负载,如果内容正确,则只执行我们的步骤。现在所有其他解决方案都会出现多线程问题