Java ScheduledExecutorService标准实践

Java ScheduledExecutorService标准实践,java,jakarta-ee,scheduledexecutorservice,Java,Jakarta Ee,Scheduledexecutorservice,我在J2EE应用程序中使用ScheduledExecutorService,每x秒从配置文件中调度一个任务,从数据库中提取数据并将其发送到外部服务器。我的代码是: try{ final ScheduledExecutorService service = Executors.newSingleThreadScheduledExecutor(); service.scheduleWithFixedDelay(new Runnable(){ public void run()

我在J2EE应用程序中使用ScheduledExecutorService,每x秒从配置文件中调度一个任务,从数据库中提取数据并将其发送到外部服务器。我的代码是:

try{
    final ScheduledExecutorService service = Executors.newSingleThreadScheduledExecutor();
    service.scheduleWithFixedDelay(new Runnable(){
    public void run(){
                RsaBaseAction rsa = RsaBaseAction.getInstance();//class that does all the work
                rsa.rsaBaseAction();
            }
          }, 0, timeInterval, TimeUnit.SECONDS);
     }
     catch(Exception ex){
         ex.printStackTrace();
     }
我的问题是我是否应该编写额外的代码?我应该写一个while循环来确保线程完成,然后执行service.shutdown,还是ScheduledExecutorService为我处理这个问题?

如果希望调度器停止调度事件,您可以调用shutdown。您不需要显式地这样做,就好像您希望它在应用程序的生命周期中运行一样。如果由于某种原因,日程安排不再合理,您将使用shutdown方法

举个例子。您正在编写一个CMS,它提供与google shopping的集成以上传产品信息。如果用户删除了他们的上传信息,即关闭了它,您可以调用shutdown来停止同步服务。

正如shutdown方法中的Javadoc清楚地说明的那样:

启动有序关机,执行以前提交的任务,但不接受新任务。如果调用已经关闭,则调用没有其他效果。 此方法不会等待以前提交的任务完成执行。使用此选项可以完成此操作

也就是说,以前的任务将要完成,没有新的任务要完成,但是,如果需要一段时间,以前的任务可能会在关机命令之后继续


至于您拥有的代码,我看不出有任何理由使用try-catch块。调度任务不会引发任何异常。如果runnable引发异常,不再调度执行,并且异常由线程组异常处理程序处理,那么您似乎希望实际尝试捕获rsaBaseAction而不是调度,谢谢。我的东西应该无限期运行,直到应用服务器停止。我只是担心内存泄漏或线程的不断繁殖。调度程序内部有一个线程用于运行代码。这就是为什么该方法被称为newSingleThreadScheduledExecutor。如果您计划了10000个可运行程序,那么所有这些都将发生在一个线程上,尽管速度很慢。我没有尝试捕获,但当任务中出现异常时,控制台中似乎没有堆栈跟踪打印,而是进入ScheduledExecutorService自己的代码中,并在那里暂停。我花了一段时间才弄明白,哈哈。我在那里放了一个钩子,看它是否会在这里被钩住