【问题标题】:How To Call A Method After A Certain Period如何在一段时间后调用方法
【发布时间】:2015-03-20 06:38:40
【问题描述】:

我有一个 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 中调用垃圾收集器的方法?

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

我的解决方案:

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

}

【问题讨论】:

    标签: java mysql


    【解决方案1】:

    您可以使用ScheduledExecutorServiceQuartz

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

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

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

    【讨论】:

    • 我接受了您的回答,因为这两个选项都有效。我还不知道如何将它们包含到我现有的应用程序中,但由于您的最后一个链接,我相信这将很快。谢谢!
    【解决方案2】:
    1. 查看调度程序库。例如,您可以使用Quartz
    2. Call Java from MySQL。您可以通过工作或触发器来启动它
    3. 只需坚持使用 SQL 并忽略在 Java 中运行它。如果您擅长 SQL,这可能是最简单的。然后您可以将其封装在 SPROC 或触发器中。

    您可以选择它应该存在于您的网络应用程序中还是您的数据库中。我已经使用这两种方法来执行定时 SQL 调用,并且倾向于使用面向代码的方法

    【讨论】:

    • 不幸的是,我不太擅长 SQL。但我将使用 Quartz 或 ScheduledExecutorService。感谢您的努力。
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-28
      • 1970-01-01
      • 2012-04-14
      • 2019-10-29
      • 2019-03-31
      • 1970-01-01
      相关资源
      最近更新 更多