2013-09-26 34 views
1

我在jBPM中有一些进程,我测试单元测试(发送事件,检查节点是否触发等)。操纵jBPM 5.4时间模拟计时器事件

KnowledgeBuilder knowledgeBuilder = KnowledgeBuilderFactory.newKnowledgeBuilder(); 
knowledgeBuilder.add(ResourceFactory.newClassPathResource("process.bpmn"), ResourceType.BPMN2); 
knowledgeBase = knowledgeBuilder.newKnowledgeBase(); 
session = knowledgeBase.newStatefulKnowledgeSession(); 
.... 

在一些过程中有固定的定时器(例如3周)。有没有可能操纵jbpm使用的时间,以便我可以模拟这段时间已经结束了?

Btw。我不想手动触发这些笔记或修改其中的时间。

我正在使用jbpm 5.4。

回答

1

一种可能性是使用会话时钟并遍历所有实际运行定时器。

这实际上并不会改变时间,但可以用来取消定时器,定时器应该在一段时间内被触发。

例子:

public void shiftTime(long timeToShiftInMs) { 
    long targetTime = System.currentTimeMillis() + timeToShiftInMs + 10; // 10ms ahead ... 
    JDKTimerService clock = getSession().getSessionClock(); 

    List<TimerJobInstance> jobs = new ArrayList<>(); 

    for (TimerJobInstance job : clock.getTimerJobInstances()) { // go through all jobs 
     // He keeps already executed timer without nextFirTime 
     Date nextFireTime = job.getTrigger().hasNextFireTime(); 
     if (nextFireTime != null) { 
      long jobTime = nextFireTime.getTime(); 
      if (targetTime > jobTime) { // look if it should be fired after this time 
       jobs.add(job); 
      } 
     } 
    } 

    for (TimerJobInstance job : jobs) { 
     job.getJob().execute(job.getJobContext()); 
     clock.removeJob(job.getJobHandle()); 
    } 
} 
+0

不正是我一直在寻找,但测试用例的至少一部分可以覆盖这个解决方案 – Marcel