Subversion Repositories bacoAlunos

Rev

Rev 1082 | Blame | Compare with Previous | Last modification | View Log | RSS feed

package pt.estgp.estgweb.services.jobs;

import jomm.dao.impl.AbstractDao;
import org.apache.log4j.Logger;
import org.hibernate.HibernateException;
import pt.estgp.estgweb.Globals;
import pt.estgp.estgweb.domain.*;
import pt.estgp.estgweb.domain.dao.DaoFactory;
import pt.estgp.estgweb.utils.DatesUtils;

import java.util.*;

/**
 * @author Jorge Machado
 * @date 11/Jul/2008
 * @see pt.estgp.estgweb.services.jobs
 */

public class JobDeamon implements 1.5.0/docs/api/java/lang/Runnable.html">Runnable
{
    public static final 1.5.0/docs/api/java/util/logging/Logger.html">Logger logger = 1.5.0/docs/api/java/util/logging/Logger.html">Logger.getLogger(JobDeamon.class);

    public void run()
    {
        while(true)
        {
            try
            {
                logger.info("Jo bRunner: Waiking up");
                AbstractDao.getCurrentSession().beginTransaction();

                logger.info("JobRunner: Checking scheduler");
                checkScheduler();
                AbstractDao.getCurrentSession().flush();
                AbstractDao.getCurrentSession().getTransaction().commit();
                AbstractDao.getCurrentSession().beginTransaction();
                logger.info("JobRunner: Checking jobs");
                List<Job> jobs = DaoFactory.getJobDaoImpl().findExecutableJobs();
                logger.info("JobRunner found: " + jobs.size() + " jobs");
                for(Job j: jobs)
                {
                    DaoFactory.getJobDaoImpl().reattach(j);
                    try{
                        JobRunner jobRunner;
                        if(j instanceof JobServiceTaskImpl)
                        {
                            logger.info("JobRunner running jobServiceTask: " + j.getDescription());
                            jobRunner = new JobRunner((JobHandler) j);
                        }
                        else
                        {
                            logger.info("JobRunner running job: " + j.getDescription());
                            jobRunner = new JobRunner((JobHandler) j.getJobHandler());
                        }

                        jobRunner.run();
                        j.setExecuted(true);
                        DaoFactory.getJobDaoImpl().saveOrUpdate(j);
                        AbstractDao.getCurrentSession().flush();
                        AbstractDao.getCurrentSession().evict(j);
                    }
                    catch(1.5.0/docs/api/java/lang/Throwable.html">Throwable e)
                    {

                        j.setExecuted(true);
                        DaoFactory.getJobDaoImpl().saveOrUpdate(j);
                        AbstractDao.getCurrentSession().flush();
                        AbstractDao.getCurrentSession().evict(j);
                        logger.error(e,e);
                    }
                    1.5.0/docs/api/java/lang/Thread.html">Thread.sleep(2000);
                }

                AbstractDao.getCurrentSession().flush();
                AbstractDao.getCurrentSession().getTransaction().commit();
                1.5.0/docs/api/java/lang/Thread.html">Thread.sleep(Globals.JOB_DEAMON_SLEEP_SECONDS*1000);

            }
            catch(HibernateException e)
            {
                AbstractDao.getCurrentSession().getTransaction().rollback();
                logger.error("Need to Rolling back " + e.toString(),e);
            }
            catch (1.5.0/docs/api/java/lang/Throwable.html">Throwable e)
            {
                logger.error(e,e);
                try
                {
                    if(AbstractDao.getCurrentSession().getTransaction().isActive())
                        AbstractDao.getCurrentSession().getTransaction().rollback();
                }
                catch(1.5.0/docs/api/java/lang/Throwable.html">Throwable t)
                {
                    logger.fatal(t,t);
                    logger.fatal("STOPING JOB DEAMON");
                    break;
                }
            }
        }
    }

    private void checkScheduler()
    {
        List<JobServiceTaskScheduler> schedules = DaoFactory.getJobServiceTaskSchedulerDaoImpl().findAll();
        for(JobServiceTaskScheduler schedule: schedules)
        {
            5+0%2Fdocs%2Fapi+Date">Date last = schedule.getLastScheduleDate();

            if(isRunnableNow(schedule, last))
            {
                logger.info("Schedulling one job " + schedule.getTargetService() + " to run");
                JobServiceTaskImpl jobServiceTask = DomainObjectFactory.createJobServiceTaskImpl();
                jobServiceTask.setStartDate(new 5+0%2Fdocs%2Fapi+Date">Date());
                jobServiceTask.setTargetService(schedule.getTargetService());
                jobServiceTask.setCreatedBy(schedule.getCreatedBy());
                jobServiceTask.setExecuted(false);
                jobServiceTask.setDescription("Service:" + schedule.getDescription());
                jobServiceTask.setServiceDescription(schedule.getDescription());
                jobServiceTask.setSaveDate(new 5+0%2Fdocs%2Fapi+Date">Date());
                jobServiceTask.setStatusEnum(JobServiceTaskImpl.JobStatus.PENDING);
                jobServiceTask.setRequestStop(false);
                jobServiceTask.setOwner(schedule.getCreatedBy());
                jobServiceTask.setJobHandler(new SerializableNullJobHandler());
                jobServiceTask.setProgress(0);
                DaoFactory.getJobServiceTaskDaoImpl().save(jobServiceTask);
                schedule.setLastJobServiceTask(jobServiceTask);
                try {
                    1.5.0/docs/api/java/lang/String.html">String filePath = 1.5.0/docs/api/java/lang/Class.html">Class.forName(schedule.getTargetService()).getSimpleName() + "-" + DatesUtils.getFormatedFileSystem(new 5+0%2Fdocs%2Fapi+Date">Date());
                    jobServiceTask.setLogFilePath( filePath + ".log");
                } catch (1.5.0/docs/api/java/lang/ClassNotFoundException.html">ClassNotFoundException e) {
                    logger.fatal(e,e);
                    continue;
                }
                Set<JobServiceTaskParameter> paramsJob = new HashSet<JobServiceTaskParameter>();
                for(JobServiceTaskSchedulerParameter param : schedule.getServiceTaskSchedulerParameters())
                {
                    JobServiceTaskParameterImpl paramJob = DomainObjectFactory.createJobServiceTaskParameterImpl();
                    paramJob.setName(param.getName());
                    paramJob.setDescription(param.getDescription());
                    paramJob.setObject(param.getObject());
                    paramsJob.add(paramJob);
                    paramJob.setJobServiceTask(jobServiceTask);
                    DaoFactory.getJobServiceTaskParameterDaoImpl().save(paramJob);
                }
                jobServiceTask.setServiceTaskParameters(paramsJob);

                //DaoFactory.getJobServiceTaskDaoImpl().saveOrUpdate(jobServiceTask);

                //a last schedule date e a hora a que foi marcado para correr a ultima vez
                //a partir do momento que e' agendado o trabalho ele vai correr portanto
                //e' esta a hora que se considera para a corrida
                schedule.setLastScheduleDate(new 5+0%2Fdocs%2Fapi+Date">Date());
                if(schedule.isNow())
                {
                    schedule.setNow(false);
                }
            }
        }
    }

    private boolean isRunnableNow(JobServiceTaskScheduler schedule,5+0%2Fdocs%2Fapi+Date">Date lastDate)
    {
        if(!schedule.isActive())
            return false;
        if(lastDate == null)
            lastDate = new 5+0%2Fdocs%2Fapi+Date">Date(0);
        1.5.0/docs/api/java/util/GregorianCalendar.html">GregorianCalendar gC = new 1.5.0/docs/api/java/util/GregorianCalendar.html">GregorianCalendar();
        gC.setTime(lastDate);
        1.5.0/docs/api/java/util/GregorianCalendar.html">GregorianCalendar gCNow = new 1.5.0/docs/api/java/util/GregorianCalendar.html">GregorianCalendar();
        gCNow.setTime(new 5+0%2Fdocs%2Fapi+Date">Date());

        if(schedule.isNow())
            return true;
        else if(schedule.isWeekly() && schedule.getWeekday() != gCNow.get(1.5.0/docs/api/java/util/GregorianCalendar.html">GregorianCalendar.DAY_OF_WEEK))
            return false;
        else if(schedule.isMonthly() && schedule.getMonthday() != gCNow.get(1.5.0/docs/api/java/util/GregorianCalendar.html">GregorianCalendar.DAY_OF_MONTH))
            return false;

        //Neste momento ou é da semana e estamos no dia da semana ou e do mes e estamos no dia do mes
        //ou e' diario
        //portanto o que interessa e' ver se ja correu hoje depois da hora que e' para correr
        //se ainda nao correu hoje tem de correr
        //Criar um gcRunTime com a hora de corrida de hoje ou seja ano, mes e dia de hoje hora minuto e segundo do schedulle
        1.5.0/docs/api/java/util/GregorianCalendar.html">GregorianCalendar gCRunTime = new 1.5.0/docs/api/java/util/GregorianCalendar.html">GregorianCalendar();
        gCRunTime.set(gCNow.get(1.5.0/docs/api/java/util/GregorianCalendar.html">GregorianCalendar.YEAR),gCNow.get(1.5.0/docs/api/java/util/GregorianCalendar.html">GregorianCalendar.MONTH),gCNow.get(1.5.0/docs/api/java/util/GregorianCalendar.html">GregorianCalendar.DAY_OF_MONTH),
        schedule.getHour(),schedule.getMinute(),schedule.getSecond());
        //Ja estamos depois da runTime? now > runtime?
        // e a ultima vez que correu está antes da RunTime de Hoje portanto ainda não correu depois desta runtime
        //tem de correr
        return gCNow.getTimeInMillis() > gCRunTime.getTimeInMillis() && lastDate.getTime() < gCRunTime.getTimeInMillis();
        //assim funciona mesmo que mudem a runtime para depois mesmo que hoje ja tenha corrido e corre novamente
    }
    public static void main(1.5.0/docs/api/java/lang/String.html">String [] args)
    {
        new JobDeamon().run();
    }
}