ScheduledExecutorService實現定時器-定時發郵件

原理可以參考 

http://blog.csdn.net/guozebo/article/details/51090612

http://hstrust.iteye.com/blog/2316429


項目中需要定時檢測數據庫Email表,把issend=false的取出來發送,採用ScheduledExecutorService實現

import com.alibaba.fastjson.JSON;
import com.ymatou.envmanagement.constants.Constants;
import com.ymatou.envmanagement.domain.repository.EmailReposity;
import com.ymatou.envmanagement.holder.RuleHolder;
import com.ymatou.envmanagement.infrastructure.mysqldb.model.EmailPo;
import com.ymatou.envmanagement.infrastructure.mysqldb.model.NodePo;
import com.ymatou.envmanagement.service.EmailService;
import com.ymatou.envmanagement.support.ScheduledExecutorHelper;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.PostConstruct;
import java.time.LocalDateTime;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

/**
 * Created by chenjiazhu on 2017/8/23.
 */
@Component
public class EmailSendExecutor  {

    private static final Logger logger = LoggerFactory.getLogger(RuleDiscoverer.class);

    private ScheduledExecutorService scheduledExecutorService = ScheduledExecutorHelper.newSingleThreadScheduledExecutor("rule discover2");

    @Autowired
    private EmailReposity emailReposity;

    @Autowired
    private EmailService emailService;

    @PostConstruct
    public void execute() {

        scheduledExecutorService.scheduleAtFixedRate(() -> {
            try {
                sendEmail();
            } catch (Exception ex) {
                logger.error("reload rule error", ex);
            }

        },0L, 5L, TimeUnit.MINUTES );

    }

    @Transactional
    public void sendEmail() {
                  List<Map> titles = emailReposity.selectSendTitle();

        for (Map title:titles)
        {
            String address = title.get("address")!=null?title.get("address").toString():"";
            String titleStr = title.get("title")!=null?title.get("title").toString():"";

            if((!address.equals("")) && (!title.equals("")))
            {
                List<EmailPo> emails = emailReposity.selectSendMessage(titleStr,address);

                if(emails!=null&&emails.size()>0) {

                    int i=1;
                    StringBuilder body = new StringBuilder();
                    for (EmailPo email : emails) {
                        body.append(i++);
                        body.append(". ");
                        body.append(email.getBody());
                        body.append("<br/>");

                        email.setIssend(true);
                        email.setSendtime(LocalDateTime.now().format(Constants.FORMATTER_YYYYMMDDHHMM));
                        emailReposity.updateByPrimaryKeySelective(email);
                    }

                       emailService.sendHtmlMail(address, titleStr+" 共"+emails.size()+"個站點異常", body.toString());
                }
            }
        }

        logger.info("Send Email finished");

    }

}

發郵件

import com.ymatou.envmanagement.config.BizConfig;
import com.ymatou.envmanagement.config.EmailConfig;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.mail.javamail.JavaMailSenderImpl;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import javax.mail.MessagingException;
import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeUtility;
import java.util.Properties;

/**
 * Created by zhangxiaoming on 2016/11/24.
 */
@Service
public class EmailService implements InitializingBean {
    protected static final Logger logger = LoggerFactory.getLogger(EmailService.class);

    private JavaMailSenderImpl mailSender = new JavaMailSenderImpl();

    @Resource
    private EmailConfig emailConfig;

    @Autowired
    private BizConfig bizConfig;

    public void sendHtmlMail(String toAddress, String title, String text) {
        if (StringUtils.isBlank(toAddress) || StringUtils.isBlank(title) || StringUtils.isBlank(text) || !bizConfig.isEnableSend())
            return;

        String[] tos = StringUtils.split(toAddress, ";");
        sendHtmlMail(tos, title, text);
    }

    /**
     * 發送html郵件
     * @param text
     * @throws AddressException
     * @throws MessagingException
     */
    public void sendHtmlMail(String[] to, String title, String text) {
        try {
            MimeMessage mimeMessage = mailSender.createMimeMessage();
            MimeMessageHelper messageHelper = new MimeMessageHelper(mimeMessage, true, "UTF-8");
            String nick = MimeUtility.encodeText("報警系統");
            InternetAddress[] toArray = new InternetAddress[to.length];
            for (int i = 0; i < to.length; i++) {
                toArray[i] = new InternetAddress(to[i]);
            }

            messageHelper.setFrom(new InternetAddress(String.format("%s<%s>", nick, emailConfig.getFromMailAddress())));
            messageHelper.setTo(toArray);
            messageHelper.setSubject(title);
            messageHelper.setText(text, true);
            mimeMessage = messageHelper.getMimeMessage();
            mailSender.send(mimeMessage);

        } catch (Exception ex) {
            StringBuilder sb = new StringBuilder();
            sb.append("mailto:");
            sb.append(StringUtils.join(to, ";"));
            sb.append(ex.getMessage());
            logger.error(sb.toString(), ex);
            //Throwables.propagate(ex);
        }

    }

    /**
     * 設置郵箱host,用戶名和密碼
     */
    @Override
    public void afterPropertiesSet() throws Exception {

        mailSender.setHost(emailConfig.getSmtpHost());
        mailSender.setUsername(emailConfig.getFromMailAddress());
        mailSender.setPassword(emailConfig.getFromMailPassword());

        Properties properties = new Properties();
        properties.setProperty("mail.smtp.connectiontimeout","10000");
        properties.setProperty("mail.smtp.timeout","10000");
        mailSender.setJavaMailProperties(properties);
    }
}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章