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("JobRunner: 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();
try{
AbstractDao.
getCurrentSession().
getTransaction().
commit();
}
catch(HibernateException e
)
{
AbstractDao.
getCurrentSession().
getTransaction().
rollback();
logger.
error("Need to Rolling back " + e.
toString(),e
);
}
AbstractDao.
getCurrentSession().
beginTransaction();
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
))
{
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
);
}
try {
JobServiceTaskImpl jobServiceTask = createServiceJob
(
1.5.0/docs/api/java/lang/Class.html">Class.
forName(schedule.
getTargetService()),
schedule.
getCreatedBy(),
paramsJob,
"Service:" + schedule.
getDescription()
);
schedule.
setLastJobServiceTask(jobServiceTask
);
} catch (1.5.0/docs/api/java/lang/ClassNotFoundException.html">ClassNotFoundException e
) {
logger.
fatal(e,e
);
continue;
}
//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);
}
}
}
}
public static JobServiceTaskImpl createServiceJob
(1.5.0/docs/api/java/lang/Class.html">Class targetService, User owner, Set
<JobServiceTaskParameter
> paramsJob,
1.5.0/docs/api/java/lang/String.html">String description
)
{
if(description==
null || description.
trim().
length()==0
)
description = targetService.
getSimpleName();
logger.
info("Schedulling one job " + targetService +
" to run");
JobServiceTaskImpl jobServiceTask = DomainObjectFactory.
createJobServiceTaskImpl();
jobServiceTask.
setStartDate(new 5+0%2Fdocs%2Fapi+Date">Date());
jobServiceTask.
setTargetService(targetService.
getName());
jobServiceTask.
setCreatedBy(owner
);
jobServiceTask.
setExecuted(false);
jobServiceTask.
setDescription(description
);
jobServiceTask.
setServiceDescription(description
);
jobServiceTask.
setSaveDate(new 5+0%2Fdocs%2Fapi+Date">Date());
jobServiceTask.
setStatusEnum(JobServiceTaskImpl.
JobStatus.
PENDING);
jobServiceTask.
setRequestStop(false);
jobServiceTask.
setOwner(owner
);
jobServiceTask.
setJobHandler(new SerializableNullJobHandler
());
jobServiceTask.
setProgress(0
);
DaoFactory.
getJobServiceTaskDaoImpl().
save(jobServiceTask
);
1.5.0/docs/api/java/lang/String.html">String filePath = targetService.
getSimpleName() +
"-" + DatesUtils.
getFormatedFileSystem(new 5+0%2Fdocs%2Fapi+Date">Date());
jobServiceTask.
setLogFilePath( filePath +
".log");
for(JobServiceTaskParameter param: paramsJob
)
{
param.
setJobServiceTask(jobServiceTask
);
DaoFactory.
getJobServiceTaskParameterDaoImpl().
save(param
);
}
jobServiceTask.
setServiceTaskParameters(paramsJob
);
return jobServiceTask
;
}
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.
isRunOnlyOnDemand())
return false;
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();
}
}