我有一个cronjob,
users
id company_id
1 1
2 1
...
10000 1
cron_events
id event_name company_id
1 birthday_party 1
所以我需要向公司1的所有用户发送电子邮件,
我知道怎么做一个,
但我想通过多线程概念来做到这一点,我是线程概念的新手,任何人都可以指导我这个,
这是我现有的代码,
这是我的Controller类
@Scheduled(fixedDelay = 15000)
public void sendNotificationToUser() {
Future<Boolean> sendNotificationToUser = cronService.sendNotificationToUser();
if (sendNotificationToUser.isDone()) {
logger.info(
"-->Notification [Sent] to Patient ");
}
}
这是我的实现类
@Async
@Transactional
public Future<Boolean> sendNotificationToUser() {
logger.info("-->in the function of sendNotificationToUser Function");
List<User> users = cronReferralRepository.findByCompanyIdAndActive(1L, true);
for (User user : users) {
Future<Boolean> futureCampaignCreated = processUser(user);
}
return new AsyncResult<Boolean>(true);
}
@Async
private Future<Boolean> processUser(User user) {
System.out.println("Thread Name --> " + Thread.currentThread().getName());
Long userId = user.getId();
String patientFirstName = null;
String patientLastName = null;
if (user != null) {
patientFirstName = user.getFirstName();
patientLastName = user.getLastName();
}
String patientFullName = patientFirstName + " " + patientLastName;
//send mail code
...
}
仍然我的线程打印相同的线程名称,它是如何可能的,但我期待一个不同的线程名称,
答案 0 :(得分:0)
多线程本质上意味着在并行线程上运行代码。 不是执行顺序代码,而是将此执行分成多个分支。
Main thread Main thread
| |
| |
| |__ __ __
| send mail M1 | | | |
| send mail M2 --> | M1 | M3
| send mail M2 * M2
| send mail M3
|
|
*
默认情况下,您的代码使用单个线程,但是当调用@Asynch方法时,将在新线程中处理此方法的执行。
我认为您想要实现的是以并行线程发送邮件,每个用户一个。 但是,在您的代码中,为了利用多个线程,您必须在调用@asynch方法之前移动for循环,以便每次调用此方法都将创建一个新线程。
@Asynch创建的每个线程都被&#34;销毁&#34;只要@asynch方法完成。
现在主线程可以等待所有被调用的@asynch的结束,或者不是根据您的要求。 您是否需要等待所有邮件都被发送? 或者您是否想在调用@Asynch方法后立即执行主线程执行?
案例1 等待发送所有邮件。
Main thread
|
|
|__ __ __
° | | |
° M1 | M3
| M2
|
|
|
*
案例2 处理执行而不等待线程结果。
Main thread
|
|
|__ __ __
| | | |
| M1 | M3
| M2
|
*
在你回答完这些问题之后,请进一步阅读有关未来和 线程连接。
请记住,使用spring boot,您可以轻松配置并行线程数,队列大小和其他有用设置。