diff --git a/src/main/java/net/frontlinesms/FrontlineSMS.java b/src/main/java/net/frontlinesms/FrontlineSMS.java index 595fe26..e166838 100644 --- a/src/main/java/net/frontlinesms/FrontlineSMS.java +++ b/src/main/java/net/frontlinesms/FrontlineSMS.java @@ -133,6 +133,8 @@ public class FrontlineSMS implements SmsSender, SmsListener, EmailListener, Even private IncomingMessageProcessor incomingMessageProcessor; private PluginManager pluginManager; + private OutboxManager outboxManager; + //> EVENT LISTENERS /** Listener for email events */ private EmailListener emailListener; @@ -266,6 +268,11 @@ public class FrontlineSMS implements SmsSender, SmsListener, EmailListener, Even for (Email m : emailDao.getEmailsForStatus(new Email.Status[] {Email.Status.RETRYING, Email.Status.PENDING, Email.Status.OUTBOX})) { emailServerManager.sendEmail(m); } + + outboxManager = new OutboxManager(this); + outboxManager.setMessageDao(this.messageDao); + outboxManager.setEmailDao(this.emailDao); + outboxManager.start(); } private void stopServices() { @@ -292,6 +299,10 @@ public class FrontlineSMS implements SmsSender, SmsListener, EmailListener, Even LOG.debug("Stopping the incoming message processor..."); this.incomingMessageProcessor.die(); } + if(this.outboxManager != null) { + LOG.debug("Stopping the outbox processor..."); + this.outboxManager.die(); + } } /** --- a/src/main/java/net/frontlinesms/OutboxManager.java 1969-12-31 16:00:00.000000000 -0800 +++ b/src/main/java/net/frontlinesms/OutboxManager.java 2010-12-05 15:02:45.000000000 -0800 @@ -0,0 +1,83 @@ +package net.frontlinesms; + +import net.frontlinesms.EmailServerHandler; +import net.frontlinesms.FrontlineSMS; +import net.frontlinesms.data.domain.Email; +import net.frontlinesms.data.domain.FrontlineMessage; +import net.frontlinesms.data.domain.FrontlineMessage.Status; +import net.frontlinesms.data.domain.FrontlineMessage.Type; +import net.frontlinesms.data.repository.EmailDao; +import net.frontlinesms.data.repository.MessageDao; +import net.frontlinesms.messaging.sms.SmsServiceManager; + +import org.apache.log4j.Logger; + +public class OutboxManager extends Thread { + /** Data Access Object for {@link Email}s */ + private EmailDao emailDao; + /** Data Access Object for {@link FrontlineMessage}s */ + private MessageDao messageDao; + + private static final Logger LOG = FrontlineUtils.getLogger(OutboxManager.class); + + private final FrontlineSMS frontline; + private boolean keepAlive; + + public OutboxManager(FrontlineSMS frontline) { + this.frontline = frontline; + + try { + setDaemon(true); + } + catch (IllegalThreadStateException itse) { + LOG.warn("IllegalThreadStateException", itse); + } + catch (SecurityException se) { + LOG.warn("SecurityException", se); + } + } + + public void die() { + keepAlive = false; + } + + public void setEmailDao(EmailDao dao) { + this.emailDao = dao; + } + + public void setMessageDao(MessageDao dao) { + this.messageDao = dao; + } + + public void run() { + keepAlive = true; + + while (keepAlive) { + LOG.debug("new round"); + + try { + // Five minutes + sleep(5 * 60 * 1000, 0); + } + catch (Throwable t) { + } + + checkOutboxes(); + } + + LOG.trace("EXIT"); + } + + private void checkOutboxes() { + LOG.debug("Flush SMS outbox."); + for (FrontlineMessage m : messageDao.getMessages(Type.OUTBOUND, Status.OUTBOX)) { + frontline.getSmsServiceManager().sendSMS(m); + } + + LOG.debug("Flush e-mails to outbox."); + //We need to reload all email, which status is RETRYING, to the outbox. + for (Email m : emailDao.getEmailsForStatus(new Email.Status[] {Email.Status.RETRYING, Email.Status.OUTBOX})) { + frontline.getEmailServerHandler().sendEmail(m); + } + } +} \ No newline at end of file