package cn.org.rapid_framework.mail;
import java.io.InputStream;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import javax.mail.internet.MimeMessage;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.BeanNameAware;
import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.mail.MailException;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessagePreparator;
import org.springframework.scheduling.concurrent.CustomizableThreadFactory;
import org.springframework.util.Assert;
import cn.org.rapid_framework.util.concurrent.async.AsyncToken;
import cn.org.rapid_framework.util.concurrent.async.AsyncTokenFactory;
import cn.org.rapid_framework.util.concurrent.async.AsyncTokenUtils;
import cn.org.rapid_framework.util.concurrent.async.DefaultAsyncTokenFactory;
/**
* 使用线程池异步发送邮件的javaMailSender
* 每一个发送方法返回AsyncToken用于监听邮件是否发送成功
*
* @see AsyncToken
* @author badqiu
*
*/
public class AsyncJavaMailSender implements InitializingBean,DisposableBean,BeanNameAware{
protected static final Log log = LogFactory.getLog(AsyncJavaMailSender.class);
protected int sendMailThreadPoolSize = 0;
protected ExecutorService executorService; //邮件发送的线程池
protected JavaMailSender javaMailSender;
protected boolean shutdownExecutorService = true;
protected boolean waitForTasksToCompleteOnShutdown = true;
protected AsyncTokenFactory asyncTokenFactory = new DefaultAsyncTokenFactory();
private String beanName;
public void afterPropertiesSet() throws Exception {
if(executorService == null && sendMailThreadPoolSize > 0) {
executorService = Executors.newFixedThreadPool(sendMailThreadPoolSize,new CustomizableThreadFactory(getClass().getSimpleName()+"-"));
log.info("create send mail executorService,sendMailThreadPoolSize:"+sendMailThreadPoolSize);
}
Assert.notNull(javaMailSender,"javaMailSender must be not null");
Assert.notNull(executorService,"executorService must be not null");
Assert.notNull(asyncTokenFactory,"asyncTokenFactory must be not null");
}
public void destroy() throws Exception {
if(shutdownExecutorService) {
shutdown();
}
}
public void shutdown() {
log.info("Shutting down ExecutorService" + (this.beanName != null ? " '" + this.beanName + "'" : ""));
if(waitForTasksToCompleteOnShutdown)
executorService.shutdown();
else
executorService.shutdownNow();
}
public void setBeanName(String name) {
this.beanName = name;
}
public boolean isWaitForTasksToCompleteOnShutdown() {
return waitForTasksToCompleteOnShutdown;
}
public void setWaitForTasksToCompleteOnShutdown(boolean waitForTasksToCompleteOnShutdown) {
this.waitForTasksToCompleteOnShutdown = waitForTasksToCompleteOnShutdown;
}
public void setSendMailThreadPoolSize(int sendMailThreadPool) {
this.sendMailThreadPoolSize = sendMailThreadPool;
}
public ExecutorService getExecutorService() {
return executorService;
}
public AsyncTokenFactory getAsyncTokenFactory() {
return asyncTokenFactory;
}
public void setAsyncTokenFactory(AsyncTokenFactory asyncTokenFactory) {
this.asyncTokenFactory = asyncTokenFactory;
}
public void setExecutorService(ExecutorService executorService) {
this.executorService = executorService;
}
public JavaMailSender getJavaMailSender() {
return javaMailSender;
}
public void setJavaMailSender(JavaMailSender javaMailSender) {
this.javaMailSender = javaMailSender;
}
public void setShutdownExecutorService(boolean shutdownExecutorService) {
this.shutdownExecutorService = shutdownExecutorService;
}
public boolean isShutdownExecutorService() {
return shutdownExecutorService;
}
public MimeMessage createMimeMessage() {
return javaMailSender.createMimeMessage();
}
public MimeMessage createMimeMessage(InputStream contentStream) throws MailException {
return javaMailSender.createMimeMessage(contentStream);
}
public AsyncToken send(final MimeMessage mimeMessage) throws MailException {
return AsyncTokenUtils.execute(executorService,asyncTokenFactory, new Runnable() {
public void run() {
javaMailSender.send(mimeMessage);
}
});
}
public AsyncToken send(final MimeMessage[] mimeMessages) throws MailException {
return AsyncTokenUtils.execute(executorService,asyncTokenFactory, new Runnable() {
public void run() {
javaMailSender.send(mimeMessages);
}
});
}
public AsyncToken send(final MimeMessagePreparator mimeMessagePreparator) throws MailException {
return AsyncTokenUtils.execute(executorService,asyncTokenFactory, new Runnable() {
public void run() {
javaMailSender.send(mimeMessagePreparator);
}
});
}
public AsyncToken send(final MimeMessagePreparator[] mimeMessagePreparators) throws MailException {
return AsyncTokenUtils.execute(executorService,asyncTokenFactory,new Runnable() {
public void run() {
javaMailSender.send(mimeMessagePreparators);
}
});
}
public AsyncToken send(final SimpleMailMessage simpleMessage) throws MailException {
return AsyncTokenUtils.execute(executorService,asyncTokenFactory, new Runnable() {
public void run() {
javaMailSender.send(simpleMessage);
}
});
}
public AsyncToken send(final SimpleMailMessage[] simpleMessages) throws MailException {
return AsyncTokenUtils.execute(executorService,asyncTokenFactory, new Runnable() {
public void run() {
javaMailSender.send(simpleMessages);
}
});
}
}