我希望任务在1分钟的间隔后永久运行。要完成我在
中写下我的任务public void poll() {
ScheduledExecutorService executorService= Executors.newScheduledThreadPool(1);
ScheduledFuture files=executorService.scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
String path="/Desktop/PNL/Test";
List<String> filesPaths= new ArrayList<String>();
File folder= new File(path);
File[] listOfFiles= folder.listFiles();
for (File file : listOfFiles) {
filesPaths.add(file.getAbsolutePath());
}
if(!CollectionUtils.isEmpty(filesPaths)){
try{
update(filesPaths);
}
catch(Exception e){
System.out.println(e.toString());
}
}
}
}, 0, 1, TimeUnit.MINUTES);
files.cancel(false);
//executorService.shutdown();
}
但是任务只执行一次,而不是每分钟后执行一次。 我不明白这里有什么不对。
答案 0 :(得分:2)
在执行代码时,NullPointerException
导致for (File file : listOfFiles) {
导致线程被终止。
以下更改使其持续运行:
if (listOfFiles != null) {
for (File file : listOfFiles) {
filesPaths.add(file.getAbsolutePath());
}
}
此外,files.cancel(false)
结束执行。因此,不得不评论这一行。参考Future.cancel()
答案 1 :(得分:1)
测试代码。正如其他人所假设的那样,结果如下: 删除行
files.cancel(false);
让它每分钟运行一次。否则它只运行一次。
这是我的测试代码,有效:
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.TimeUnit;
public class PeriodicCall {
public static void main(String args[]) {
new PeriodicCall().poll();
}
public void poll() {
System.out.println("poll"); // called once
ScheduledExecutorService executorService = Executors.newScheduledThreadPool(1);
ScheduledFuture<?> files = executorService.scheduleAtFixedRate(new Runnable() {
public void run() {
System.out.println("running");
}
}, 0, 1, TimeUnit.MINUTES);
//files.cancel(false);
//executorService.shutdown();
}
}
我的run()函数只包含一个System.out.println,所以你应该在run()方法中检查你的代码。如果它包含错误,它将中止整个执行。
答案 2 :(得分:0)
编辑:在一个小沙箱中播放一分钟后,我重新构建了您的代码以便像这样工作
public static void main(String[] args) {
ScheduledExecutorService executorService = Executors.newScheduledThreadPool(1);
Runnable files = new Runnable() {
@Override
public void run() {
// Replace with your original code.. this was just a test to make sure it worked
System.out.println("Hello");
}
};
// Set this back to minutes, seconds was easier to test
ScheduledFuture<?> scheduledFuture = executorService.scheduleAtFixedRate(files, 0, 1, TimeUnit.SECONDS);
}
答案 3 :(得分:0)
我打赌你在Runnable中得到一个未经检查的异常。以下代码打印&#34; Running&#34;恰好一次:
run()
你应该在 @Override
public void run() {
try {
System.out.println("Running");
throw new RuntimeException("bar");
} catch (RuntimeException e) {
// Do something better here, but for the sake of highlighting the issue:
e.printStackTrace();
}
}
方法的所有内容周围放置一个try / catch块,看看你抓到了什么。
$app->group('/Admin', function () use ($app) { // crée un "groupe d'URL"
$app->get('/users', function () use ($app){
if(isset($_SESSION["type"]) && $_SESSION["type"] == "admin") {
$ctrl = new UserController();
$ctrl->listing($app);
}else{
$app->redirect($app->urlFor('indexAdmin'));
}
})
$app->get('/users', function () use ($app){
if(isset($_SESSION["type"]) && $_SESSION["type"] == "admin") {
$ctrl = new UserController();
$ctrl->listing($app);
}else{
$app->redirect($app->urlFor('indexAdmin'));
}
})