JBPM6服务任务执行java代码

时间:2015-03-03 06:22:57

标签: java jbpm bpmn

我是JBPM6的新手。我的场景是这样的,我想使用JBPM服务任务执行一些Java代码。从文档中我无法理解如何在这种类型的代码中使用特定于域的进程和工作项处理程序。 如果有人有示例,请分享。这将非常有帮助。

提前谢谢。

4 个答案:

答案 0 :(得分:7)

以下是如何在Eclipse maven项目中添加处理程序。我把它称为Awesome处理程序,但你应该选择一个更具体的名称。

1)首先在src / main / resources / WorkItemDefinitions.wid中创建工作项定义文件。我的图标文件位于src / main / resources。

import org.drools.core.process.core.datatype.impl.type.StringDataType;

[
  [
    "name" : "Awesome",
    "parameters" : [
      "Message1" : new StringDataType(),
       "Message2" : new StringDataType()
     ],
    "displayName" : "Awesome",
    "icon" : "icon-info.gif"
  ]
]

2)在src / main / resources / META-INF / CustomWorkItemHandlers.conf中创建工作项处理程序配置文件

[
  "Awesome": new org.jbpm.examples.util.handler.AwesomeHandler()
]

3)创建一个drools会话配置文件:src / main / resources / META-INF / drools.session.conf

drools.workItemHandlers = CustomWorkItemHandlers.conf

4)创建您的处理程序,使其与您在步骤2中定义的类匹配

public class AwesomeHandler implements WorkItemHandler {

    public AwesomeHandler() {
        super();
    }

    public void executeWorkItem(WorkItem workItem, WorkItemManager manager) {
        System.out.println("Executing Awesome handler");
        manager.completeWorkItem(workItem.getId(), null);
    }

    public void abortWorkItem(WorkItem workItem, WorkItemManager manager) {
        System.out.println("Aborting");
    }
}

5)建立处理程序后,必须在会话中注册。

//Get session
KieSession ksession = runtime.getKieSession();

//Register handlers
ksession.getWorkItemManager().registerWorkItemHandler("Awesome", new AwesomeHandler());

此时你应该重启eclipse。当eclipse打开时,调色板中应该有一个“自定义任务”选项卡。它应该包含一个标有'Awesome'并带有指定图标的条目。

答案 1 :(得分:1)

我知道这个问题已经回答了,但我想做同样的事情(在服务任务中执行java代码)而不创建工作项定义(我不想使用自定义任务,而是使用服务任务) 。这就是我解决它的方法:

here我读到了有关ServiceTaskHandler的信息,但我找不到有关用法的非常好的信息。

我读了ServiceTaskHandler代码,它使用反射来运行你的java代码。

我发现this(它说的是jbpm5-samples,但我用jbpm 6.3测试过),它使用服务任务,服务任务从你创建的类(HelloService)执行方法“hello”:

package com.test;

import java.util.HashMap;
import java.util.Map;

public class HelloService {

    public DataOutput hello(com.test.DataInput name) {
        Map<String, Object> dataMap = new HashMap<String, Object>();
        dataMap.put("s", "Hello " + name.getDataMap().get("s") + "!");
        DataOutput output = new DataOutput(dataMap);
        return output;
    }

}

ServiceTaskHandler的注册方式与标记为正确的答案中的步骤(5)相同:

//Get session
KieSession ksession = runtime.getKieSession();

//Register handlers
ksession.getWorkItemManager().registerWorkItemHandler("Service Task",        new ServiceTaskHandler());

之后,我将服务任务与java类(HelloService - 方法hello)相关联。 为此,我使用了eclipse bpmn建模器,但我没有发现它非常直观,因此我使用建模器打开了样本的bpmn文件(BPMN2-ServiceProcess.bpmn2)并用我在那里阅读的相同内容填充了我的服务任务。

答案 2 :(得分:1)

@mike 我真的希望你能看到我的评论并愿意帮助我。所以我按照你提到的每一步,但我仍然没有看到我的自定义任务。

enter image description here

这是我的项目目录,我认为一切正常,但为了确保我只是在这里发布我的代码

WorkItemDefinitions.wid:

import org.drools.core.process.core.datatype.impl.type.StringDataType;

    [
      [
        "name" : "Awesome",
        "parameters" : [
          "Message1" : new StringDataType(),
           "Message2" : new StringDataType()
         ],
        "displayName" : "Awesome",
        "icon" : "ezgif.com-apng-to-gif.gif"
      ]
    ]

drools.session.conf:

<块引用>

drools.workItemHandlers = CustomWorkItemHandlers.conf

CustomWorkItemHandlers.conf:

[
  "Awesome": new com.sample.AwesomeHandler()
]

AwsomeHandler.java:

package com.sample;

import org.kie.api.runtime.process.WorkItem;
import org.kie.api.runtime.process.WorkItemHandler;
import org.kie.api.runtime.process.WorkItemManager;

public class AwesomeHandler implements WorkItemHandler{
    
    public AwesomeHandler() {
        super();
    }


    @Override
    public void executeWorkItem(WorkItem workItem, WorkItemManager manager) {
        // TODO Auto-generated method stub
        System.out.println("Executing Awesome handler");
        manager.completeWorkItem(workItem.getId(), null);
    }

    @Override
    public void abortWorkItem(WorkItem workItem, WorkItemManager manager) {
        // TODO Auto-generated method stub
        System.out.println("Aborting");
    }

}

主要内容:

TaskService taskService = engine.getTaskService();
ksession.getWorkItemManager().registerWorkItemHandler("Awesome", new AwesomeHandler());

我真的不知道我做错了什么,我的大学需要这个。我真的希望我能得到回复并祝你有美好的一天;)

答案 3 :(得分:0)

除了Mike提供的(优秀)示例之外,如果您的唯一目标是执行某些Java代码,则可以考虑使用脚本任务(并在您的流程中嵌入Java代码)或重用已有的服务可以在Java类上调用操作的任务。