package org.toobsframework.email;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.beans.factory.access.BeanFactoryLocator;
import org.springframework.beans.factory.access.BeanFactoryReference;
import org.toobsframework.email.beans.EmailBean;
import org.toobsframework.jms.email.IEmailMessageReceiver;
import org.toobsframework.jms.email.IEmailMessageSender;
import org.toobsframework.scheduler.ScheduledJob;
public class EmailJob implements Job, ScheduledJob {
private static Log log = LogFactory.getLog(EmailJob.class);
private static boolean running = false;
private static Object synch = new Object();
private int retries = 3;
public EmailJob() {
}
public void execute(JobExecutionContext context)
throws JobExecutionException {
if (isRunning()) {
log.info("Email job already running");
return;
}
try {
setRunning(true);
log.info("Starting email processing");
BeanFactoryLocator bfl = org.springframework.beans.factory.access.SingletonBeanFactoryLocator.getInstance();
BeanFactoryReference bf = bfl.useBeanFactory("beanRefFactory");
IEmailMessageReceiver emr = null;
IEmailMessageSender ems = null;
try {
emr = (IEmailMessageReceiver)bf.getFactory().getBean("IEmailMessageReceiver");
ems = (IEmailMessageSender)bf.getFactory().getBean("IEmailMessageSender");
} catch (Exception e1) {
log.info("JMS Email disabled");
return;
}
SmtpMailSender sender = (SmtpMailSender)bf.getFactory().getBean("SmtpMailSender");
EmailBean email = null;
while ((email = emr.recieve()) != null) {
try {
if (log.isDebugEnabled()) {
log.debug("Sending email: " + email.toString());
}
sender.sendEmail(email);
} catch (Exception e) {
log.info("Send Email failed " + e.getMessage(), e);
email.setFailureCause(e.getMessage());
email.setAttempts(email.getAttempts() + 1);
if (email.getAttempts() < retries) {
ems.send(email);
} else {
// Send to failed queue
//emf.send(email);
}
}
}
} catch (Exception e) {
log.error("Error running email job", e);
} finally {
setRunning(false);
}
}
public static void shutdownJob() {
}
public void shutdown() {
EmailJob.shutdownJob();
}
private boolean isRunning() {
synchronized(synch) {
return EmailJob.running;
}
}
private void setRunning(boolean running) {
synchronized(synch) {
EmailJob.running = running;
}
}
}