0

非同期の作業項目ハンドラーとしてHumanTaskHandlerを説明しているjbpmフォーラムの記事https://community.jboss.org/thread/165545taskclient.complete()を読みました。非同期のヒューマンタスクハンドラーを使用している場合は、でタスクを完了してから、プロセスエンジンに次のように通知する 必要があります。 ksession.getWorkItemManager().completeWorkItem()

これは、非同期workitemhandlerを使用しながらタスクを完了するための理想的なアプローチですか?
これは、タスクを2回完了するようなものです。complete()実際に電話すると何が起こっているのcompleteWorkItem()でしょうか。
明確にしてください。

4

2 に答える 2

2

taskClient.complete()メソッドを呼び出すときにすべてが正しく設定されている場合、セッションは通知され、ksession.getWorkItemManager()。completeWorkItem()が自動的に呼び出されます。自分で呼ぶ必要はありません。WorkItemHandlerをセッションに登録し、通知できるようにセッションを存続させることを忘れないでください。乾杯

于 2012-05-24T12:12:45.613 に答える
1

JBPM 6の場合、マネージャーとksessionがタスクを完了するために機能しないため、このような非同期の作業項目ハンラーを実装しました。RuntimeManagerRegistryのMaven依存関係は、kie-internalバージョン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();
        }
    }
于 2014-02-28T22:38:59.610 に答える