2012-04-03 4 views
2

要約:@PreDestroyをApplication ScopeマネージドBeanのリサイクル\タイムアウト時にトリガーする方法を知っている人はいますか?Xpages @PreDestroy

私は、「スケジュールされたエージェント」について数週間前質問投稿:すべてのロジックがデザインの中に含まれるよう30 sec periodic task to poll external web service and cache data ...私はこれまでスレッドを使用して正常に実装(現時点ではこの方法で行ってきましたアプリケーションスコープのバッキングBeanからスレッドを\ cancel \ pause \ restartを再起動することができます。しかし、副作用は、スレッドを開始するバッキングBeanがリサイクルされるとき、スレッドは実行を継続するということです。アプリケーションスコープBeanで@PreDestroyを使用してキャンセルスレッドメソッドを呼び出すメソッドがありますが、呼び出されないようです。

私はこのリンクをIBMから見つけました: LO67255:MANAGED BEANS ANNOTATION - @POSTCONSTRUCTと@PREDESTROYは期待通りに動作していません。 http://www-01.ibm.com/support/docview.wss?crawler=1&uid=swg1LO67255 ...しかし、私はその記事にアクセスするためのアクセス権がありませんので、結果が...動作しないかどうかはわかりません。

非常に簡単なテストクラスがあることを実証するために、ここに最後の投稿があるため、上にいくつかの冗長なライブラリをインポートしました:https://community.jboss.org/thread/179819がXPageのjavax.enterprise。*にアクセスできません。

私はテストのためにDB XPageのプロパティ "Application Timeout"に "recycling"を1に設定しました。単純なページ呼び出し(以下を参照)で... 1分待っていると、コンストラクタが起動しているのを見ることができますが、@PreDestroyとPostConstructは決して呼び出されません。

コメントや提案については...事前に感謝します。

ニック

import javax.annotation.*; 
import java.util.Date; 
import javax.annotation.PreDestroy; 

import javax.faces.context.*; 
import javax.faces.lifecycle.*; 


public class Junk { 

    public Junk(){ 
     System.out.println("Junk.constructor()"); 
    } 


    @PostConstruct 
    public void afterOpen(){ 
     System.out.println("Junk.afterOpen() Resource after open..."); 
    } 

    /** 
    * 
    * @return 
    */ 
    public String getJunkDate(){ 
     String res = ""; 
     Date d = new Date(); 
     try{ 

      System.out.println("Junk.getJunkDate()==e"); 

      res = d.toLocaleString(); 

     }catch(Exception e){ 
      e.printStackTrace(); 
     } 
     return res; 
    } 


    @PreDestroy 
    public void destroy(){ 
     System.out.println("Junk.destroy()...!"); 
    } 

    public void finalize(){ 
     System.out.println("Junk.finalize()...!"); 
    } 


} 

<?xml version="1.0" encoding="UTF-8"?> 
<xp:view xmlns:xp="http://www.ibm.com/xsp/core"> 

    <xp:panel id="panel1"> 
     <xp:button value="Label" id="button1"> 
      <xp:eventHandler event="onclick" submit="true" 
       refreshMode="partial" refreshId="panel1"> 
      </xp:eventHandler> 
     </xp:button> 
     <xp:br></xp:br> 
     <xp:text escape="true" id="computedField1" value="#{javascript:Junk.junkDate}"> 
     </xp:text></xp:panel> 
</xp:view> 

答えて

4

手動(管理対象Beanを含む)の範囲内に格納されたオブジェクトをクリーンアップするための機会を提供JSFリスナーの成果物の3つのタイプがあります

  1. FacesContextListener:そのbeforeContextReleased()メソッドは、前 絶対最後の呼び出しでは、すべての要求が終了するので、これは requestScopeをクリーンアップするのに理想的な場所です。
  2. SessionListener: sessionDestroyed()メソッドは、 sessionScopeをクリーンアップする機会を提供します。
  3. ApplicationListener:そののapplicationDestroyed()メソッドは、 applicationScopeををクリーンアップする機会を提供します。

ApplicationListenerは、OSGi XSP Libraryで定義する必要があります。最初の2つはライブラリ内で定義することも、特定のNSFにローカルで定義することもできます。

+0

コメントするビットがありますが、感謝のTim。 –

3

私は間違っているかもしれないが、マネージドBeanの注釈のみJSF2.0から入手している間のXPagesは、JSF1.2に基づいて構築されています。

関連する問題