将特定于域的对象传递给 jBPM 6 工作台中的特定于域的任务

Gre*_*lds 5 java jboss jbpm wildfly

我已经为此苦苦挣扎了几天,但运气不佳。在 jboss wildfly 上运行的 jBPM 6 工作台中,我试图调用自定义工作项处理程序并传入特定于域的对象的实例。

到目前为止,这是我的过程:

  1. 在外部 jar 中定义特定于域的类 acme.datamodel.UserBio:datamodel.jar。

  2. 通过“工件存储库”-> 上传功能将“datamodel.jar”上传到 jbpm-console。

  3. 在 jbpm-console 中创建一个新的存储库并创建一个新的 jbpm 项目。

  4. 通过项目编辑器将 datamodel.jar 作为依赖项添加到我的 jbpm 项目。

  5. 在 jbpm 项目中创建一个新进程。

  6. 创建 acme.datamodel.UserBio 类型的新流程变量。

  7. 为我的域特定任务 (Greeting.wid) 创建一个新的工作项定义,如下所示:

    import org.drools.core.process.core.datatype.impl.type.StringDataType;
    import org.drools.core.process.core.datatype.impl.type.ObjectDataType;
    [
      [
        "name" : "Greeting", 
        "parameters" : [ 
            "UserBio" : new ObjectDataType("acme.datamodel.UserBio") 
        ], 
        "results" : [ 
            "Result" : new ObjectDataType("java.util.Map") 
        ], 
        "displayName" : "Greeting", 
        "icon" : "../../../global/defaultservicenodeicon.png" 
      ]
    ]
    
    Run Code Online (Sandbox Code Playgroud)
  8. 将特定于域的任务 (Greeting) 添加到我的流程工作流中。

  9. 将步骤 5 中的流程变量映射为 Greeting 任务的输入参数。

  10. 在外部 jar (workitems.jar) 中定义我的自定义工作项处理程序,如下所示:

    package acme.workitem.greeting;
    
    import java.util.Map;
    
    import org.kie.api.runtime.process.WorkItem;
    import org.kie.api.runtime.process.WorkItemManager;
    import org.kie.internal.runtime.StatefulKnowledgeSession;
    
    import acme.datamodel.UserBio;
    
    public class GreetingWorkItemHandler implements WorkItemHandler {
    
            private StatefulKnowledgeSession ksession;
    
        public GreetingWorkItemHandler(StatefulKnowledgeSession ksession) {
                this.ksession = ksession;
            }
    
        public void executeWorkItem(WorkItem workItem, WorkItemManager workItemManager) {
    
            // Extract required parameters
            UserBio bio = (UserBio) workItem.getParameter("UserBio");
    
            // Do something
    
            // Notify manager that work item has been completed and return results
            Map<String, Object> results = new HashMap<String, Object>();
            workItemManager.completeWorkItem(workItem.getId(), results);
        }
    
        public void abortWorkItem(WorkItem workItem, WorkItemManager workItemManager) {
            // Can't abort a greeting work item handler
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)
  11. 将 workitems.jar 复制到 jbpm-installer/dependencies 目录。

  12. 编辑 jbpm-installer/conf/META-INF/CustomWorkItemHandlers.conf 并添加以下行:

    "Greeting" : new acme.workitem.greeting.GreetingWorkItemHandler(ksession)
    
    Run Code Online (Sandbox Code Playgroud)
  13. 重新安装jbpm demo(即jbpm-console)并重启jboss。

  14. 在浏览器中加载 jbpm-console,启动我的流程实例并尝试调用特定于域的任务。

毕竟,当加载特定于域的任务并调用自定义工作项处理程序时,我在 jbpm-console 中收到以下错误,但在我的 jboss 日志中没有显示任何内容:

Unexpected error encountered : java.lang.NoClassDefFoundError:acme/datamodel/UserBio
Run Code Online (Sandbox Code Playgroud)

自定义工作项处理程序是否使用与调用它们的流程实例相同的类加载器加载?

我尝试将 datamodel.jar 添加到 META-INF/lib 目录下的 workitems.jar 中,但这似乎没有任何改变。

我是否需要将 datamodel.jar 添加为 Greeting.wid 的依赖项?当 jar 文件已经上传到 jbpm-console 时,如何定义它的位置?我是否像对 workitems.jar 所做的那样将 datamodel.jar 复制到依赖项目录并重新安装 jbpm-console?这不会与步骤 2 中上传到 jbpm-console 的版本产生潜在冲突吗?

这些只是我过去几天一直在努力的一些事情。我见过的所有处理自定义工作项处理程序的示例似乎都只传入原语,从来没有传入更复杂的对象。

如果有人能解释我哪里出错了或者给我指出更好的例子,我将非常感激。

Gre*_*lds 1

我能够通过部署数据模型 jar 和工作项 jar 来成功调用自定义工作项处理程序。可以在此处找到更多详细信息。