【发布时间】: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();
}
}
【问题讨论】: