Java:addScheduledJobAfterDelay() - 我可以强制计划作业启动吗?

时间:2010-05-05 14:24:09

标签: java red5 ischedulingservice

我正在开发一款扑克游戏。在投注阶段,我使用Red5 iSchedulingService创建一个预定作业,该作业将每8秒运行一次,以转发给下一个玩家下注。现在,如果用户在8秒结束前下注,我想手动强制下一个预定作业开始。

有没有办法强制计划作业在需要时立即启动?

2 个答案:

答案 0 :(得分:1)

您可以使用Executors执行此操作。有更清晰的实现,但这是一个基本的东西,使用FutureCallable做你想做的事。

// wherever you set up the betting stage
ScheduledExecutorService bettingExecutor = 
    Executors.newSingleThreadScheduledExecutor();

ScheduledFuture<?> future = bettingExecutor.schedule(new BettingStage(), 8,
    TimeUnit.SECONDS);

//...

// in the same class (or elsewhere as a default/protected/public class)
private class BettingStage implements Callable<ScheduledFuture<?>> () {
    public ScheduledFuture<?> call() thows ExecutionException {
        ScheduledFuture<?> future = bettingExecutor.schedule(new BettingStage(), 8, 
            TimeUnit.SECONDS);
        // betting code here
        boolean canceled = future.cancel(false); // cancels the task if not running yet
        if(canceled) {
             // run immediately
             future = bettingExecutor.schedule(new BettingStage(), 
                0, TimeUnit.SECONDS)
        }
        return future;
    }
}

答案 1 :(得分:1)

我在这个帖子中开始的具体问题的答案:

我无法强制启动预定作业,但我可以做的是删除预定作业并以0秒的延迟开始新作业。

addScheduledJobAfterDelay()返回表示作业ID的字符串。我可以用它来删除预定的工作。问题是没有办法知道我是否打断了预定的工作。执行人确实提供了这些信息。这就是为什么Executors在这个特定情况下是更好的选择,然后使用red5调度服务。

如何删除预定作业(red5):

ISchedulingService scheduler = (ISchedulingService) getScope().getContext().getBean(ISchedulingService.BEAN_NAME);
     scheduler.removeScheduledJob("ScheduleJobString");

字符串ScheduleJobString应替换为您从创建作业时收到的字符串:

String scheduleJobString = scheduler.addScheduledOnceJob(DelayInSeconds*1000,new MyJob());