Veja se assim fica mais claro:
import java.util.GregorianCalendar;
import java.util.Timer;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
/**
* Classe responsavel por executar tarefas agendadas: alimentar dados no combo.
* @author rodrigo.marini
*/
public class ScheduleCombos implements ServletContextListener{
Timer timer = null;
// Invocado pelo container no inicio da aplicação.
public void contextInitialized(ServletContextEvent sce) {
timer = new Timer();
timer.schedule(new AlimentaCombos(), 0);
GregorianCalendar gc = new GregorianCalendar(); //variável que irá receber a hora da próxima atualização
if (gc.get(GregorianCalendar.MINUTE) >= 6){
// ajustar hora atual+uma hora : 05min : 00 segundos
gc.add(GregorianCalendar.HOUR, gc.get(GregorianCalendar.HOUR)+1);
}
gc.set(GregorianCalendar.MINUTE, 5);
gc.set(GregorianCalendar.SECOND, 0);
timer.scheduleAtFixedRate(new AlimentaCombos(), gc.getTime(), 3600000);
}
// Invocado no término da aplicação.
public void contextDestroyed(ServletContextEvent sce) {
if(timer!=null) timer.cancel();
}
}
/**
* Classe usada para acessar o método responsável pela carga de dados nas combos.
* @author rodrigo.marini
*/
public class AlimentaCombos extends TimerTask{
// Responsável pela execução da tarefa agendada: carregar os combos.
public void run() {
AdsDetalheAction ada = new AdsDetalheAction();
ada.alimentaCombos();
System.out.println("atualizei contexto");
LogSis.logar(LogSis.LOG4J_DEBUG_LEVEL,"atualizei contexto");
}
}
public class AdsDetalheAction extends Action {
/*
* (non-Javadoc)
*
* @see org.apache.struts.action.Action#execute(org.apache.struts.action.ActionMapping,
* org.apache.struts.action.ActionForm,
* javax.servlet.http.HttpServletRequest,
* javax.servlet.http.HttpServletResponse)
*/
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) {
...
/**
* Usado como ponte para outra classe carregar o servlet no contexto da aplicação, acessando
* alimentaCombos(ActionServlet).
*/
public void alimentaCombos(){
alimentaCombos(servlet);
}
/**
* Carrega no contexto da aplicação, se não estiverem presentes, os dados utilizados nas páginas de Anúncios
* @param servlet objeto para obtenção do contexto da aplicação onde os dados serão salvos
*/
public static void alimentaCombos(ActionServlet servlet){
ControleAnuncio.alimentaAdServers(servlet);
}
essa é a idéia!!Mas não funciona, porém se a chamada fosse feita diretamente da classe AdsDetalheAction dessa forma:
(...)
alimentaCombos(servlet);
public static void alimentaCombos(ActionServlet servlet){
ControleAnuncio.alimentaAdServers(servlet);
}
Daria certo... mas tem que ser da outra forma!