jbpm中join的setDiscriminator(true)问题

fengshujuan 2007-05-15
JbpmConfiguration config1 = JbpmConfiguration.getInstance();
JbpmContext ctx = config1.createJbpmContext();

Node node = processInstance.getProcessDefinition().getNode("Join_Request");
Join join_Request = (Join)node;
join_Request.setDiscriminator(true);

并且在最后调用了
ctx.save(processInstance);
ctx.save(taskInstance);
ctx.close();

我在程序中调用了上述代码,按道理讲,只要有一个分支到达join,就会引起流程向下流转,可是在实际的实践中我发现,join还是默认的等待 所有分支到达。
难道我忘了save什么?还是我的代码有问题?
fengshujuan 2007-05-18
这个问题解决了,感谢“吴大愚”的帮助和指点。
解决办法为:
看src/java.jbpm/org.jbpm.graph.node.Join.hbm.xml文件,会发现里面没有有关isDiscriminator的说明。也就是说join节点保存的时候不会保存这个信息。
   join_Request.setDiscriminator(true);这条语句应该是在你的流程实例运行到join节点前设置,而不是在一开始的时候设置,不然当运行到join节点的时候从数据库中重新读取join节点的实例的isDiscriminator应该还是默认值false。
我在流程定义文件中加入了
<join name="join" >
<event type="node-enter">
<script>
org.jbpm.graph.node.Join join= (org.jbpm.graph.node.Join)node;
join.setDiscriminator(true);
</script>
</event>
<transition to="end" />
</join>

oisiv 2007-05-22
我也采用类似方法
<join name="并发完成">
<event type="node-enter">
<action name="并发设置" class="tw.com.erpsoft.glm.workflow.action.SetDiscriminatorForJoinNodeActionHandler"></action>
</event>
<transition name="并发完成" to="完成"></transition>
</join>
不过,发现流程虽然完成了,但另外分支的任务对象依然存在,没有被取消。该任务的所属用户依然可以看到该任务。
noodledai 2007-06-12
oisiv 写道
我也采用类似方法
<join name="并发完成">
<event type="node-enter">
<action name="并发设置" class="tw.com.erpsoft.glm.workflow.action.SetDiscriminatorForJoinNodeActionHandler"></action>
</event>
<transition name="并发完成" to="完成"></transition>
</join>
不过,发现流程虽然完成了,但另外分支的任务对象依然存在,没有被取消。该任务的所属用户依然可以看到该任务。



我也有这种问题出现,请问有哪位大侠给指示一下啊?
youngliuus 2007-06-14
  从Token的代码来看,他的确会将它上面的所有任务,和所有子Token上的任务设置为cancel状态啊。
  冒昧的问一句,你在显示任务列表是是否有condition iscancelled_=0?
gsccnu 2007-06-15
我最近想通过fork和join做一个互斥的例子,已经有了一部分思路。
但是看到join时,有点困惑,
// write to all child tokens that the parent is already reactivated
          Iterator iter = parentToken.getChildren().values().iterator();
          while ( iter.hasNext() ) {
            ((Token)iter.next()).setAbleToReactivateParent( false );
          }
这里只是将childToken的一个属性设置为false,我还不知道它是如何将所有childToken结束掉的,还有楼上所说的设置Task cancel部分,能否告诉这部分代码在什么地方?
youngliuus 2007-06-15
Token的end方法会调用cancelTaks;我的是3.1.2的版本。在Token.java,line214.

同样在这个end方法中,
      // end all this token's children
      if (children != null) {
        Iterator iter = children.values().iterator();
        while (iter.hasNext()) {
          Token child = (Token) iter.next();
          if (!child.hasEnded()) {
            child.end();
          }
        }
      }
会结束childToken.
gsccnu 2007-06-15
非常感谢你的回答。
我想到我的问题在出哪里了,由于我在实验时,join下直接就是end state。
所以我想,在join中,可能只是做了setAbleToReactivateParent( false )。但是当parantToken到达end state时,由于自身被end所以同时end了其他childToken。
现在我条件有限,晚上我会在join和end state间加上task node。

另外,我在Token的end中没有看到cancelTask。而且,在TaskInstance中的cancel method是下面这样的

public void cancel() {
    this.isCancelled = true;
    this.isOpen = false;
    end();
  }
如果TaskInstance的isOpen被设置成false,那么用户就不应该还能看见该TaskInstance了。望赐教.....
Global site tag (gtag.js) - Google Analytics