に送信されるタスクを制御/制限する方法はExecutorService
?SMSメッセージをSMSTask
送信するものがあり、エグゼキュータを制御して、最大Nメッセージ/秒しか送信できないようにする必要があります。
質問する
4198 次
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 に答える