【问题标题】:Processing a task in an Asynchronous Workitemhandler在异步 Workitemhandler 中处理任务
【发布时间】:2012-05-23 06:27:45
【问题描述】:

我在 jbpm 论坛文章 https://community.jboss.org/thread/165545 中看到将 HumanTaskHandler 描述为异步工作项处理程序,当我们使用异步人工任务处理程序时,我们必须使用 taskclient.complete() 完成任何任务,然后使用 ksession.getWorkItemManager().completeWorkItem() 向流程引擎发出信号。

这是在使用异步工作项处理程序时完成任务的理想方法吗?
这就像完成一个任务两次。实际上,当我们调用 complete()completeWorkItem().?
请澄清。

【问题讨论】:

    标签: jboss drools jbpm


    【解决方案1】:

    如果您在调用 taskClient.complete() 方法时已正确设置所有内容,会话将通知您,并且会自动为您调用 ksession.getWorkItemManager().completeWorkItem()。无需自己调用。您只需要记住将 WorkItemHandler 注册到会话并保持会话处于活动状态,以便通知它。 干杯

    【讨论】:

    • 文档明确指出,在异步工作项处理程序的情况下,我们必须使用 Completeworkitem()。如果 client.complete() 就足够了,那么在哪种情况下需要 completworkitem()。?我只是很想知道。
    • 知道了。当我们重新启动流程引擎时,我们必须对中断流程的任务使用 completeworkitem() 以继续执行。
    【解决方案2】:

    对于 JBPM 6,我已经实现了一个像这样的异步工作项处理程序,因为管理器和 ksession 无法完成任务。 RuntimeManagerRegistry 的 Maven 依赖项是 kie 内部版本 6.0.1.Final,jsoup 1.7.2。

        import java.io.IOException;
        import org.drools.core.process.instance.impl.WorkItemImpl;
        import org.jsoup.Jsoup;
        import org.kie.api.runtime.manager.RuntimeEngine;
        import org.kie.api.runtime.manager.RuntimeManager;
        import org.kie.api.runtime.process.WorkItem;
        import org.kie.api.runtime.process.WorkItemHandler;
        import org.kie.api.runtime.process.WorkItemManager;
        import org.kie.internal.runtime.manager.RuntimeManagerRegistry;
        import org.kie.internal.runtime.manager.context.EmptyContext;
    
    
        public class AsyncWorkItemHandler implements WorkItemHandler {
            boolean abort = false;
    
            @Override
            public void abortWorkItem(WorkItem workItem, WorkItemManager manager) {
                manager.abortWorkItem(workItem.getId());
                abort = true;
            }
    
            @Override
            public void executeWorkItem(final WorkItem workItem, final WorkItemManager manager) {
                final String depId = ((WorkItemImpl) workItem).getDeploymentId();
                new Thread(new Runnable() {
                    String url = (String) workItem.getParameter("url");
                    org.jsoup.nodes.Document document = null;
    
                    public void run() {
                        while (true) {
                            if (abort == true) {
                                break;
                            }
                            // example of polling a web site for specific text
                            // before task can complete say "release"
                            try {
                                document = Jsoup.connect(url).timeout(3000).get();
                            }
                            catch (IOException e) {
                                e.printStackTrace();
                            }
                            String info = document.text();
                            if (info.contains("release")) {
                                if (depId != null) {
                                    RuntimeManager manager = RuntimeManagerRegistry.get().getManager(depId);
                                    RuntimeEngine engine = manager.getRuntimeEngine(EmptyContext.get());
                                    engine.getKieSession().getWorkItemManager().completeWorkItem(workItem.getId(), null);
                                    manager.disposeRuntimeEngine(engine);
                                }
                                else {
                                    // this is for eclipse testing because depId is not
                                    // available
                                    manager.completeWorkItem(workItem.getId(), null);
                                }
                                break;
                            }
                            try {
                                Thread.sleep(2000);
                            }
                            catch (InterruptedException e) {
                                e.printStackTrace();
                            }
                        }
                    }
                }).start();
            }
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-04-11
      • 1970-01-01
      • 2015-07-18
      • 1970-01-01
      • 2020-07-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多