任务:运行 每 x 分钟执行一组操作

Tasking : Run a set of actions every x minutes

我必须处理 Twitter 中的速率限制 API

为了不被屏蔽,我选择使用任务

我想知道是否有任何方法可以每 x 分钟执行一组操作(调用不同的方法)

比如我每15分钟可以发出80个请求。假设我必须调用方法 a() 和 b() ;分别是120次和80次

我必须完成任务:

a() 被调用:80 次 ...等待 15 分钟 a() 被调用:40 次 b() 被调用:40 次 ...等待 15 分钟 b() 被调用:40 次

您可以使用 Java EE Con​​ccurency Utilities ManagedScheduledExecutorService API.

完成此操作

您有两种适用于您的用例的方法:

  1. scheduleAtFixedRate(Runnable r, long initDelay, long period, TimeUnit unit)
  2. scheduleWithFixedDelay(Runnable r, long initDelay, long period, TimeUnit unit)

这两者之间的唯一区别是 scheduleAtFixedRate 将 运行 每 period TimeUnit's。而 scheduleWithFixedDelay 将 运行 period TimeUnit 的 之前的执行完成之后。因此,如果您的任务 运行 非常快,那么这两种方法本质上是相同的。

注意: API 是在 Java EE 7 中引入的。如果你在 运行 EE 6 或更低版本上使用,请使用Java SE 的 ScheduledExecuorService 代替。

在JavaEE环境下获取实例:
注入它:

@Resource
ManagedScheduledExecutorService scheduledExec;

或查找:

ManagedScheduledExecutorService scheduledExec = 
    (ManagedScheduledExecutorService) new InitialContext.lookup(
        "java:comp/DefaultManagedScheduledExecutorService");

使用方法:

// Sample runnables
// Call a() 80 times
Runnable a = new Runnable(){
    public void run() {
        for(int i = 0; i < 80; i++)
            a();
    }
};
// Call b() 120 times
Runnable b = new Runnable(){
    public void run() {
        for(int i = 0; i < 120; i++)
            b();
    }
};

// Submit and run.  Will repeat every 15 minutes until cancelled
scheduledExec.scheduleWithFixedDelay(a, 0, 15, TimeUnit.MINUTES);
scheduledExec.scheduleWithFixedDelay(b, 0, 15, TimeUnit.MINUTES);

// scheduleWithFixedDelay also returns a ScheduledFuture,
// which can be used to monitor and cancel your tasks
ScheduledFuture<?> future = managedExec.scheduleWithFixedDelay(...);
future.cancel(true);