2

我实现了工作流,但很高兴知道客户端库是否提供了允许挂接的钩子。当触发并完成工作流时,应该显示 CQ.Notification。还是我需要自己实现一个投票库?

4

1 回答 1

0

据我所知,除了看这里之外,没有内置的 CQ 区域可以查看何时完成:

http://yoursite.com:port/libs/cq/workflow/content/console.html

到达那里后,您可以转到“实例”选项卡并查看发生了什么。

在我处理的一个应用程序中,我们最终编写了自己的方法,该方法根据我们的一个工作流程向我们发送通知(我们的工作流程与之相关 - 从工作流程模型区域,您可以将您的流程设置为您自己的 servlet '已经投入CQ)。这是我们的 servlet 中的主要代码,它捕获处于活动状态的进程,然后根据它找到的内容调用我们的方法向我们发送电子邮件:

import com.day.cq.workflow.WorkflowException;
import com.day.cq.workflow.WorkflowSession;
import com.day.cq.workflow.exec.WorkItem;
import com.day.cq.workflow.exec.WorkflowData;
import com.day.cq.workflow.exec.WorkflowProcess;
import com.day.cq.workflow.metadata.MetaDataMap;
import org.apache.felix.scr.annotations.Component;
import org.apache.felix.scr.annotations.Properties;
import org.apache.felix.scr.annotations.Property;
import org.apache.felix.scr.annotations.Service;
import org.osgi.framework.Constants;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.jcr.Node;
import javax.jcr.RepositoryException;
import java.util.Arrays;

public class YourServletName implements WorkflowProcess {
    @Override
    public void execute(WorkItem workItem, WorkflowSession workflowSession, MetaDataMap args) throws WorkflowException {
        session = workflowSession.getSession();
        final WorkflowData data = workItem.getWorkflowData();
        String type = data.getPayloadType();

        String[] argStrings = args.get("PROCESS_ARGS", ARG_UPDATED).split(",");
        String reason = argStrings[0];
        String baseUrl = argStrings[1];

        try {
            if (type.equals(TYPE_JCR_PATH) && data.getPayload() != null) {
                String resourcePath = data.getPayload().toString();
                logger.info("Send Notification that {} has been {}.", resourcePath, reason.toLowerCase());

                if (resourcePath != null && !resourcePath.isEmpty()) {
                    ResourceInfo resourceInfo = new ResourceInfo(resourcePath, baseUrl);
                    sendEmail(resourceInfo, reason);
                }
            }
        } catch (EmailException ex) {
            logger.warn("Failed to send Email");
            throw new WorkflowException(ex);
        } catch (MailingException ex) {
            logger.warn("Failed to send Email");
            throw new WorkflowException(ex);
        }
    }
}

您可以在扩展工作流功能的文档中找到更多信息。

查看该页面上的第一个代码块,这将使您最好地了解如何实现自定义工作流处理程序。

编辑

如果你想在前端看到它,你可以做一个 AJAX 调用来获取当前正在运行的工作流的 JSON 列表——你可以点击这个 url:

http://localhost:4502/etc/workflow/instances.RUNNING.json

然后你可以遍历它们,看看你的是否在那里。但这不是很好,因为它们都只是按 ID 列出的。相反,我建议使用查询构建器,或者再次执行 AJAX GET。这是一个例子:

1_group.0_path=/etc/workflow/instances
2_group.0_type=cq:Workflow
0_group.property.2_value=COMPLETED
0_group.property=status
0_group.property.and=true
3_group.property=modelId
3_group.property.2_value=/etc/workflow/models/your-model-name/jcr:content/model
3_group.property.and=true

然后 URL 看起来像这样:

http://yoursiteurl:port/libs/cq/search/content/querydebug.html?_charset_=UTF-8&query=http%3A%2F%2Fyoursiteurl%3Aport%3F%0D%0A1_group.0_path%3D%2Fetc%2Fworkflow%2Finstances%0D%0A2_group.0_type%3Dcq%3AWorkflow%0D%0A0_group.property.2_value%3DRUNNING%0D%0A0_group.property%3Dstatus%0D%0A0_group.property.and%3Dtrue%0D%0A3_group.property%3DmodelId%0D%0A3_group.property.2_value%3D%2Fetc%2Fworkflow%2Fmodels%2Fyour-model-name%2Fjcr%3Acontent%2Fmodel%0D%0A3_group.property.and%3Dtrue

这很丑陋,但它可以为您提供所需的结果,然后您可以解析它们以获取所需的更多信息。

于 2013-04-19T18:02:17.143 回答