我想每分钟执行一次对特定方法的调用,并且应该在服务器启动时调用它。这应该是一个单独的线程。
我尝试使用CRON作业,但我遇到了一些问题。
我有什么方法可以实现它
答案 0 :(得分:4)
使用ExecutorServices ...
Executors.newSingleThreadScheduledExecutor().scheduleAtFixedRate( new Runnable()
{
@Override
public void run()
{
// call your method here
}
}, 0, 1, TimeUnit.MINUTES );
答案 1 :(得分:2)
对于类似的任务,我使用的是Quartz调度程序。这是非常容易使用。我的间隔时间大于一分钟,但这并不重要。 您可以选择指定调度程序将在配置文件中使用的线程数。
答案 2 :(得分:2)
如果您正在使用JBoss(也可能适用于其他AS,我没有相关数据),您可能需要尝试捆绑的quartz scheduler。它提供非常精细的作业控制。您不必使用捆绑版本,并且可以将其作为您选择的AS的依赖项自由使用。
答案 3 :(得分:2)
您可以使用Spring Tasks轻松地使用注释来实现此目的。它们位于上下文罐中,因此您不必添加任何新的罐来实现此目的。
在appContext中添加(相应地调整池大小):
<task:annotation-driven executor="myExecutor" scheduler="myScheduler"/>
<task:executor id="myExecutor" pool-size="2"/>
<task:scheduler id="myScheduler" pool-size="2"/>
您还需要引入适当的命名空间:
xmlns:task="http://www.springframework.org/schema/task"
完成所有这些操作后,您应该能够只注释要调用的方法。由于您希望每分钟调用一次方法,因此您应该使用fixedRate:
@Scheduled(fixedRate=60000)
这样做会强制调用在启动时运行,之后每分钟运行一次。您可能看到的时间以毫秒为单位。
答案 4 :(得分:0)
每分钟执行一个特定的方法?这听起来像你需要一个Timer。有关详细信息,请查看this article。 Timer在后台线程执行该方法 - 为什么在主线程中执行该方法很重要?
答案 5 :(得分:0)
class DemoThread extends Thread {
public void run() {
while(true) {
try {
sleep(60000);
}
catch(InterruptedException e) {
}
// call some random method here
}
}
}
初始化线程并运行它。
DemoThread thread = new DemoThread();
thread.start();