2015-03-03 29 views
5

我是JBPM6中的新成员。我的情况是这样的,我想要执行一些使用JBPM服务任务的Java代码。从文档我不能够了解如何在这种类型的代码中使用域特定的过程和工作项处理程序。 如果有人有样品的例子,请分享。这将非常有帮助。JBPM6执行java代码的服务任务

预先感谢您。

回答

6

以下是如何在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工作项处理程序配置文件/主/资源/ META-INF/CustomWorkItemHandlers.conf

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

3)创建的Drools会话配置文件:的src/main /资源/ 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”的条目。

+0

你好迈克。我仍然无法生成自定义工作项目。我遵循你提到的相同的程序。我的代码中的更改只是在主类中使用 'KieSession ksession = engine.getKieSession();' 和CustomWorkItemHandlers.conf中。我改成了按我的包 “真棒“:新com.sample.AwesomeHandler()” 我们需要任何的Drools它特定的设置,因为目前我在正常mavenJBPM项目做 我们需要的任何。特定的调色板?我现在只有JBPM调色板 你能帮我吗? – user3118158 2015-03-11 05:27:22

+0

你是说你的错误是你没有看到调色板中的自定义任务吗?如果没有看到你做了什么,很难排除故障。你确定所有文件都在正确的位置吗?WorkItemDefinitions.wid中指定的图标文件名是否实际引用了src/main/resources中的实际图像文件?你记得drools.session.conf文件吗?您可以发布您的代码吗? – Mike 2015-03-11 13:03:53

+0

我只是双重检查我的项目和我有一个错误的文件位置。它应该是src/main/resources/META-INF/drools.session.conf。我将在我的原始文章中更新文件路径。 – Mike 2015-03-11 13:11:17

0

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

+1

是的Kris.I目前正在做同样的事情。但是,当我不得不使用异步任务的时候,多个对象将被创建,我认为这是不利的。所以我正在考虑这个服务thask。 非常感谢您的回复。 – user3118158 2015-03-04 09:00:15

1

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

here我读了ServiceTaskHandler,但我找不到有关使用情况的很好的信息。

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

我发现this(它说jbpm5样本,但我和jBPM 6.3测试),它使用一个服务任务,服务任务从一类(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类的服务任务,我后(HelloService的 - 方法你好)。 为此,我使用了eclipse bpmn建模器,但是我没有发现它非常直观,所以我使用建模器打开了示例的bpmn文件(BPMN2-ServiceProcess.bpmn2),并使用我在那里读取的相同内容填充了我的服务任务。