8

に送信されるタスクを制御/制限する方法はExecutorService?SMSメッセージをSMSTask送信するものがあり、エグゼキュータを制御して、最大Nメッセージ/秒しか送信できないようにする必要があります。

4

2 に答える 2

15

タスクごとに1つのSMSメッセージを作成していると仮定すると、ScheduleExecutorServiceを使用できます。

final Queue<Task> tasks = new ConcurrentLinkedQueue<Task>();
int ratePerSecond = 10;
final ExecutorService es = Executors.newCachedThreadPool();
ScheduledExecutorService ses = Executors.newSingleThreadScheduledExecutor();
ses.scheduleAtFixedRate(new Runnable() {
    @Override
    public void run() {
        final Task task = tasks.poll();
        if (task == null) return;
        es.submit(new Runnable() {
            @Override
            public void run() {
                process(task);
            }
        });
    }
}, 0, 1000/ratePerSecond, TimeUnit.MILLISECONDS);

タスクをキューに追加すると、1秒あたり10の速度で処理されます。

于 2012-11-08T14:27:10.297 に答える
4

RateLimiterグアバからお試しください。プールで実行されているすべてのタスク間で1つのインスタンスを共有する必要があります。

final RateLimiter rateLimiter = RateLimiter.create(N)

//and in your task:

rateLimiter.tryAcquire();
sendSms();

tryAcquire();N周波数を維持するために、正確に一定時間ブロックします。

参照:

于 2012-11-08T14:26:46.600 に答える