package com.mossle.javamail.service; import java.util.concurrent.BlockingQueue; import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.TimeUnit; import javax.annotation.PostConstruct; import javax.annotation.PreDestroy; import javax.annotation.Resource; import com.mossle.javamail.support.JavamailCmd; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Component; @Component public class JavamailQueue { private static Logger logger = LoggerFactory.getLogger(JavamailQueue.class); private BlockingQueue<JavamailCmd> receiveQueue = new LinkedBlockingQueue<JavamailCmd>(); private BlockingQueue<JavamailCmd> sendQueue = new LinkedBlockingQueue<JavamailCmd>(); private Thread receiveThread; private Thread sendThread; private ReceiveWorker receiveWorker; private SendWorker sendWorker; private boolean active = true; private JavamailService javamailService; @PostConstruct public void init() { receiveWorker = new ReceiveWorker(this); receiveThread = new Thread(receiveWorker); receiveThread.start(); sendWorker = new SendWorker(this); sendThread = new Thread(sendWorker); sendThread.start(); } @PreDestroy public void destroy() { receiveWorker.stop(); sendWorker.stop(); } public void doProcessReceive() throws Exception { JavamailCmd javamailCmd = receiveQueue.poll(1, TimeUnit.SECONDS); logger.debug("process receive : {}", javamailCmd); if (javamailCmd == null) { return; } try { if ("receive".equals(javamailCmd.getType())) { javamailService.receive(javamailCmd.getFrom()); } else { logger.info("unsupport : {}", javamailCmd.getType()); } } catch (Exception ex) { logger.error(ex.getMessage(), ex); } } public void doProcessSend() throws Exception { JavamailCmd javamailCmd = sendQueue.poll(1, TimeUnit.SECONDS); logger.debug("process send : {}", javamailCmd); if (javamailCmd == null) { return; } try { if ("send".equals(javamailCmd.getType())) { javamailService.send(javamailCmd.getFrom(), javamailCmd.getTo(), javamailCmd.getCc(), javamailCmd.getBcc(), javamailCmd.getSubject(), javamailCmd.getContent()); } else { logger.info("unsupport : {}", javamailCmd.getType()); } } catch (Exception ex) { logger.error(ex.getMessage(), ex); } } public void receive(String userId) { JavamailCmd javamailCmd = new JavamailCmd(); javamailCmd.setType("receive"); javamailCmd.setFrom(userId); receiveQueue.add(javamailCmd); } public void send(String from, String to, String cc, String bcc, String subject, String content) { JavamailCmd javamailCmd = new JavamailCmd(); javamailCmd.setType("send"); javamailCmd.setFrom(from); javamailCmd.setTo(to); javamailCmd.setCc(cc); javamailCmd.setBcc(bcc); javamailCmd.setSubject(subject); javamailCmd.setContent(content); sendQueue.add(javamailCmd); } @Resource public void setJavamailService(JavamailService javamailService) { this.javamailService = javamailService; } }