diff --git a/application/src/main/java/org/thingsboard/server/service/mail/DefaultMailService.java b/application/src/main/java/org/thingsboard/server/service/mail/DefaultMailService.java index fea3d25239..aa8e019317 100644 --- a/application/src/main/java/org/thingsboard/server/service/mail/DefaultMailService.java +++ b/application/src/main/java/org/thingsboard/server/service/mail/DefaultMailService.java @@ -85,10 +85,8 @@ public class DefaultMailService implements MailService { @Autowired private MailExecutorService mailExecutorService; - @Value("${actors.rule.mail_timeout_thread_pool_size}") - private int timeoutExecutorPoolSize; - - private ExecutorService timeoutExecutorService; + @Autowired + private PasswordResetExecutorService passwordResetExecutorService; private JavaMailSenderImpl mailSender; @@ -106,14 +104,6 @@ public class DefaultMailService implements MailService { @PostConstruct private void init() { updateMailConfiguration(); - timeoutExecutorService = Executors.newFixedThreadPool(timeoutExecutorPoolSize); - } - - @PreDestroy - private void destroy() { - if (timeoutExecutorService != null) { - timeoutExecutorService.shutdown(); - } } @Override @@ -252,7 +242,7 @@ public class DefaultMailService implements MailService { @Override public void sendResetPasswordEmailAsync(String passwordResetLink, String email) { - mailExecutorService.execute(() -> { + passwordResetExecutorService.execute(() -> { try { this.sendResetPasswordEmail(passwordResetLink, email); } catch (ThingsboardException e) { @@ -489,9 +479,8 @@ public class DefaultMailService implements MailService { } private void sendMailWithTimeout(JavaMailSender mailSender, MimeMessage msg, long timeout) { - var submittedMail = timeoutExecutorService.submit(() -> mailSender.send(msg)); try { - submittedMail.get(timeout, TimeUnit.MILLISECONDS); + mailExecutorService.submit(() -> mailSender.send(msg)).get(timeout, TimeUnit.MILLISECONDS); } catch (TimeoutException e) { log.debug("Error during mail submission", e); throw new RuntimeException("Timeout!"); diff --git a/application/src/main/java/org/thingsboard/server/service/mail/PasswordResetExecutorService.java b/application/src/main/java/org/thingsboard/server/service/mail/PasswordResetExecutorService.java new file mode 100644 index 0000000000..ea761c144d --- /dev/null +++ b/application/src/main/java/org/thingsboard/server/service/mail/PasswordResetExecutorService.java @@ -0,0 +1,33 @@ +/** + * Copyright © 2016-2022 The Thingsboard Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.thingsboard.server.service.mail; + +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; +import org.thingsboard.common.util.AbstractListeningExecutor; + +@Component +public class PasswordResetExecutorService extends AbstractListeningExecutor { + + @Value("${actors.rule.mail_password_reset_thread_pool_size:10}") + private int mailExecutorThreadPoolSize; + + @Override + protected int getThreadPollSize() { + return mailExecutorThreadPoolSize; + } + +} diff --git a/application/src/main/resources/thingsboard.yml b/application/src/main/resources/thingsboard.yml index ab88a186cd..e152d58fd2 100644 --- a/application/src/main/resources/thingsboard.yml +++ b/application/src/main/resources/thingsboard.yml @@ -327,8 +327,8 @@ actors: js_thread_pool_size: "${ACTORS_RULE_JS_THREAD_POOL_SIZE:50}" # Specify thread pool size for mail sender executor service mail_thread_pool_size: "${ACTORS_RULE_MAIL_THREAD_POOL_SIZE:40}" - # Specify thread pool size for mail sender executor service - mail_timeout_thread_pool_size: "${ACTORS_RULE_MAIL_TIMEOUT_THREAD_POOL_SIZE:10}" + # Specify thread pool size for password reset emails + mail_password_reset_thread_pool_size: "${ACTORS_RULE_MAIL_PASSWORD_RESET_THREAD_POOL_SIZE:10}" # Specify thread pool size for sms sender executor service sms_thread_pool_size: "${ACTORS_RULE_SMS_THREAD_POOL_SIZE:50}" # Whether to allow usage of system mail service for rules diff --git a/common/util/src/main/java/org/thingsboard/common/util/AbstractListeningExecutor.java b/common/util/src/main/java/org/thingsboard/common/util/AbstractListeningExecutor.java index edace3cee5..f7da0b07a7 100644 --- a/common/util/src/main/java/org/thingsboard/common/util/AbstractListeningExecutor.java +++ b/common/util/src/main/java/org/thingsboard/common/util/AbstractListeningExecutor.java @@ -49,6 +49,10 @@ public abstract class AbstractListeningExecutor implements ListeningExecutor { return service.submit(task); } + public ListenableFuture executeAsync(Runnable task) { + return service.submit(task); + } + @Override public void execute(Runnable command) { service.execute(command); diff --git a/common/util/src/main/java/org/thingsboard/common/util/ListeningExecutor.java b/common/util/src/main/java/org/thingsboard/common/util/ListeningExecutor.java index 2726868f19..5898a9c944 100644 --- a/common/util/src/main/java/org/thingsboard/common/util/ListeningExecutor.java +++ b/common/util/src/main/java/org/thingsboard/common/util/ListeningExecutor.java @@ -24,8 +24,14 @@ public interface ListeningExecutor extends Executor { ListenableFuture executeAsync(Callable task); + ListenableFuture executeAsync(Runnable task); + default ListenableFuture submit(Callable task) { return executeAsync(task); } + default ListenableFuture submit(Runnable task) { + return executeAsync(task); + } + }