java - 如何在一定时间后调用方法

标签 java mysql

我的本​​地主机上运行着一个 MySQL 数据库。我对该数据库有 JDBC 连接。软件代理通过 RESTful WebService 将结果放入此数据库中。我用 Java 实现了一个垃圾收集器,并希望在一段时间后执行该垃圾收集器。我的目标是表中没有太多条目。

垃圾收集器如下所示:

public void collectGarbageResults() {
    ArrayList<Integer> ids = new ArrayList<Integer>();
    ResultSet rs = this.execQuery("SELECT * FROM results");
    try {
        while (rs.next()) {
            if ( (System.currentTimeMillis()) - (Timestamp.valueOf(rs.getString("tmstmp")).getTime()) > Long.parseLong(appconfigs.get("resultstableactuality")) ) {
                ids.add(rs.getInt("id"));
            }
        }

        for (Integer i : ids) {
            this.deleteResultsWhereId(i);
        }           
    } catch (Exception ex) {
        ex.printStackTrace();
    }
}

我调用的方法如下:

private void deleteResultsWhereId(int id) {
    retint = this.updateQuery("DELETE FROM results WHERE id=" + id + ";");
}

我在 Eclipse 的动态 Web 项目中使用 JSF,这些方法是在托管 bean 中实现的。我将把间隔存储在一个 XML 文件中,用于应用程序的配置。通过变量 appconfigs,我调用方法“get”并请求包含我的时间间隔的节点。

现在我的问题:

如何在我的 WebApp 中在一段时间后调用垃圾收集器的方法?

如果您有任何疑问,请随时发表评论。

My Solution :

@WebListener
public class BackgroundJobManager implements ServletContextListener{

    private ScheduledExecutorService scheduler;

    @Override
    public void contextInitialized(ServletContextEvent event) {
        long delayToStart   = 0;
        long numberOfUnits  = 60;
        TimeUnit tu = TimeUnit.SECONDS;
        scheduler = Executors.newSingleThreadScheduledExecutor();
        scheduler.scheduleAtFixedRate(new ExecuteGarbageCollector(), delayToStart, numberOfUnits, tu);
    }

    @Override
    public void contextDestroyed(ServletContextEvent event) {
        scheduler.shutdownNow();
    }

}

我调用的类实现了 Runnable,如下所示:

public class ExecuteGarbageCollector implements Runnable{

    @Override
    public void run() {
        DAO dao = new DAO();
        dao.collectGarbageResults();
    }

}

最佳答案

您可以使用ScheduledExecutorServiceQuartz

Quartz有很多设施,但是If you choose ScheduledExecutorService you don't have to add any new dependencies to your project.由于您只想要这个计划任务,所以很简单。

 ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor();
  scheduler.scheduleAtFixedRate(...);

看看关于这两者的一些评论:Quartz vs. ScheduledExecutorService in Java web application

关于java - 如何在一定时间后调用方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28072375/

相关文章:

mysql - Bash 和 MySQL 变量错误

mysql - 将 MySQL 转储导入特定表空间

java - 监控页面的变化?

java - FocusPanel 事件仅在边缘发生?

java - 在 Android 上请求发帖时出现问题

java - Android studio - 无法完成 gradle 执行 - 打开 zip 文件时出错

mysql - 必须定义参数 '?'

mysql - 如何在 SELECT 子句中命名列别名后立即使用它?

php - 使用 PHP 显示存储在 mySQL 数据库中的图像

java - 试图停止执行2秒钟