JBPM6 服务任务执行 java 代码

JBPM6 Service task to execute java code

我是 JBPM6 的新手。我的场景是这样的,我想使用 JBPM 服务 task.From 文档执行一些 java 代码 我无法理解如何在此类代码中使用域特定流程和工作项处理程序。 如果有人有它的示例,请 share.That 会非常有帮助。

提前致谢。

以下是如何在 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

中定义的 class 相匹配
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 打开时,调色板中应该有一个 'Custom Tasks' 选项卡。它应该包含一个带有指定图标的 'Awesome' 条目。

除了 Mike 提供的(优秀)示例之外,如果您的唯一目标是执行一些 Java 代码,您可以考虑改用脚本任务(并且只需嵌入 Java 代码在您的流程中)或重用可以在 Java class.

上调用操作的现有服务任务

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

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

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

我找到了this(它说的是jbpm5-samples,但我用jbpm 6.3测试过),它使用了一个服务任务,服务任务从Class执行方法"hello"( HelloService) 你创建:

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 class(HelloService - 方法 hello)相关联。 为此,我使用了 eclipse bpmn 建模器,但我发现它不是很直观,所以我用建模器打开示例的 bpmn 文件 (BPMN2-ServiceProcess.bpmn2),并用我在那里阅读的相同内容填充我的服务任务。

@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());

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