一段时间后如何调用方法

时间:2015-01-21 16:40:55

标签: java mysql

我的localhost上运行了一个MySQL数据库。对于这个数据库,我有JDBC连接。在RESTful WebService上,softwareagent将结果放入此数据库。我在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的Dynamic Web Project中使用JSF,这些方法在托管bean中实现。我将间隔存储在XML文件中,我将其用于我的应用程序配置。在变量appconfigs上,我调用方法'get'并询问包含我的间隔的节点。

现在我的问题:

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

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

  

我的解决方案:

@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();
    }

}

3 个答案:

答案 0 :(得分:2)

您可以使用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

中查看有关两者的一些评论

答案 1 :(得分:1)

  1. 查看调度程序库。例如,您可以使用Quartz
  2. Call Java from MySQL。您可以通过工作或触发器启动
  3. 坚持使用SQL并忽略在Java中运行它。如果你擅长SQL,可能是最简单的。然后,您可以将其封装在SPROC或触发器中。
  4. 您的选择是应该存在于您的网络应用程序还是数据库中。我已经使用这两种方法来执行定时SQL调用,并倾向于选择面向代码的方法

答案 2 :(得分:1)

实际问题可能是在特定时间间隔后如何调用函数? 看一眼 : How to call a method after some specific interval of time in Javajava: run a function after a specific number of seconds