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

时间:2014-09-24 15:25:54

标签: java jboss jbpm wildfly

我已经挣扎了好几天,并且没有多少运气。在jboss wildfly上运行的jBPM 6工作台中,我尝试调用自定义工作项处理程序并传入特定于域的对象的实例。

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

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

  2. 上传" datamodel.jar"通过" Artifact存储库" - >上传功能到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" 
      ]
    ]
    
  8. 将特定于域的任务(问候)添加到我的流程工作流程。

  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
        }
    }
    
  11. 将workitems.jar复制到jbpm-installer / dependencies目录。

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

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

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

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

    Unexpected error encountered : java.lang.NoClassDefFoundError:acme/datamodel/UserBio
    

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

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

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

    这些只是我过去几天一直在努力解决的一些问题。我在处理自定义工作项处理程序时遇到的所有示例似乎都只传递了原语,而不是更复杂的对象。

    如果有人能够解释我出错的地方或者指出了更好的例子,我非常感激。

1 个答案:

答案 0 :(得分:1)

通过部署datamodel jar和workitem jar,我能够成功调用自定义工作项处理程序。可以找到更多详细信息here