Резюме: кто-нибудь знает, как заставить @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>