CQ5 - 当工作流程结束时在前端显示CQ.Notification

时间:2013-03-16 08:34:41

标签: cq5

我实现了工作流程,但是很高兴知道客户端库是否提供了允许挂钩的挂钩。当工作流程被触发并完成时,应该显示CQ.Notification。或者我是否需要自己实施一个民意调查库?

1 个答案:

答案 0 :(得分:0)

据我所知,除了查看此处之外,没有内置的CQ区域可以看到什么时候完成:

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

在那里,您可以转到“实例”标签,看看发生了什么。

在我工作的一个应用程序中,我们最终编写了自己的方法,根据我们的工作流程向我们发送通知(我们的工作流程与之相关 - 从工作流模型区域,您可以将流程设置为你已经加入CQ的servlet)。这是我们的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);
        }
    }
}

您可以在Extending Workflow Functionality.

的文档中找到更多信息

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

修改

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

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

然后你可以循环浏览它们,看看你的是否在那里。这不是很好,因为它们都只是按ID列出。我建议使用querybuilder,或者再次,只是做一个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

它很难看,但它可以为您提供所需的结果,然后您可以解析它们以获得您需要的更多信息。