2013-09-26 3 views
1

단위 테스트 (이벤트 전송, 노드가 트리거되는지 확인)로 테스트하는 jBPM의 일부 프로세스가 있습니다.manipule 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

관련 문제