我正在尝试在java中编写守护程序服务作业。这项服务将每分钟运行一次。
但我无法通过使用ExecutorService来实现这一点,我不知道这是否正确。以下是我的代码段:
public void startService() {
try {
ExecutorService service = Executors.newFixedThreadPool(3);
for (;;) {
service.submit(new Service1()); // this will send some set of emails
service.submit(new Service2()); // this will send some set of emails
service.submit(new Service3()); // this will send some set of sms
}
service.shutdown(); // It says Unreachable code so when should i shutdown the service
service.awaitTermination(1, TimeUnit.MINUTES);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
答案 0 :(得分:4)
首先,您需要查看ScheduledExecutorService及其实现。此服务允许您安排作业以预定义的频率运行。这是简短的答案。至于实施细节,有太多的未知数可以为您提供实用的建议。您希望程序在容器(Web或Application Server)中运行,还是作为具有域线程的Standalone运行?你在Unix / Linux上运行(所以可以使用Cron作业调度程序)还是Windows?其中一个调度程序选项可能是quartz-scheduler。我希望这会有所帮助。
答案 1 :(得分:3)
您的for
loop没有结束条件:for(;;)
,并且没有中断语句。
所有代码 此循环之后的所有代码无法访问。
你必须在循环中等待1分钟 ,而不是等待(因为循环后的代码永远不会被运行)。
保持你的synthax,我想它应该是:
for (;;) {
service.submit(new Service1()); // this will send some set of emails
service.submit(new Service2()); // this will send some set of emails
service.submit(new Service3()); // this will send some set of sms
service.shutdown();
service.awaitTermination(1, TimeUnit.MINUTES);
}
答案 2 :(得分:1)
这里:
for (;;) {
service.submit(new Service1()); // this will send some set of emails
service.submit(new Service2()); // this will send some set of emails
service.submit(new Service3()); // this will send some set of sms
}
是无限循环;它不断向你的线程池提交新的工作......每分钟一次,但每次迭代一次。你必须慢化你的循环!
我不确定你要求的是什么,但你应该简单地删除那个循环结构;或者更可能的是,做一些事情:
while (true) {
service.submit(new Service1()); // this will send some set of emails
service.submit(new Service2()); // this will send some set of emails
service.submit(new Service3()); // this will send some set of sms
Thread.sleep( 1 minute );
}
或类似的东西。