7月1号 release。 但貌似到现在还没出来。 mail到是有N多封了。
我以jbpm为工作流引擎实现为基础来开发一个应用系统。现在做原型,所以我有这个勇气用CR1版本。做原型目前就我一个人。
我比较想等RELEASE出来了继续开发。但是现在难道要我停滞? 唉,还是继续写代码吧。
遇到个问题。每个定义好的task如何关联到与之相对应的form去?
我用的struts2。具体说来,就是怎样让用户点击自己任务列表的一项后跳转到相应的Action去?
这个Action可能负责取出已经存在的表单数据,为接下来的用户表单页面准备数据。
开始想到了很奇怪的方法。就是task保存着Execution的实例id,然后通过这个id找到ProcessDefinition。通过ProcessDefinitionKey和task的name就可以限定到具体的某个form了。 我真是聪明啊! 但发现实现起来很困难。
看了看task的hbm,都是延迟加载的。不知道jbpm有OpenSessionInView的模式支持吗?
不知道。我把问题想复杂了?是的。看了Task接口,发现有getForm这个方法。太帅了。可以getForm。然后看了TaskImpl(对应于jbpm4_task表),果然有Form字段。
我猜这个应该就是jbpm4让你去绑定页面地址的吧。于是乎,添加form属性到某个task:
<task assignee="#{ren}" g="120,24,92,52" name="aTask" form="/XXX/x_ni.action"> <transition g="-50,-29" name="to YYY" to="yyy"/> </task>
发现jpdl-4.0.xsd里没定义这个form。所以咱的jpdl,就有小红点点了。(看这里,看这里:))。
不过不影响最终的效果。发布还是可以的。不信你自己试试。
有了form,咱就可以这样写页面了:
<a href="<%=request.getContextPath()%>${task.form}">查看任务</a>
这样做了以后,用户点击一个具体的task后,就可以导到专为这个task定制的表单(form)去了
那么,我是怎么知道没问题的呢?因为我发现在JpdlParser中,会有parseTaskDefinition这个方法。
这个方法的实现会创建一个TaskDefinitionImpl,然后:
String form = XmlUtil.attribute(element, "form"); taskDefinition.setForm(form);
那么,你肯定会想,这个TaskDefinitionImpl和TaskImpl肯定有某种暧昧的关系了。是的,你答对了。
在JpdlExecution中有:
public TaskImpl createTask(TaskDefinitionImpl taskDefinition) { DbSession dbSession = Environment.getFromCurrent(DbSession.class); TaskImpl task = (TaskImpl) dbSession.createTask(); task.setTaskDefinition(taskDefinition); task.setExecution(this); task.setProcessInstance(processInstance); task.setSignalling(true); // initialize the name if (taskDefinition.getName()!=null) { task.setName(taskDefinition.getName()); } else { task.setName(getActivityName()); } task.setDescription(taskDefinition.getDescription()); task.setPriority(taskDefinition.getPriority()); task.setForm(taskDefinition.getForm()); // save task so that TaskDbSession.findTaskByExecution works for assign event listeners dbSession.saveTask(task); ............ }
这就是暧昧的关系。
还有,我是怎么知道这些类之间的关系呢?
我先看到jbpm.task.hbm.xml的。里面会涉及到TaskImpl。TaskImpl会实现Task接口。然后我就在想这些类是什么时候创建的。于是在eclipse右键(点在TaskImpl这个类上),然后Open Call Hierarchy。 然后会在eclipse下方出现一个Call Hierarchy窗口,自己慢慢看,慢慢点吧。(new Task() -> createTask()->createTask(TaskDefinitionImpl))
不知道大家有没有更好的方法来看这些代码?如果我的方法,你能用到。那我真是万分荣幸!