`
yangshen998
  • 浏览: 1248150 次
文章分类
社区版块
存档分类
最新评论

JBPM4.4 实现简单请假的例子的点滴

 
阅读更多

注:

本人近期在学习JBPM工作流开发,属于起步阶段。学习了family168 的jbpm 4 教程视频后,将该教程中的jsp请假例子整合到S2SH 框架中。在此,对family168 表示感谢!

JBPM4.4 插件只能安装在Myeclipse 8.0 及以上版本上,我之前用Myeclipse 7.0 试了半天都没有成功,发现7.0 的eclipse 版本不够,下载了Myeclipse 8.5 后一次安装成功,很方便。访客可以参考网上的资料

关于JBPM4.4 整合 S2SH 过程中,需要注意到3点:

1. JBPM el jar 包和 struts2 中jar 包的冲突

2. java JVM 内存设置不够大,导致出现JVM 报错,可以在Myeclipse 中调高JVM 的内存设置大小

3. hibernate 的dialect 设置问题: 将原来的 MysqlDialect 改成 MySQLInnoDBDialect

<prop key="hibernate.dialect">
org.hibernate.dialect.MySQLInnoDBDialect
</prop>

以上问题都可以在网上搜索得到解决,就不重复制造轮子了。

贴出 leave.jpdl.xml 的代码:

<?xml version="1.0" encoding="UTF-8"?>
<process name="leave" xmlns="http://jbpm.org/4.4/jpdl">
<start g="196,25,48,48" name="start1">
<transition to="applay"/>
</start>
<task assignee="#{owner}" form="/SSH/LeaveJSP/leave_add.jsp" g="172,118,92,52" name="applay">
<transition to="managerAprove"/>
</task>
<task assignee="#{manager}" form="leaveAction!toManager.action" g="175,217,92,52" name="managerAprove">
<transition g="-32,-8" name="aprove" to="exclusive1"/>
<transition g="128,221;124,165:-42,-18" name="notAprove" to="applay"/>
</task>
<decision expr="#{dayNum > 3 ? 'bossAprove' : 'end'}" g="200,308,48,48" name="exclusive1">
<transition g="-39,-10" name="end" to="end1"/>
<transition g="339,342:-71,-17" name="bossAprove" to="bossAprove"/>
</decision>
<task assignee="#{boss}" form="leaveAction!toBoss.action" g="294,375,92,52" name="bossAprove">

<transition g="339,457:" to="end1"/>
</task>
<end g="199,445,48,48" name="end1"/>
</process>

改xml 文件和 原版的xml 文件的区别就在于 <task assignee="#{manager}" <task assignee="#{boss}"。

原版本 是 <task assignee=“manager” <task assignee=“boss”。指定了具体用户名的用户来接受任务,而在现实中,不能将部门经理的用户名以及老板的用户名写入到xml 文件中。

我的设想是: 某个用户启动了请假流程定义后,需要该用户的直接部门经理和上级部门经理来批准,请假天数《=3时,只需直接部门经理批准就可,》3天时,需要上级部门经理批准。

这是和原版本中最重要的区别:

当用户启动流程定义时:

Map session=ActionContext.getContext().getSession();
Map map = new HashMap();
User user=(User)session.get("user");
map.put("owner",user.getUsername());
map.put("manager", user.getDepartment().getManagerUser().getUsername());
map.put("boss", user.getDepartment().getParent().getManagerUser().getUsername());

executionService.startProcessInstanceById(defId, map);

这段代码将该用户的直接部门经理用户名和上级部门经理用户名添加到流程实例中

这样,只有该用户的两级部门经理才能看到待办任务!

在实现这个例子的过程中,显示 leave.png图片时,还遇到一个问题,

java.lang.IllegalStateException: getOutputStream() has already been called for this response
at org.apache.catalina.connector.Response.getWriter(Response.java:604)

问题的原因:

web容器生成的servlet代码中有out.write(””),这个和JSP中调用的response.getOutputStream()产生冲突.

解决方法:

byte[] b = new byte[1024];
int len = -1;
while ((len = inputStream.read(b, 0, 1024)) != -1) {
response.getOutputStream().write(b, 0, len);
}
out.clear();
out = pageContext.pushBody();

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics