DefaultMailService with timeout by mail-service-watchdog
This commit is contained in:
		
							parent
							
								
									b8480cd456
								
							
						
					
					
						commit
						38d37224f3
					
				@ -16,6 +16,7 @@
 | 
			
		||||
package org.thingsboard.server.service.mail;
 | 
			
		||||
 | 
			
		||||
import com.fasterxml.jackson.databind.JsonNode;
 | 
			
		||||
import com.google.common.util.concurrent.Futures;
 | 
			
		||||
import freemarker.template.Configuration;
 | 
			
		||||
import freemarker.template.Template;
 | 
			
		||||
import jakarta.xml.bind.DatatypeConverter;
 | 
			
		||||
@ -32,6 +33,7 @@ import org.springframework.mail.javamail.JavaMailSenderImpl;
 | 
			
		||||
import org.springframework.mail.javamail.MimeMessageHelper;
 | 
			
		||||
import org.springframework.stereotype.Service;
 | 
			
		||||
import org.springframework.ui.freemarker.FreeMarkerTemplateUtils;
 | 
			
		||||
import org.thingsboard.common.util.ThingsBoardThreadFactory;
 | 
			
		||||
import org.thingsboard.rule.engine.api.MailService;
 | 
			
		||||
import org.thingsboard.rule.engine.api.TbEmail;
 | 
			
		||||
import org.thingsboard.server.cache.limits.RateLimitService;
 | 
			
		||||
@ -53,11 +55,14 @@ import org.thingsboard.server.dao.settings.AdminSettingsService;
 | 
			
		||||
import org.thingsboard.server.service.apiusage.TbApiUsageStateService;
 | 
			
		||||
 | 
			
		||||
import jakarta.annotation.PostConstruct;
 | 
			
		||||
import jakarta.annotation.PreDestroy;
 | 
			
		||||
import jakarta.mail.internet.MimeMessage;
 | 
			
		||||
import java.io.ByteArrayInputStream;
 | 
			
		||||
import java.util.HashMap;
 | 
			
		||||
import java.util.Locale;
 | 
			
		||||
import java.util.Map;
 | 
			
		||||
import java.util.concurrent.Executors;
 | 
			
		||||
import java.util.concurrent.ScheduledExecutorService;
 | 
			
		||||
import java.util.concurrent.TimeUnit;
 | 
			
		||||
import java.util.concurrent.TimeoutException;
 | 
			
		||||
 | 
			
		||||
@ -94,6 +99,8 @@ public class DefaultMailService implements MailService {
 | 
			
		||||
    @Value("${mail.per_tenant_rate_limits:}")
 | 
			
		||||
    private String perTenantRateLimitConfig;
 | 
			
		||||
 | 
			
		||||
    private final ScheduledExecutorService scheduler;
 | 
			
		||||
 | 
			
		||||
    private TbMailSender mailSender;
 | 
			
		||||
 | 
			
		||||
    private String mailFrom;
 | 
			
		||||
@ -105,6 +112,7 @@ public class DefaultMailService implements MailService {
 | 
			
		||||
        this.freemarkerConfig = freemarkerConfig;
 | 
			
		||||
        this.adminSettingsService = adminSettingsService;
 | 
			
		||||
        this.apiUsageClient = apiUsageClient;
 | 
			
		||||
        this.scheduler = Executors.newScheduledThreadPool(1, ThingsBoardThreadFactory.forName("mail-service-watchdog"));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @PostConstruct
 | 
			
		||||
@ -112,6 +120,13 @@ public class DefaultMailService implements MailService {
 | 
			
		||||
        updateMailConfiguration();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @PreDestroy
 | 
			
		||||
    public void destroy() {
 | 
			
		||||
        if (scheduler != null) {
 | 
			
		||||
            scheduler.shutdownNow();
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void updateMailConfiguration() {
 | 
			
		||||
        AdminSettings settings = adminSettingsService.findAdminSettingsByKey(TenantId.SYS_TENANT_ID, "mail");
 | 
			
		||||
@ -429,8 +444,11 @@ public class DefaultMailService implements MailService {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private void sendMailWithTimeout(JavaMailSender mailSender, MimeMessage msg, long timeout) {
 | 
			
		||||
        var submittedMail = Futures.withTimeout(
 | 
			
		||||
                mailExecutorService.submit(() -> mailSender.send(msg)),
 | 
			
		||||
                timeout, TimeUnit.MILLISECONDS, scheduler);
 | 
			
		||||
        try {
 | 
			
		||||
            mailExecutorService.submit(() -> mailSender.send(msg)).get(timeout, TimeUnit.MILLISECONDS);
 | 
			
		||||
            submittedMail.get(timeout, TimeUnit.MILLISECONDS);
 | 
			
		||||
        } catch (TimeoutException e) {
 | 
			
		||||
            log.debug("Error during mail submission", e);
 | 
			
		||||
            throw new RuntimeException("Timeout!");
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user