2011-02-04 14 views
8

アプリケーションスコープのマネージドBeanをリフレッシュまたはリロードする際に問題があります。これはキャッシュされたデータbeanとして動作します。したがって、データがdb側で変更されると、Bean内のリストをリロードします。 リストをリフレッシュ/リロードする方法はありますか?たとえば、指定された時間に基づいて1日1回と言いますか? ありがとうアプリケーションスコープのマネージドBeanをリフレッシュ/再ロードする

答えて

14

ちょうどそのことを行う適用スコープのBeanにメソッドを追加してください。

public void reload() { 
    list = dao.list(); 
} 

次に、このBeanを別のBeanに取り込み、メソッドを呼び出します。

data.reload(); 

更新申し訳ありませんが、私は "一日一回" ビットを見落とし。あなたはバックグラウンドでの自動リロードを意味しますか?これは、ScheduledExecutorServiceによって管理されるバックグラウンドスレッドによって実現するのが最善です。 ServletContextListenerが好きな作成することは、次のとおりです。このようなクラスReloader外観は

public class Reloader implements Runnable { 

    private ServletContext context; 

    public Reloader(ServletContext context) { 
     this.context = context; 
    } 

    @Override 
    public void run() { 
     Data data = (Data) context.getAttribute("data"); 
     if (data != null) { 
      data.reload(); 
     } 
    } 

} 
+0

(マネージドBean名がdataであると仮定して)

@WebListener public class Config implements ServletContextListener { private ScheduledExecutorService scheduler; @Override public void contextInitialized(ServletContextEvent event) { Reloader reloader = new Reloader(event.getServletContext()); scheduler = Executors.newSingleThreadScheduledExecutor(); scheduler.scheduleAtFixedRate(reloader, 1, 1, TimeUnit.DAYS); } @Override public void contextDestroyed(ServletContextEvent event) { scheduler.shutdownNow(); } } 

おかげで多くのことを@BalusC – leo

+1

どういたしまして。しかし、あなたはサーブレット・コンテナでスレッドを自分で管理することに非常に注意する必要があります。 'contextDestroyed()'の 'scheduler.shutdownNow();'ビットは非常に重要です。スレッド管理ジョブがサポートされている場合は、スレッド管理ジョブをサーブレットコンテナに委任することを検討することもできます。 JBossにはこのためのQuartzがあります。例えば、Glassfishにはこのための 'WorkManager'があります。 Tomcatでは、上記の例が最善の策です。 – BalusC

+0

@BalusC私は同じ必要があります。私は私のアプリケーションでこれを実装しました。唯一の問題は、 'Reloader'メソッド' run() 'でBeanが常にnullであることです。あなたは私にヒントをくれますか? – leostiw

関連する問題