posts - 59, comments - 244, trackbacks - 0, articles - 0
  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

JBPM4.2小例子(swing实现)

Posted on 2009-12-09 00:51 penngo 阅读(5203) 评论(36)  编辑  收藏 所属分类: JBPM

本次用的是一个特别流程,假设C提交一个表单,这个表单需要给A和B阅读,而A和B阅读过后,流程结束.
流程定义文件swing.jpdl.xml

<?xml version="1.0" encoding="UTF-8"?>

<process name="swing" xmlns="http://jbpm.org/4.0/jpdl">
   
<start g="94,64,48,48" name="start1">
      
<transition g="-52,-22" name="A" to="A"/>
   
</start>
   
<task assignee="A" g="73,195,92,52" name="A">
      
<transition g="-52,-22" name="B" to="B"/>
   
</task>
   
<task assignee="B" g="266,192,92,52" name="B">
      
<transition g="-40,-21" name="end" to="end1"/>
   
</task>
   
<end g="290,327,48,48" name="end1"/>
</process>


流程图

增加两个表:
用户表p_user:
USER_      用户登录ID
PASSWORD_  用户登录密码

表单数据表p_form:
ID_             表单编号
TITLE_          表单标题
CONTENT_        表单内容
PROCESS_ID      流程实例ID
p_form除了记录表单数据,还记录启动流程实例的ID,这个表负责把表单和流程关联起来.


提交表单时的操作,FormPanel.java部分代码:

okBtn = new JButton("提交表单");
okBtn.addActionListener(
new ActionListener(){
public void actionPerformed(ActionEvent e){
 String t 
= title.getText().trim();
 String c 
= content.getText().trim();
 String processId 
= startProcessInstance();
    
 DataBase db 
= new DataBase();
 
if(db.saveForm(t, c, processId)){
  JOptionPane.showMessageDialog(
null"保存表单数据成功:");
  title.setText(
"");
  content.setText(
"");
 }

}

}
);



private String startProcessInstance(){
 Configuration configuration 
= new Configuration();
 ProcessEngine processEngine 
= configuration.buildProcessEngine();
 RepositoryService repositoryService 
= processEngine.getRepositoryService();
 ExecutionService executionService 
= processEngine.getExecutionService();
 ProcessInstance processInstance 
= executionService.startProcessInstanceByKey("swing");
 
if(processInstance == null){
     JOptionPane.showMessageDialog(
null"请先发布流程.");
 }

 
else{
     
return processInstance.getId();
 }

 
return "";
}



代码很简单,行获取表单的数据,再启动流程实例,并把表单数据和流程实例ID一起保存在数据库表p_form.


在用户处理任务时,先根据用户的ID查找到该用户的待处理任务,并把它添加到任务列表中,

DefaultListModel v = new DefaultListModel();
List list 
= getTaskList(Login.userName);
if(list.size() > 0){
 
for(int s = 0; s < list.size(); s++){
  Task t 
= (Task)list.get(s);
  String executionId 
= t.getExecutionId();
  DataBase db 
= new DataBase();
  TaskPojo tp 
= db.findForm(executionId);
  tp.setTaskId(t.getId());
  
if(tp != null){
   v.addElement(tp);
  }

 }

}

jList 
= new JList(v);
.
 
private List getTaskList(String userId){
  
if(configuration == null){
   configuration 
= new Configuration();
  }

     ProcessEngine processEngine 
= configuration.buildProcessEngine();
     RepositoryService repositoryService 
= processEngine.getRepositoryService();
     ExecutionService executionService 
= processEngine.getExecutionService();
     TaskService taskService 
= processEngine.getTaskService();
     HistoryService historyService 
= processEngine.getHistoryService();
     ManagementService managementService 
= processEngine.getManagementService();
     List
<Task> taskList = taskService.findPersonalTasks(userId);
     
return taskList;
 }



用户处理任务,根据列表中选中记录中的流程实例任务ID,调用taskService.completeTask(taskId)完成任务,
okBtn 
= new JButton("审阅通过");
okBtn.addActionListener( 
new ActionListener(){
 
public void actionPerformed(ActionEvent e){
  Object o 
= jList.getSelectedValue();
  
if(o instanceof TaskPojo){
   TaskPojo tp 
= (TaskPojo)o;
   completeTask(tp.getTaskId());
   JOptionPane.showMessageDialog(
null"审核已经通过!");
   DefaultListModel dl 
= (DefaultListModel)jList.getModel();
   dl.remove(jList.getSelectedIndex());
   buttomPanel.setVisible(
false);
  }

 }

}
);
..
private void completeTask(String taskId){
 
if(configuration == null){
  configuration 
= new Configuration();
 }

 ProcessEngine processEngine 
= configuration.buildProcessEngine();
 TaskService taskService 
= processEngine.getTaskService();
 taskService.completeTask(taskId);
}



数据库中登录用户:
帐号:A  密码:123
帐号:B  密码:123
帐号:D  密码:123

用户D登录
图1


图2

用户A登录
图3


查看待办任务
图4


用户B登录
图5

查看B的待办任务
图6

本人的开发环境
eclipse3.5
JBPM4.2
mysql-essential-5.1.40-win32
JDK1.6
要运行这个例子,需要修改jbpm.hibernate.cfg.xml,DataBase.java数据库的连接信息

测试代码:jbpmTest
 


评论

# re: JBPM4.2小例子(swing实现)  回复  更多评论   

2009-12-10 10:51 by 99书城网
是大方家点击放大

# re: JBPM4.2小例子(swing实现)  回复  更多评论   

2009-12-10 16:00 by 懂事
你把代码再多给你点啊,太难理清楚了
谢谢
可以的话加我的QQ378578601很希望你能指教一下

# re: JBPM4.2小例子(swing实现)  回复  更多评论   

2009-12-10 16:02 by 懂事
记得兄弟等你的佳音,很期待你的回复。记得加QQ378578601

# re: JBPM4.2小例子(swing实现)  回复  更多评论   

2009-12-10 22:58 by pengo
@懂事
看不明白你的意思,代码全在附件里,你可以下来看下.不过只有一个提交表单数据和查看待办任务的功能.表单提交后,A是第一个任务处理人,A处理完,任务会交给B处理.

# re: JBPM4.2小例子(swing实现)  回复  更多评论   

2009-12-11 11:53 by 懂事
你的项目是不是在窗体加载的时候部署项目吗?在你的附件Man.java中有个public void deploy()方法,但是看你注释了,其它地方也没调用。那你的流程是怎么部署的呢?兄弟我一直等你佳音,希望你马上能看到。

我想你加我QQ378578601,想向你学习JBPM

# re: JBPM4.2小例子(swing实现)  回复  更多评论   

2009-12-11 13:01 by pengo
@懂事
这个只是我在学习jbpm4.2写的小例子,不是用在项目里面的,jbpm4比jbpm3改了比较多内容,我也是在学习。jbpm4.2发布了也没多久,应该未有公司正式用在项目上。
另外有一个项目用jbpm3, BS做的,tomcat每次启动时,会先检查相应的表是否存在,如果不存在,则在数据库中建立相应的表。如果里面有流程包,也会在tomcat启动时一起发布。
少上QQ,还是不加了。

# re: JBPM4.2小例子(swing实现)  回复  更多评论   

2009-12-11 13:14 by 懂事
在你的附件Man.java中有个public void deploy()方法是用的吗?如果有用你却注释了,没用用你怎么部署项目呢?

# re: JBPM4.2小例子(swing实现)  回复  更多评论   

2009-12-11 13:21 by 懂事
老大你能给个方向吗?在线等你回音。。。

# re: JBPM4.2小例子(swing实现)  回复  更多评论   

2009-12-11 13:37 by pengo
有用的,在第一次运行时就调用它发布流程,只不过是我的例子里代码没写得完整,我不想它每次运行main时都把流程发布一次(发布要费时间),所以发布完就把它注释掉了。

# re: JBPM4.2小例子(swing实现)  回复  更多评论   

2009-12-11 14:21 by 懂事
那你是怎么调用的呢?我没看出来啊.能说得具体点吗?

# re: JBPM4.2小例子(swing实现)  回复  更多评论   

2009-12-11 15:22 by pengo
deploy()方法里面有发布流程的,发布流程只要
Configuration configuration = new Configuration();
ProcessEngine processEngine = configuration.buildProcessEngine();
RepositoryService repositoryService = processEngine.getRepositoryService();
String deploymentId = repositoryService.createDeployment().addResourceFromClasspath("jbpm/Order.jpdl.xml").deploy();
这个是直接发布一个xml文件的方法。在configuration.buildProcessEngine()时,它会读取jbpm.hibernate.cfg.xml(hibernate的一个配置文件),它会根据<property name="hibernate.hbm2ddl.auto">update</property>这个属性设置,自动生成JBPM的所有表,具体怎样设,你看下hibernate的手册。
repositoryService.createDeployment().addResourceFromClasspath("jbpm/Order.jpdl.xml").deploy()是发布流程类。
不过在项目中一般不会只有一个xml文件,有jbpm的流程定义文件、流程图片、自定义的配置xml等,可以打成一个rar、zip、jar等方式发布。对流程定义的xml还是调用repositoryService,其它文件要自己另外处理。

# re: JBPM4.2小例子(swing实现)  回复  更多评论   

2009-12-11 16:22 by 爱 女优
学习了!!!

# re: JBPM4.2小例子(swing实现)  回复  更多评论   

2009-12-12 13:33 by 99书城
水力发电使开发独守空房

# re: JBPM4.2小例子(swing实现)  回复  更多评论   

2009-12-14 10:49 by 懂事
老大你能不能弄个个B/S架构的呢,原理到时懂了,可是配置上问题又出来了,报错

Exception in thread "main" org.jbpm.api.JbpmException:
error: couldn't parse xml document : org.jbpm.api.JbpmException: resource jbpm.cfg.xml does not exist
error: parsing exception: null : java.lang.NullPointerException
at org.jbpm.pvm.internal.xml.ProblemList.getJbpmException(ProblemList.java:175)
at org.jbpm.pvm.internal.xml.ProblemList.getJbpmException(ProblemList.java:141)
at org.jbpm.pvm.internal.xml.Parse.checkErrors(Parse.java:190)

配置又怎么弄呢?

# re: JBPM4.2小例子(swing实现)  回复  更多评论   

2009-12-14 16:14 by pengo
因为调用代码
Configuration configuration = new Configuration();
ProcessEngine processEngine = configuration.buildProcessEngine();
new Configuration()默认情况下是要读取src/jbpm.cfg.xml的配置文件,如果这个文件不在src下(如src/jbpm/jbpm.cfg.xml),需要使用configuration.setResource()指定配置文件。
BS的要迟点才有空写。

# re: JBPM4.2小例子(swing实现)  回复  更多评论   

2009-12-15 15:56 by 懂事
老大我根据用户名怎么查询不出来待处理的任务呢

# re: JBPM4.2小例子(swing实现)  回复  更多评论   

2009-12-16 09:50 by 懂事
哥哥终于查出来了哈,太谢谢你了。

# re: JBPM4.2小例子(swing实现)  回复  更多评论   

2009-12-16 15:11 by 懂事
老大想请问你一个问题了,现在我想再审核的时候加以个审核内容,A添加的审核内容B能看到,B也能再添加审核内容。给个方向行吗?头都大了没方向,摆脱了。谢谢,在线等你。。。

# re: JBPM4.2小例子(swing实现)  回复  更多评论   

2009-12-16 21:40 by wozuiaideliufang
哥哥我是楼上的那个人,就是这几天问你问题的,你在吗?我真的很希望你能指点一下,是渴望啊。

# re: JBPM4.2小例子(swing实现)  回复  更多评论   

2009-12-17 15:43 by 懂事
老大你能告诉我,JBPM的XML的节点怎么取值和赋值吗?

# re: JBPM4.2小例子(swing实现)  回复  更多评论   

2009-12-18 09:38 by pengo
@懂事
前几天很忙,没有上来看评论。

1.现在我想再审核的时候加以个审核内容,A添加的审核内容B能看到,B也能再添加审核内容。
我知道的有两个方法:新建个数据表记录审核内容,审核内容表(表单ID,流程ID,任务ID,审核内容......),你自己考虑下表的字段。另外我看了jbpm4.2的用户手册,里面有任务变量TaskService.getVariables()和TaskService.setVariables()这个也能实现你需求。

2.老大你能告诉我,JBPM的XML的节点怎么取值和赋值吗?
不明白你的问题。

# re: JBPM4.2小例子(swing实现)  回复  更多评论   

2009-12-18 16:56 by 懂事
你说说我要学 JBPM,你有哪些建议呢?这样自己网上学,不系统样。很迷糊。

# re: JBPM4.2小例子(swing实现)  回复  更多评论   

2009-12-18 17:06 by 懂事
我想买本书看看,你能介绍一下吗?

# re: JBPM4.2小例子(swing实现)  回复  更多评论   

2009-12-19 10:39 by pengo
@懂事
我想买本书看看,你能介绍一下吗?

现在很少JBPM的书,我知道的只有一本《深入浅出jBPM》,不过我也没看过,好像是介绍JBPM3的内容。我现在学习JBPM4.2,主要是看它的用户手册(jbpm-4.2/doc/userguide,网上有它的中文翻译版) 和jbpm-4.2/doc下的开发文档、API文档、jpdl的Schema文档。

# re: JBPM4.2小例子(swing实现)  回复  更多评论   

2009-12-20 21:31 by 懂事
好的我看看,谢谢哈

# re: JBPM4.2小例子(swing实现)  回复  更多评论   

2009-12-21 09:58 by 懂事
想问你个问题,是急救,就是我的参数表第一次提交时3个字段,第二审核多了个经理审核意见。要在同一个流程里在变量表里多添加一个审核意见的字段怎么办呢?

# re: JBPM4.2小例子(swing实现)  回复  更多评论   

2009-12-21 13:10 by pengo
@懂事
看不明白你说的“在同一个流程里在变量表里多添加一个审核意见的字段”。我不知你是怎样保存审核意见。
你看下TaskService和ExecutionService的setVariables()方法有没用不。

# re: JBPM4.2小例子(swing实现)  回复  更多评论   

2009-12-21 14:28 by 懂事
你方便吗?能给我个电话吗?发邮箱378578601@qq.com
真的很想和你交流下

# re: JBPM4.2小例子(swing实现)  回复  更多评论   

2009-12-21 14:29 by 懂事
很期望能请教你几个问题。一两句也说不清楚。

# re: JBPM4.2小例子(swing实现)  回复  更多评论   

2009-12-22 09:06 by pengo
呵呵,有问题的话,可以直接在留言簿给我留言。如果是懂的问题,我都会回答你的。

# re: JBPM4.2小例子(swing实现)  回复  更多评论   

2009-12-25 17:16 by 懂事
想请教你一个问题,怎么在网页中显示JBPM图片呢?如果我不想压缩ZIP包可以实现在网页中显示JBPM图片吗?

# re: JBPM4.2小例子(swing实现)  回复  更多评论   

2009-12-29 10:33 by 懂事
老大你怎么不回答我的问题了呢?

# re: JBPM4.2小例子(swing实现)  回复  更多评论   

2009-12-31 10:36 by pengo
怎么在网页中显示JBPM图片呢?如果我不想压缩ZIP包可以实现在网页中显示JBPM图片吗?

显示图片可以直接用<img src=""/>这个html控件。一般在流程运行过程中显示流程图,节点上有会加个红色小框,红色框可以直接用div模拟。

# re: JBPM4.2小例子(swing实现)  回复  更多评论   

2010-01-07 09:36 by 懂事
老哥你会JAVA中的 COMPASSS搜索引擎框架吗?

# re: JBPM4.2小例子(swing实现)  回复  更多评论   

2010-01-07 09:56 by pengo
呵呵,不懂,目前java方面只做过工作流方面的相关内容。

# re: JBPM4.2小例子(swing实现)  回复  更多评论   

2010-12-13 12:43 by pandora jewelry
在gpd目录下有一个gpd/jbpm-gpd-site.zip文件, 这就是更新站点(archived update site)的 压缩包 hehe

只有注册用户登录后才能发表评论。


网站导航: