1

私は現在、ユーザーが特定のタスクを実行し、そのために報酬を得ることができる、プレイを利用した (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 分かかるはずです。

関連するメモ: ユーザーにはさまざまなレベルがあり、特定のしきい値に達すると、タスクを完了するための経験を積むことができます。それらのレベルが上がり、前のレベルでどれだけ多くのエネルギーポイントが使用されていても、すべてのエネルギーポイントが補充されるため、一部のジョブは実行されるまでに古くなる可能性があります.

数千人のユーザーを考えると、ジョブはまったく最適な選択ではない可能性があるため、説明されているシナリオを達成する方法について誰かがアイデアを持っている場合は、助けていただければ幸いです!

4

1 に答える 1

1

ジョブのスケジュールが間違っていると思います。アクションを実行するたびにジョブを開始するのではなく、ユーザーのファサードがまだ存在しない場合にのみジョブを開始するファサードなどを用意する必要があります。

  1. ジョブがまだ存在しない場合は作成し、それ以外の場合は何もしません

  2. 次に、これは1つのエネルギーを追加する必要があります。

  3. エネルギーがいっぱいかどうかを確認し、いっぱいなら終了

  4. そうでない場合は、5分間一時停止します

  5. 2に戻る

于 2012-05-01T06:11:51.127 に答える