манипулировать временем jBPM 5.4 для имитации событий таймера

У меня есть несколько процессов в jBPM, которые я тестирую с помощью модульных тестов (отправка событий, проверка, запущены ли узлы и т. д.).

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

В некоторых процессах есть фиксированные таймеры (например 3 недели). Есть ли возможность манипулировать временем, которое использует jbpm, чтобы я мог смоделировать, что этот период времени уже закончился?

Кстати. Я не хочу запускать эти заметки вручную или изменять в них время.

Я использую jbpm 5.4.


person Marcel    schedule 26.09.2013    source источник


Ответы (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());
    }
} 
person Robert Kubiak    schedule 30.09.2013
comment
не совсем то, что я искал, но, по крайней мере, часть тестовых случаев можно покрыть этим решением - person Marcel; 01.10.2013