Skip to content

Commit 084823b

Browse files
committed
#204: Moved concurrent helper classes to separate package, cleaned up Runnable a little bit at the same time
1 parent 4032490 commit 084823b

File tree

4 files changed

+47
-24
lines changed

4 files changed

+47
-24
lines changed

src/main/java/org/simplejavamail/mailer/internal/mailsender/MailSender.java

+5-22
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66
import org.simplejavamail.email.Recipient;
77
import org.simplejavamail.mailer.MailerGenericBuilder;
88
import org.simplejavamail.mailer.config.TransportStrategy;
9+
import org.simplejavamail.mailer.internal.mailsender.concurrent.NamedRunnable;
10+
import org.simplejavamail.mailer.internal.mailsender.concurrent.NonJvmBlockingThreadPoolExecutor;
911
import org.simplejavamail.mailer.internal.socks.AuthenticatingSocks5Bridge;
1012
import org.simplejavamail.mailer.internal.socks.SocksProxyConfig;
1113
import org.simplejavamail.mailer.internal.socks.socks5server.AnonymousSocks5Server;
@@ -23,10 +25,7 @@
2325
import java.util.List;
2426
import java.util.Properties;
2527
import java.util.concurrent.ExecutorService;
26-
import java.util.concurrent.LinkedBlockingQueue;
2728
import java.util.concurrent.Phaser;
28-
import java.util.concurrent.ThreadPoolExecutor;
29-
import java.util.concurrent.TimeUnit;
3029

3130
import static java.lang.String.format;
3231
import static org.simplejavamail.converter.EmailConverter.mimeMessageToEML;
@@ -180,7 +179,7 @@ private static AnonymousSocks5Server configureSessionWithProxy(@Nonnull final Pr
180179
* @param async If false, this method blocks until the mail has been processed completely by the SMTP server. If true, a new thread is started to
181180
* send the email and this method returns immediately.
182181
* @throws MailException Can be thrown if an email isn't validating correctly, or some other problem occurs during connection, sending etc.
183-
* @see Executors#newFixedThreadPool(int)
182+
* @see NonJvmBlockingThreadPoolExecutor
184183
*/
185184
public final synchronized void send(final Email email, final boolean async) {
186185
/*
@@ -195,30 +194,14 @@ the proxy bridge server (or connection pool in async mode) while a non-async ema
195194
if (async) {
196195
// start up thread pool if necessary
197196
if (executor == null) {
198-
ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(
199-
operationalConfig.getThreadPoolSize(),
200-
operationalConfig.getThreadPoolSize(),
201-
operationalConfig.getThreadPoolTimeout(),
202-
TimeUnit.MILLISECONDS,
203-
new LinkedBlockingQueue<Runnable>(),
204-
new NamedThreadFactory("Simple Java Mail async mail sender")
205-
);
206-
if(operationalConfig.getThreadPoolTimeout() > 0) {
207-
threadPoolExecutor.allowCoreThreadTimeOut(true);
208-
}
209-
executor = threadPoolExecutor;
197+
executor = new NonJvmBlockingThreadPoolExecutor(operationalConfig, "Simple Java Mail async mail sender");
210198
}
211199
configureSessionWithTimeout(session, operationalConfig.getSessionTimeout());
212-
executor.execute(new Runnable() {
200+
executor.execute(new NamedRunnable("sendMail process") {
213201
@Override
214202
public void run() {
215203
sendMailClosure(session, email);
216204
}
217-
218-
@Override
219-
public String toString() {
220-
return "sendMail process";
221-
}
222205
});
223206
} else {
224207
sendMailClosure(session, email);
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package org.simplejavamail.mailer.internal.mailsender.concurrent;
2+
3+
public abstract class NamedRunnable implements Runnable {
4+
private final String name;
5+
6+
protected NamedRunnable(String name) {
7+
this.name = name;
8+
}
9+
10+
@Override
11+
public String toString() {
12+
return name;
13+
}
14+
}

src/main/java/org/simplejavamail/mailer/internal/mailsender/NamedThreadFactory.java src/main/java/org/simplejavamail/mailer/internal/mailsender/concurrent/NamedThreadFactory.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package org.simplejavamail.mailer.internal.mailsender;
1+
package org.simplejavamail.mailer.internal.mailsender.concurrent;
22

33
import javax.annotation.Nonnull;
44
import java.util.concurrent.ThreadFactory;
@@ -12,7 +12,7 @@ class NamedThreadFactory implements ThreadFactory {
1212
private final ThreadGroup group;
1313
private final String threadName;
1414

15-
NamedThreadFactory(@Nonnull final String threadName) {
15+
public NamedThreadFactory(@Nonnull final String threadName) {
1616
SecurityManager s = System.getSecurityManager();
1717
group = (s != null) ? s.getThreadGroup() : currentThread().getThreadGroup();
1818
this.threadName = threadName;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package org.simplejavamail.mailer.internal.mailsender.concurrent;
2+
3+
import org.simplejavamail.mailer.internal.mailsender.OperationalConfig;
4+
5+
import java.util.concurrent.LinkedBlockingQueue;
6+
import java.util.concurrent.ThreadPoolExecutor;
7+
import java.util.concurrent.TimeUnit;
8+
9+
/**
10+
* @see ThreadPoolExecutor
11+
* @see LinkedBlockingQueue
12+
* @see NamedThreadFactory
13+
*/
14+
public class NonJvmBlockingThreadPoolExecutor extends ThreadPoolExecutor {
15+
public NonJvmBlockingThreadPoolExecutor(OperationalConfig operationalConfig, String threadNamePrefix) {
16+
super(operationalConfig.getThreadPoolSize(),
17+
operationalConfig.getThreadPoolSize(),
18+
operationalConfig.getThreadPoolTimeout(),
19+
TimeUnit.MILLISECONDS,
20+
new LinkedBlockingQueue<Runnable>(),
21+
new NamedThreadFactory(threadNamePrefix));
22+
if (operationalConfig.getThreadPoolTimeout() > 0) {
23+
allowCoreThreadTimeOut(true);
24+
}
25+
}
26+
}

0 commit comments

Comments
 (0)