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

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 に答える