JSF1.2 / ADF Webアプリで、コンテンツが毎日変更される数百ページのWebサイトのサイトマップを定期的かつ動的に生成する機能を作成しようとしています。キャッチは、サイトマップのベースとして使用するためにアプリケーションからいくつかの構成を読み取る必要があることです。そのためには、FacesContextが必要です。
これが私がやろうとしたことです:ServletContextListenerを実装し、アプリケーションスコープのBeanをインスタンス化するクラスを作成しました。このBeanは、FacesContextを使用してsitemap.xmlを作成するための手間のかかる作業を行います。アプリケーションスコープからBeanにアクセスし、サイトマップメソッドを呼び出し、将来の発生をスケジュールするTimerTaskを拡張するクラスを作成しました。アプリケーションを実行すると、ServletContextListenerを実装するクラスが起動し、Beanが作成されたように見えますが、TimerTaskを拡張するクラスは起動されません。どんな助けでもいただければ幸いです。ご不明な点がございましたら、お気軽にお問い合わせください。
これが私のコードサンプルです:
public class WebhomesApplicationContextListener implements ServletContextListener {
private static final String attribute = "SiteMapGenerator";
public void contextInitialized(ServletContextEvent event) {
SiteMapGenerator myObject = new SiteMapGenerator();
event.getServletContext().setAttribute(attribute, myObject);
}
public void contextDestroyed(ServletContextEvent event) {
SiteMapGenerator myObject = (SiteMapGenerator) event.getServletContext().getAttribute(attribute);
event.getServletContext().removeAttribute(attribute);
}
}
public class SiteMapGenerator {
public void generateSitemap() {
// code to generate map...
}
}
public class Scheduler extends TimerTask {
public void run() {
SiteMapGenerator sitemap = (SiteMapGenerator)FacesContext.getCurrentInstance().getExternalContext().getApplicationMap().get("SiteMapGenerator");
sitemap.generateSitemap();
}
}
class MainApplication {
public static void main(String[] args) {
Timer timer = new Timer();
timer.schedule(
new Scheduler(),
1000 * 60);
}
}