Xpages @PreDestroy

Резюме: кто-нибудь знает, как заставить @PreDestroy запускаться при перезапуске \ тайм-ауте управляемого bean-объекта Application Scope?

Пару недель назад я разместил вопрос о «запланированных агентах»: 30-секундная периодическая задача для опроса внешней веб-службы и данных кеширования ... которую я успешно реализовал до сих пор с использованием потока (в настоящее время я использовал этот метод, поскольку вся логика, содержащаяся в проекте базы данных), я могу запустить \ отменить \ приостановить \ перезапустить поток успешно из моего компонента поддержки Application Scope. Но побочным эффектом является то, что когда компонент поддержки, который инициирует поток, повторно используется, поток продолжает работать. У меня есть метод, который вызывает мой метод отмены Thread с использованием @PreDestroy в моем компоненте Application Scope, но, похоже, он не вызывается.

Я нашел эту ссылку от IBM: LO67255: АННОТАЦИЯ УПРАВЛЯЕМЫХ БИНОВ - @POSTCONSTRUCT И @PREDESTROY НЕ РАБОТАЕТ, КАК ОЖИДАЕМЫЙ. http://www-01.ibm.com/support/docview.wss?crawler=1&uid=swg1LO67255 ... но у меня нет доступа к этой статье, поэтому я не уверен, что результат ... она не работает.

У меня есть очень простой тестовый класс для демонстрации. Я импортировал несколько избыточных библиотек вверху из-за последнего найденного здесь сообщения: https://community.jboss.org/thread/179819, но у вас нет доступа к javax.enterprise. * в XPages.

Я установил «рециркуляцию» в свойствах DB XPage «Тайм-аут приложения» на 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>

person nick wall    schedule 03.04.2012    source источник


Ответы (2)


Существует три типа артефактов прослушивателя JSF, которые предоставляют возможность вручную очищать объекты, хранящиеся в области (включая управляемые компоненты):

  1. FacesContextListener: его метод beforeContextReleased () является самым последним вызовом перед завершением любого запроса, поэтому это идеальное место для очистки requestScope.
  2. SessionListener: его метод sessionDestroyed () дает возможность очистить sessionScope.
  3. ApplicationListener: его метод applicationDestroyed () дает возможность очистить applicationScope.

ApplicationListener должен быть определен в библиотеке OSGi XSP; первые два могут быть определены либо в библиотеке, либо локально для конкретного NSF.

person Tim Tripcony    schedule 03.04.2012

Возможно, я ошибаюсь, но XPages построен на основе JSF1.2, а аннотации управляемых компонентов доступны только в JSF2.0.

person Egor Margineanu    schedule 03.04.2012