javaMail利用线程池发送邮件
1.引入JavaMail
<dependency>
<groupId>javax.mail</groupId>
<artifactId>mail</artifactId>
<version>${mail.version}</version>
</dependency>
2.配置mailSender和线程池
<bean id="cusMailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl"> <property name="host" value="${mail.customer.smtp.host}"/> <property name="username" value="${mail.customer.senderAccount}"/> <property name="password" value="${mail.customer.senderPassword}"/> <property name="port" value="${mail.customer.smtp.port}" /> <property name="javaMailProperties"> <props> <prop key="mail.transport.protocol">${mail.customer.transport.protocol}</prop> <prop key="mail.smtp.auth">${mail.customer.mail.smtp.auth}</prop> <!--<prop key="mail.smtp.timeout">60000</prop>--> <!--<prop key="mail.smtp.connectiontimeout">120000</prop>--> <!--<prop key="mail.smtp.socketfactory.class">javax.net.ssl.sslsocketfactory</prop>--> <prop key="mail.smtp.starttls.enable">true</prop> </props> </property> </bean> <bean id="taskExecutor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor"> <property name="corePoolSize" value="10" /> <property name="maxPoolSize" value="100" /> <property name="queueCapacity" value="500" /> <property name="keepAliveSeconds" value="60" /> <property name="waitForTasksToCompleteOnShutdown" value="true" /> <property name="allowCoreThreadTimeOut" value="true" /> <property name="rejectedExecutionHandler"> <bean class="java.util.concurrent.ThreadPoolExecutor$CallerRunsPolicy" /> </property> </bean>
3.建实体类
public class MailEntry { private String recipient;//可以是String[]数组,多个收件人 private String subject; private String text; public String getSubject() { return subject; } public void setSubject(String subject) { this.subject = subject; } public String getText() { return text; } public void setText(String text) { this.text = text; } public String getRecipient() { return recipient; } public void setRecipient(String recipient) { this.recipient = recipient; }
4.发送邮件的业务层实现
public class MailSendUtil { public static Logger logger = LoggerFactory.getLogger(MailSendUtil.class); private static final String[] configLocations = {"config/applicationContext-mail.xml"}; public static ApplicationContext ctx = new ClassPathXmlApplicationContext(configLocations); public TaskExecutor taskExecutor = (ThreadPoolTaskExecutor) ctx.getBean("taskExecutor"); public JavaMailSender javaMailSender = (JavaMailSender) ctx.getBean("cusMailSender"); public void sendMailToCus(MailEntry mailEntry) { MimeMessage message = javaMailSender.createMimeMessage(); try { //设置回执 //message.addHeader("Disposition-Notification-To", "1"); MimeMessageHelper helper = new MimeMessageHelper(message, true, "utf-8"); helper.setFrom(ActionMessage.getStaMessage("mail.customer.senderAddress")); helper.setSubject(mailEntry.getSubject()); //设置为TRUE则可以使用Html标记 helper.setText(mailEntry.getText(), true); helper.setTo(mailEntry.getRecipient()); addSendMailTask(mailEntry.getRecipient(), message); } catch (MessagingException e) { logger.error("邮件转换异常,邮件详细信息为", e.getMessage()); } } /** * @param email 邮箱地址 * @param message MimeMessage邮件封装类 * @desc 使用多线程发送邮件 */ private void addSendMailTask(final String email, final MimeMessage message) { try { taskExecutor.execute(new Runnable() { @Override public void run() { javaMailSender.send(message); long threadId = Thread.currentThread().getId(); logger.info("线程ID:"+threadId+"发送邮件:" + email); } }); } catch (Exception e) { logger.error(email + "邮件发送异常,邮件详细信息为", e.getMessage()); } } }
线程池中线程数量达到最大允许的线程数量,然后所有线程都同时进入空闲状态且空闲时间超过keepAliveTime,停止多余的线程并保留核心数量的线程
浙公网安备 33010602011771号