2012-04-03 62 views
2

摘要:没有人知道如何获得@PreDestroy以触发回收\应用程序作用域管理bean的超时?Xpages @PreDestroy

我张贴的问题,几个星期前,关于“计划代理”:30 sec periodic task to poll external web service and cache data ......这是我成功实施至今使用线程(目前用这种方法去为所有的逻辑包含的设计中数据库),我可以开始\取消\暂停\成功从我的应用程序范围支持豆重新启动线程。但是副作用是当启动线程的支持bean被回收时,线程继续运行。我有一个方法,在我的应用程序作用域bean中使用@PreDestroy调用我的取消线程方法,但看起来没有被调用。

我确实从IBM找到这个链接: LO67255:管理的豆类注释 - @POSTCONSTRUCT和@PREDESTROY不能按预期工作。 http://www-01.ibm.com/support/docview.wss?crawler=1&uid=swg1LO67255 ...但我无法访问该文章,所以我不确定结果是...它不起作用。

我有一个非常简单的测试类来演示,我在上面导入了一些冗余库,因为在这里找到的最后一个帖子是:https://community.jboss.org/thread/179819,但无法访问XPages中的javax.enterprise。*。

为了测试目的,我将DB XPage属性“Application Timeout”中的“回收”设置为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

有三种JSF侦听文物,提供了一个机会手动清理存储范围的对象(包括托管Bean)的:

  1. FacesContextListener:其beforeContextReleased()方法是前 绝对的最后一次通话任何请求都会终止,所以这是清理requestScope的理想场所。
  2. SessionListener:其 sessionDestroyed()方法提供了清理sessionScope的机会。
  3. ApplicationListener:它的applicationDestroyed() 方法提供了清理applicationScope的机会。

ApplicationListener必须定义在OSGi XSP Library;前两种可以在库中定义,也可以在特定的NSF中定义。

+0

有点评论,但谢谢蒂姆。 – 2012-04-19 15:38:08

3

我可能是错的,但中使用XPages是基于JSF1.2建,而托管bean注释只能从JSF2.0。