eg:异步发送邮箱通知
public interface SendEmailService {
/**
* 发送邮件
*
* @param emailDTO 邮件对象
*/
void sendEmail(EmailDTO emailDTO);
}
接着是邮件发送的简单实现类:
@Service
public class SendEmailServiceImpl implements SendEmailService {
@Resource
private ExecutorService emailTaskPool;
@Override
public void sendEmail(EmailDTO emailDTO) {
emailTaskPool.submit(() -> {
try {
System.out.printf("sending email .... emailDto is %s \n", emailDTO);
Thread.sleep(1000);
System.out.println("sended success");
} catch (InterruptedException e) {
e.printStackTrace();
}
});
}
}
邮件的发送逻辑通过一个简单的线程睡眠来模拟发送过程中的耗时操作。
然后是线程池方面的配置:
@Configuration
public class ThreadPoolConfig {
@Bean
public ExecutorService emailTaskPool() {
return new ThreadPoolExecutor(2, 4,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>());
}
}
controller模块的触发
@RestController
@RequestMapping(value = "/test")
public class TestController {
@Resource
private SendEmailService sendEmailService;
@GetMapping(value = "/send-email")
public boolean sendEmail() {
EmailDTO emailDTO = new EmailDTO();
emailDTO.setContent("测试文案");
emailDTO.setReceiver("idea");
emailDTO.setTitle("邮件标题");
sendEmailService.sendEmail(emailDTO);
return true;
}
}
有返回值的,并且调用线程池的线程去执行业务:
@Resource
private ExecutorService emailTaskPool;
@Override
public List<TUser> returnData() {
//创建线程池
//ExecutorService pool = Executors.newSingleThreadExecutor();
//定义Callable
Callable<List<TUser>> callable = new Callable() {
@Override
public Object call() throws Exception {
List<TUser> tUsers = userMapper.selectList(null);
return tUsers;
}
};
//返回Future,实际上是FutureTask实例
Future<List<TUser>> future = emailTaskPool.submit(callable);
try {
List<TUser> list = future.get();
return list;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}