Выполнять периодические задачи, используя таймер с другим интервалом, как и предполагалось - PullRequest
0 голосов
/ 04 марта 2010

Я вынужден выполнять периодическое задание, используя таймер, который вызывается с другим интервалом, в течение которого я хотел бы выполнить это задание.

Обратите внимание, что тайм-аут не происходит 100% точно; то есть тайм-аут (javax.ejb.Timer timer) в приведенном ниже коде может вызываться с интервалами 100, 98, 105 мс и т. д.

Итак, я придумал это, что-то вроде. Но иногда задание будет выполнено дважды до истечения заданного интервала, или интервал станет немного длиннее, чем я намереваюсь.

У тебя есть идея получше, чем эта? (Код - это упрощенный псевдокод, будет использоваться в контейнере EJB)

import javax.annotation.Resource;
import javax.ejb.Timeout;
import javax.ejb.Timer;
import javax.ejb.TimerService;

public class TimerBean {
    private static final long TASK_INTERVAL = 1530;
    private static final long TIMEOUT = 100;

    @Resource
    private TimerService timerService;


    public void startTimer() {
        timerService.createTimer(100, TIMEOUT, null);
    }

    @Timeout
    public void timeout(javax.ejb.Timer timer) {
        if(isApproxTime(timer, TASK_INTERVAL)){
            //do stuff
        }
    }

    private boolean isApproxTime(Timer timer, long targetInterval) {
        long modulus = timer.getNextTimeout().getTime() % targetInterval;
        return modulus < TIMEOUT;
    }
}

РЕДАКТИРОВАТЬ: Я хотел бы избежать состояния, отличного от ejb.Timer, поэтому сохранение времени последнего вызова не вариант.

Ответы [ 2 ]

1 голос
/ 04 марта 2010

Это действительно странные требования. Но какого черта.

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

В вашем коде нет четкого представления о том, насколько вы контролируете вещи. Например, есть ли окно TIMEOUT, которое вы можете указать? Или вам продиктовано одно значение, и вы вообще не можете его контролировать?

Если это позднее (никакого контроля над ним вообще), то то, что вы собрали, - это почти все, что вы можете сделать. Я лично отодвинул бы назад HARD с требованием не хранить состояние в этом бине. Состояние, о котором идет речь, вовсе не является постоянным или чем-то еще, что может сделать это проблемой.

0 голосов
/ 04 марта 2010

Кварц должен дать вам более точные и более управляемые таймеры

...