JBPM5————人工任务
一、 人工任务属性
jBPM支持在流程内使用一个指定的用户任务节点(如上面图所示)表示人工任务。
二、人工任务生命周期 从这个流程透视来看,每当一个流程实例的执行时用户任务节点将触发,创建一个人工任务。 这个流程想该点继续只有当人工任务已经完成或中止(当然,除非你指定该过程不需要等待人工任务完成,通过设置“Wait for completion”属性设置为true)。 然而,人工任务本身通常有一个单独的生命周期。 现在,我们将很快介绍这个生命周期,如下面的图所示。
每当一个任务被创建时,它进入“Created”状态。
以上是正常生命周期的解释。
o
o
o
o
o 三、示例实现 人工任务节点在JBPM5中是一个异步WorItem,JBPM5中已经带有一个WorkItemHandler的人工任务的实现类是WSHumanTaskHandler,这个handler能同一个Task Service通信(由jBPM5提供),并在其中创建一个新的任务。然后,它将等待别人(使用人工客户端API)来完成/取消该任务。 在jbpm5中你可以实现WorkItemHandler接口, 不使用默认实现,根据你需要进行。 如: class MyNonAutomaticHumanSimulatorWorkItemHandler implements WorkItemHandler { private WorkItemManager workItemManager; private long workItemId; public void executeWorkItem(WorkItem workItem, WorkItemManager workItemManager) { this.workItemId = workItem.getId(); this.workItemManager = workItemManager; System.out.println("Map of Parameters = " + workItem.getParameters()); } public void abortWorkItem(WorkItem workItem, WorkItemManager workItemManager) { } public void completeWorkItem(Map<String, Object> parameters) { this.workItemManager.completeWorkItem(this.workItemId, parameters); } 那在注册的时候你就可以注册自已的实现: MyHumanChangingValuesSimulatorWorkItemHandler humanActivitiesSimHandler = new MyHumanChangingValuesSimulatorWorkItemHandler(); ksession.getWorkItemManager().registerWorkItemHandler("Human Task", humanActivitiesSimHandler); 在实现在我们需要实现一个服务端和一个客户端,jBPM5的安装包中提供一个示例,它服务端采用ant启动,数据库使用h2。下面将依据这个示例做一个类似的例示,数据据使用MYSQL5,学习它们之间的交互。 o 服务端实现 1、继承UserInfo,方便添加用户与组相关信息; 2、添加一个最小的服务监听实现; public void startServer() { if(isRunning()) throw new IllegalStateException("Server is already started"); this.running = true; EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("org.drools.task"); TaskService taskService = new TaskService(entityManagerFactory, SystemEventListenerFactory.getSystemEventListener()); TaskServiceSession taskSession = taskService.createSession() ; UserInfoDomain userInfo = new UserInfoDomain(); taskService.setUserinfo( userInfo); for (String userName : getDefaultUsers()) { taskSession.addUser(new User(userName)); } taskServer = new MinaTaskServer(taskService); Thread thread = new Thread(taskServer); thread.start(); } 3、配置数据库连接 人工任务有相关的数据实体,包含在jbpm-human-task.5.0.0.jar中,在示例代码中我将提供。 o 客户端实现 通过jbpm提供连接方法实现。如下: /** * 创建客户端连接 * */ public HumanTaskClient() { client = new TaskClient(new MinaTaskClientConnector("client 1", new MinaTaskClientHandler(SystemEventListenerFactory.getSystemEventListener()))); client.connect("127.0.0.1", 9123); } /** * 加载流程模板和注册人工任务 * @throws RuntimeException */ public void start() throws RuntimeException { KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder(); kbuilder.add(new ClassPathResource("rules/humanTask.bpmn"), ResourceType.BPMN2); System.out.println("Compiling resources"); if (kbuilder.hasErrors()) { if (kbuilder.getErrors().size() > 0) { for (KnowledgeBuilderError error: kbuilder.getErrors()) { System.out.println("Error building kbase: "+error.getMessage()); } } throw new RuntimeException("Error building kbase!"); } KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase(); kbase.addKnowledgePackages(kbuilder.getKnowledgePackages()); ksession = kbase.newStatefulKnowledgeSession(); logger = KnowledgeRuntimeLoggerFactory.newConsoleLogger(ksession); ksession.getWorkItemManager().registerWorkItemHandler("Human Task", new WSHumanTaskHandler()); } /** * 启动流程 * @throws RuntimeException */ public void startProcess() throws RuntimeException { try { ksession.startProcess( "com.zt.jbpm.humantask.client", null ); } catch (IllegalArgumentException ex) { throw new RuntimeException(ex.getMessage()); } } 四、运行 1、启动服务器监听: 直接在eclipse里面运行StartHumanTaskServer类的 main方法,效果如下: 运行客户端:直接在eclipse里面运行Application类的main方法,效果如下: 项目示例代码: 示例项目采用maven构建,如果想转为普通java 项目,可自行到jbpm与drools官方网站下载jbpm-5.0.0-bin.zip,drools-5.1.1-bin.zip相关的jar文件即可。 |
jbpm5学习资料(人工任务)
最新推荐文章于 2022-02-21 18:17:11 发布