【问题标题】:making threading concept with spring boot用弹簧靴制作线程概念
【发布时间】:2017-09-14 09:25:18
【问题描述】:

我有一个 cronjob,

users
id      company_id 
1       1
2       1
...
10000   1 

cron_events

id event_name       company_id
1  birthday_party   1

所以这里我需要向公司 1 的所有用户发送电子邮件,

我知道如何做到这一点,

但我想通过多线程概念来做到这一点,我是线程概念的新手,任何人都可以指导我,

这是我现有的代码,

这是我的控制器类

@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
...
}

我的线程仍然打印相同的线程名称,这怎么可能,但我期待不同的线程名称,

【问题讨论】:

    标签: java spring multithreading spring-boot java-threads


    【解决方案1】:

    多线程本质上意味着在并行线程上运行代码。 您无需按顺序执行代码,而是将此执行拆分为多个分支。

    Main thread Main thread | | | | | |__ __ __ | send mail M1 | | | | | send mail M2 --> | M1 | M3 | send mail M2 * M2 | send mail M3 | | *

    默认情况下,您的代码利用单个线程,但当调用 @Asynch 方法时,此方法的执行将在新线程中处理。

    我认为您想要实现的是在并行线程中发送邮件,每个用户一个。 但是,在您的代码中,为了利用多个线程,您必须在调用 @asynch 方法之前移动 for 循环,以便每次调用此方法都会创建一个新线程。

    @Asynch 方法创建的每个线程都会在 @asynch 方法完成后立即“销毁”。

    现在主线程可以等待所有调用的@asynch结束,或者不根据你的要求。 您是否需要等待所有邮件都已发送? 还是您想在调用@Asynch 方法后立即继续执行主线程?

    案例 1 等待发送所有邮件。

    Main thread | | |__ __ __ ° | | | ° M1 | M3 | M2 | | | *

    案例 2 在不等待线程结果的情况下继续执行。

    Main thread | | |__ __ __ | | | | | M1 | M3 | M2 | *

    在您回答了这些问题后,请进一步阅读 Future 和 线程连接。

    请记住,使用 Spring Boot,您可以轻松配置并行线程的数量、队列大小和其他有用的设置。

    【讨论】:

    • 非常感谢,对线程概念有了一些了解,正如你所说,我正在阅读 Future and Thread joins
    • 正如你所说,我已经编辑了一些代码,但我仍然得到相同的线程名称
    • 在单独的类中添加 processUser 并调用它后,对我有用。我也做了
    • for (User user : users) { CompletableFuture futuredone = (CompletableFuture) testAsyncService.processUser(user); System.out.println("未来完成" + futuredone); } 但我怎么能找到,所有的线程都完成了
    • 新线程在@asynch 方法中生成。考虑到如果从同一类中的方法调用异步方法或者如果它是私有方法,则异步方法将不起作用。所以你必须重构你的代码。
    猜你喜欢
    • 1970-01-01
    • 2017-12-22
    • 2018-02-14
    • 2019-05-03
    • 2021-04-20
    • 1970-01-01
    • 2023-01-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多