Как переместить почтовый сервис в поток?

Я использую Feign для подключения двух микросервисов. Один из них составляет письмо, а другой отправляет его.

Это почтовый клиент:

@FeignClient("holiday-client")
public interface EmailClient {
    @RequestMapping(value = "/api/email/sendEmail", method = RequestMethod.POST)
    void sendEmail(@RequestBody Email email);
}

Сервис, на котором составляется письмо:

@Service
public class EmailService {
    @Autowired
    private EmailClient emailClient;

    public void sendEmailForNewCampaign() {
        String to, subject, body;

        to = "[email protected]";
        subject = "A new campaign has started";
        body = "This email has the purpose to inform you that a new campaign has been started. Please start your own performance reviews until it ends.";
        Email email = new Email(to, subject, body);
        emailClient.sendEmail(email);
    }
}

И контроллер из другого микросервиса, который фактически отправляет электронное письмо:

@RestController
public class EmailController {

    @Autowired
    private EmailSender emailSender;

    @RequestMapping(value = "/api/email/sendEmail", method = RequestMethod.POST)
    public ResponseEntity sendEmail(@RequestBody Email email) {
        System.out.println(email); //printed 5 times
        emailSender.sendMail(email.getTo(), email.getSubject(), email.getBody());
        return new ResponseEntity(HttpStatus.ACCEPTED);
    }
}

Кажется, что этот API вызывается 5 раз, пока письмо не будет обработано и отправлено. Это работает, потому что я получаю 5 электронных писем, но я также получил исключение SocketTimeOutException. Проблема в том, что клиент слишком долго ждет, пока служба электронной почты отправит почту, а я этого не хочу. Как я могу переместить метод sendMail в поток, чтобы решить эту проблему?


person Gustavo    schedule 24.10.2016    source источник


Ответы (1)


Используйте аннотацию @Async в своей службе (или методе).

@Service
@Async
public class EmailService 

Не забывайте @EnableAsync

person Sergey Bulavkin    schedule 28.10.2016