Java 多线程 BlockingQueue 实现 高并发邮件 代码 SystemEmailServiceImpl

来源:互联网 发布:加工中心编程高清图纸 编辑:程序博客网 时间:2024/04/25 17:38
package com.pingan.emall.biz.business.impl;


import com.paic.pafa.app.biz.service.BaseService;
import com.paic.pafa.app.lwc.core.util.DevLog;
import com.pingan.emall.biz.business.SystemEmailService;
import com.pingan.emall.biz.util.MailBean;
import com.pingan.emall.biz.util.SystemEmailBlockingQueue;
import com.pingan.emall.biz.util.SystemEmailSender;
import com.pingan.emall.dto.SystemEmailConfigDTO;
import com.pingan.emall.integration.dao.SystemEmailDAO;
import com.pingan.emall.integration.util.IntegrationContextObjectNames;
import com.pingan.emall.util.FileUtil;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import org.apache.commons.lang.StringUtils;


public class SystemEmailServiceImpl extends BaseService implements
SystemEmailService {

public static final String REAL_ESTATE_SUBSCRIBE_EMAIL = "REALESTATE_SUBSCRIBE";


private int maxQueueSize = 5000;
private int threadSize = 10;
private List<SystemEmailSender> mailSendThreads;
private SystemEmailBlockingQueue queue;


private Map<String, String> templateMap = new HashMap<String, String>();
private Object templateLock = new Object();

public void init() {
// Define blocking queue to store system email request
queue = new SystemEmailBlockingQueue(maxQueueSize);


// Start mail send thread
mailSendThreads = new ArrayList<SystemEmailSender>(threadSize);
for (int i = 0; i < threadSize; i ++) {
SystemEmailSender mailSender = new SystemEmailSender(queue);
mailSender.start();


mailSendThreads.add(mailSender);
}
}


@Override
public boolean sendEmail(String configId, Map<String, String> templateParams) {
try {
SystemEmailConfigDTO config = getSystemEmailDAO().queryConfigById(configId);
if (config == null) {
DevLog.error("System email config with config Id " + configId + " not exist");
return false;
}

// add email request to queue
MailBean mail = generateMailBean(config, templateParams);
if (StringUtils.isEmpty(mail.getMailTo())) {
// No mail receive configured
return false;
}

boolean result = queue.push(mail);
if (!result) {
DevLog.error("Add system email request to queue failed, email queue may be full, mail info : " + mail.toString());
}
return true;
} catch (Exception e) {
DevLog.error("Exception happens when insert system email queue", e);
return false;
}
}

/**
* Method called when destroy email service bean 
*/
public void close() {
for (SystemEmailSender mailSender : mailSendThreads) {
mailSender.setRunning(false);
if (mailSender.isAlive()) {
try {
Thread.sleep(3000);


if (mailSender.isAlive()) {
mailSender.interrupt();
}
} catch (InterruptedException e) {
DevLog.error("Exception happens when stop mail send thread ", e);
}
}
}

queue.destroy();
}

private MailBean generateMailBean(SystemEmailConfigDTO config, Map<String, String> templateParams) {
MailBean mail = new MailBean();

mail.setMailFrom(config.getMailFrom());
mail.setMailTo(config.getMailTo());
mail.setMailCC(config.getCc());
mail.setSubject(config.getSubject());
String template = config.getContent();

String templateContent = getTemplateContent(template);
if (StringUtils.isNotEmpty(templateContent)) {
for (Entry<String, String> param : templateParams.entrySet()) {
templateContent = StringUtils.replace(templateContent, "#{" + param.getKey()
+ "}", param.getValue());
}
mail.setContent(templateContent);
}

return mail;
}

private String getTemplateContent(String template) {
if (!templateMap.containsKey(template)) {
synchronized (templateLock) {
if (!templateMap.containsKey(template)) {

InputStream is = this.getClass().getResourceAsStream(template);
if (is == null) {
DevLog.error("Template file with path " + template + " not exist");
return null;
}


try {
templateMap.put(template, FileUtil.inputStreamToString(is, "UTF-8"));
} catch (IOException e) {
DevLog.error("Exception happens when read template file " + template, e);
}


}
}
}
return templateMap.get(template);
}


private SystemEmailDAO getSystemEmailDAO(){
    return (SystemEmailDAO) context.getBean(IntegrationContextObjectNames.SYSTEM_EMAIL_DAO);
    }

public void setMaxQueueSize(int maxQueueSize) {
this.maxQueueSize = maxQueueSize;
}

public void setThreadSize(int threadSize) {
this.threadSize = threadSize;
}
}
0 0
原创粉丝点击