游戏中的作业调度!框架

Posted

技术标签:

【中文标题】游戏中的作业调度!框架【英文标题】:Job-Scheduling in Play! Framework 【发布时间】:2012-04-30 23:50:31 【问题描述】:

我目前正在开发一个游戏驱动 (v. 1.2.4) 应用程序,用户可以在其中执行某些任务并获得奖励。这些任务需要一些能量,这些能量会随着时间的推移而补充。基本设置如下:

public class User extends Model 
    public Long energy;
    public Long maxenergy;
    public Long cooldown = Long.valueOf(300);


public class Task extends Controller 
    public static void perform(Long id) 
        User user = User.findById(id).first();

        // do some complex task here...

        user.energy--;
        user.save();
        Task.list();
    

现在我想在冷却时间(5 分钟)后补充用户的能量。假设用户有 10/10 能量点,我想在使用 5 分钟后重新填充能量点,我可以轻松地为此使用工作:

public class EnergyHealer extends Job 
    public Long id;

    public EnergyHealer(Long id) 
        this.id = id;
    

    public void doJob() throws Exception 
        User user = User.findById(id);
        user.energy++;
        if (user.energy > user.maxenergy) 
            user.energy = user.maxenergy;
        
        user.save()
    

...并在任务完成后立即在我的控制器中调用它:

new EnergyHealer(user.id).in(user.cooldown);

我的问题是,在这种情况下,作业是同时安排的,因此如果用户在执行前一个任务后 2 秒执行任务,则第一个能量点会在 5 分钟后重新填充,而后续点仅重新填充 2几秒钟后。

因此,我需要对作业进行序列化,例如,假设我有 10 个能量点中的 8 个,则应该需要 正好 10 分钟才能重新填充所有能量点。

关于相关说明:一旦达到某个阈值,用户就有不同的级别并获得完成任务的经验。他们的等级会增加,并且所有能量点都会被重新填充,无论有多少能量点在之前的等级中被使用过,因此一些工作在执行时可能已经过时了。

考虑到成千上万的用户,工作可能根本不是完美的选择,所以如果有人对如何实现所描述的场景有想法,我很乐意提供任何帮助!

【问题讨论】:

【参考方案1】:

我认为您的工作安排有误。与其在每次他们执行一个动作时启动你的工作,你应该简单地拥有一个外观或者只有在用户不存在的情况下才会启动工作的东西。

    如果作业不存在,则创建它,否则什么也不做

    那么这应该增加 1 能量,

    检查能量是否已满,如果是,结束

    如果没有,请暂停 5 分钟

    回到2

【讨论】:

韦恩,谢谢你的回答!但是,我很害怕我不明白您的解决方案,也许您可​​以提供一个简短的代码 sn-p:1)外观是什么样的以及您描述的算法是如何被触发的,以及 2)我在哪里保存跟踪用户当前的工作,例如,在收到连续请求后,如何确定是否有工作正在运行(保持状态队列等)? 所以与其调用作业,不如调用一个可以检查实体值的单例对象。该实体将用于确定您的用户是否有一个正在运行的活动作业。根据数据库是否说有作业正在运行,您的单例对象可以启动该作业。

以上是关于游戏中的作业调度!框架的主要内容,如果未能解决你的问题,请参考以下文章

作业流调度框架 oozie 使用

开源作业调度框架 - Quartz.NET - 实战使用2

业调度框架_Quartz

作业流 oozie调度框架的配置与使用

开源监控和作业调度框架 [关闭]

Quartz.net开源作业调度框架使用详解