1

我在 jBPM 中有一些流程,我使用单元测试(发送事件、检查节点是否被触发等)进行测试。

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

在某些流程中,有固定的计时器(例如 3 周)。是否有可能操纵 jbpm 正在使用的时间,以便我可以模拟这段时间已经结束?

顺便提一句。我不想手动触发这些笔记或修改其中的时间。

我正在使用 jbpm 5.4。

4

1 回答 1

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());
    }
} 
于 2013-09-30T14:43:44.703 回答