jbpm4 cr1 form

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))

 

不知道大家有没有更好的方法来看这些代码?如果我的方法,你能用到。那我真是万分荣幸!

 

 

你可能感兴趣的:(eclipse,xml,工作,qq,jbpm)