package com.lian.asearch.report.commons;
import com.lian.asearch.queue.MemoryQueue4Sink;
import com.lian.asearch.queue.MessageQueue4Sink;
import com.google.common.base.Throwables;
import com.google.common.eventbus.EventBus;
import com.google.common.eventbus.Subscribe;
import com.google.inject.Singleton;
import com.google.inject.name.Named;
import jodd.mail.Email;
import jodd.mail.SendMailSession;
import jodd.mail.SmtpServer;
import org.omg.CORBA.TIMEOUT;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.inject.Inject;
import java.net.SocketTimeoutException;
import java.util.Arrays;
import java.util.concurrent.Semaphore;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicBoolean;
/**
* TODO::Document me
*
* @author Lian
* @version V1
* @since 2015-09-24 17:58
*/
@Singleton
public class EmailHelper {
private final String useName;
private final String password;
private final String host;
private static final Logger log = LoggerFactory.getLogger(EmailHelper.class);
private static final MessageQueue4Sink<Email> emailQueue = new MemoryQueue4Sink<>(100);
private static AtomicBoolean isRunning = new AtomicBoolean(true);
@Inject
public EmailHelper(@Named("Email.userName") String useName,
@Named("Email.password") String password,
@Named("Email.smtpHostName") String host) {
this.useName = useName;
this.password = password;
this.host = host;
initMailSession();
new SendThread().start();
}
public String getUseName() {
return useName;
}
public void sendEmail(Email email) {
emailQueue.offer(email);
}
public SendMailSession initMailSession() {
SmtpServer smtpServer = SmtpServer
.create(this.host, 25)
.property("mail.smtp.auth", "true")
.authenticateWith(this.useName, this.password);
SendMailSession session = smtpServer.createSession();
session.open();
return session;
}
private String _retryingSendMail(SendMailSession session, Email email, int numTries, int tryNum) {
if (tryNum > numTries) {
log.error("send email {},after trying :{} times, error,forget it", Arrays.toString(email.getTo()), tryNum);
return null;
}
try {
return session.sendMail(email);
} catch (IllegalStateException e) {
log.info("send email {},after trying :{} times,error:{} ", Arrays.toString(email.getTo()), tryNum, Throwables.getStackTraceAsString(e));
session = reConnect();
return _retryingSendMail(session, email, numTries, tryNum + 1);
} catch (Exception e) {
log.error("send mail :{} , error:{}", Arrays.toString(email.getTo()), e.getMessage());
return null;
}
}
private SendMailSession reConnect() {
SendMailSession session = initMailSession();
log.info("reconnect smtp server....done");
return session;
}
public void close() {
isRunning.set(false);
}
private class SendThread extends Thread {
@Override
public void run() {
while (isRunning.get()) {
Email email = null;
try {
email = emailQueue.poll(10, TimeUnit.HOURS);
if (email != null) {
log.debug("Get email :{}", email);
SendMailSession session = null;
try {
session = initMailSession();
String messageId = _retryingSendMail(session, email, 2, 1);
log.info("send email :{} success with messageId: {}", Arrays.toString(email.getTo()), messageId);
TimeUnit.SECONDS.sleep(2);
} finally {
if (session != null) {
session.close();
}
}
}
} catch (Throwable e) {
if (email != null) {
if (e instanceof SocketTimeoutException) {
emailQueue.offer(email);
log.info("send email error email:{}:message:{} enqueue again", Arrays.toString(email.getTo()), e.getMessage());
} else {
log.error("send email error email:{}:message:{}", Arrays.toString(email.getTo()), e.getMessage());
}
}
}
}
}
}
public static void main(String[] args) throws InterruptedException {
// EmailHelper helper = new EmailHelper("enterprise@lian.com", "123456", "smtp.qiye.163.com");
// for (int i = 0; i < 10; i++) {
// new Thread(() -> {
// helper.sendEmail(Email.create().from(helper.getUseName()).to("huayi.chen@lian.com").subject("abc").addText("xxxxxxxxxxxxxxxxxxxx"));
// }).start();
// }
// TimeUnit.SECONDS.sleep(50);
// helper.close();
EventBus eventBus = new EventBus("test");
class EventListener {
public int lastMessage = 0;
@Subscribe
public void listen(String event) {
System.out.println("Message:" + event + "--->" + Thread.currentThread().getName());
}
public int getLastMessage() {
return lastMessage;
}
;
}
eventBus.register(new EventListener());
eventBus.post("300");
}
}
转载于:https://my.oschina.net/yangchunlian/blog/800598