2

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);
 }
}
4

1 に答える 1

2

いいえ、できません。はFacesContext、URLがのURLパターンと一致し、FacesServletそれを呼び出したHTTPサーブレットリクエストに関連付けられたスレッドでのみ使用できます。代わりに、その構造にを渡すだけSiteMapGeneratorですScheduler

public class Scheduler {

    private SiteMapGenerator sitemap;

    public Scheduler(SiteMapGenerator sitemap) {
        this.sitemap = sitemap;
    }

    // ...
}

SiteMapGenerator、作成している時点で確実に利用できますScheduler


具体的な問題とは関係なく、 JavaEETimerTaskアプリケーションで使用することは強くお勧めしません。タイマーを使用してスケジュールされたタスクについては、JSFマネージドBeanでのスレッドの生成も参照してください。

于 2011-12-07T22:31:33.403 に答える