Jboss 在异步Workitemhandler中处理任务

Jboss 在异步Workitemhandler中处理任务,jboss,drools,jbpm,Jboss,Drools,Jbpm,我在jbpm论坛上读到一篇文章,将HumanTaskHandler描述为异步工作项处理程序,当我们使用异步HumanTaskHandler时,我们必须使用taskclient.complete()完成任何任务,然后使用ksession.getWorkItemManager().completeWorkItem()向流程引擎发送信号 这是在使用异步workitemhandler时完成任务的理想方法吗? 这就像完成一项任务两次。实际上,当我们调用complete()和completeWorkItem

我在jbpm论坛上读到一篇文章,将HumanTaskHandler描述为异步工作项处理程序,当我们使用异步HumanTaskHandler时,我们必须使用
taskclient.complete()
完成任何任务,然后使用
ksession.getWorkItemManager().completeWorkItem()
向流程引擎发送信号

这是在使用异步workitemhandler时完成任务的理想方法吗?
这就像完成一项任务两次。实际上,当我们调用
complete()
completeWorkItem()
时会发生什么
请澄清。

如果在调用taskClient.complete()方法时所有设置都正确,则会通知会话,并自动调用ksession.getWorkItemManager().completeWorkItem()。你没必要自己叫它。您只需要记住将WorkItemHandler注册到会话并保持会话活动,以便可以通知它。
干杯

如果在调用taskClient.complete()方法时所有设置都正确,则会通知会话,并且会自动为您调用ksession.getWorkItemManager().completeWorkItem()。你没必要自己叫它。您只需要记住将WorkItemHandler注册到会话并保持会话活动,以便可以通知它。
干杯

对于JBPM 6,我已经实现了这样一个异步工作项hanler,因为经理和ksession无法完成任务。RuntimeManagerRegistry的Maven依赖关系是kie内部版本6.0.1.Final,JSOUP1.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();
        }
    }

对于JBPM 6,我已经实现了一个类似这样的异步工作项hanler,因为管理器和ksession无法完成任务。RuntimeManagerRegistry的Maven依赖关系是kie内部版本6.0.1.Final,JSOUP1.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();
        }
    }

文档中明确指出,对于异步工作项处理程序,我们必须使用Completeworkitem()。如果client.complete()足够,在哪种情况下需要completworkitem()。?我很想知道。明白了。当我们重新启动流程引擎时,我们必须对中断的流程任务使用completeworkitem()来继续执行。文档清楚地说明,对于异步工作项处理程序,我们必须使用completeworkitem()。如果client.complete()足够,在哪种情况下需要completworkitem()。?我很想知道。明白了。当我们重新启动流程引擎时,我们必须对中断的流程任务使用completeworkitem()来继续执行。