SpringBootの非同期タスク、電子メール、およびタイミングタスク

非同期タスク

バックグラウンド

たとえば、私たちのビジネス処理では、処理が完了するまでに3秒かかりますが、ユーザーに3秒待たせる必要がある場合は、エクスペリエンスが非常に悪いため、非同期メソッドを使用して処理します。これは、スレッドを介して処理できます。プールですが、スレッドを作成する必要があり、springbootはデフォルトでこの機能を提供しているので、使用できるようにする必要があります。

特定の用途

  • プロジェクトを作成する

基本的なspringbootプロジェクトを作成し、Webの依存関係を追加するだけです。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
  • 上記の背景をシミュレートするシーンを作成します

サービス層:

@Service
public class AsyncService {

    public void sync(){
        try {
            TimeUnit.SECONDS.sleep(3);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        System.out.println("方法中在执行中");
    }

    public void async(){
        try {
            TimeUnit.SECONDS.sleep(3);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        System.out.println("方法中在执行中");
    }
}

コントローラ層:

@RestController
public class AsyncController {

    @Autowired
    private AsyncService asyncService;

    @GetMapping("/sync")
    public String sync(){
        asyncService.sync();

        return "处理完成";
    }

    @GetMapping("/async")
    public String async(){
        asyncService.async();

        return "处理完成";
    }

}
  • プロジェクトを開始し、テストします

localhost:8080 / syncを要求し、それが向きを変えて3秒待ってから値を返すことを確認します。

SpringBootの非同期タスク、電子メール、およびタイミングタスク

  • 問題が解決しました

この問題を解決するには、非同期メソッドを使用してください。

最初にスタートアップクラス@EnableAsyncで非同期をオンにしてから、呼び出されるメソッドにアノテーション@Asyncを追加します

# 启动类
 @SpringBootApplication
@EnableAsync
public class MyApplication {
    public static void main(String[] args) {
        SpringApplication.run(MyApplication.class, args);
    }
}
#方法
    @Async
    public void async(){
        try {
            TimeUnit.SECONDS.sleep(3);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        System.out.println("方法中在执行中");
    }

次に、ocalhost:8080 / asyncを再度要求したところ、メソッドがすぐに返されることがわかりました。これが非同期タスクの実現です。

メールタスク

バックグラウンド

メールタスクは、springbootが提供するメールスターターを介して実現されます。

特定の用途

  • 依存関係を追加する
<!--mail-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-mail</artifactId>
        </dependency>
  • 構成ファイル
[email protected]
spring.mail.password=你的qq授权码
spring.mail.host=smtp.qq.com
# qq需要配置ssl
spring.mail.properties.mail.smtp.ssl.enable=true

認証コードを取得します。QQメールボックス設定->アカウント-> pop3およびsmtpサービスを開きます。

  • 春のユニットテスト
@Autowired
JavaMailSenderImpl mailSender;

@Test
public void contextLoads() {
   //邮件设置1:一个简单的邮件
   SimpleMailMessage message = new SimpleMailMessage();
   message.setSubject("通知-明天来上班");
   message.setText("今晚7:30开会");

   message.setTo("[email protected]");
   message.setFrom("[email protected]");
   mailSender.send(message);
}

@Test
public void contextLoads2() throws MessagingException {
   //邮件设置2:一个复杂的邮件
   MimeMessage mimeMessage = mailSender.createMimeMessage();
   MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true);

   helper.setSubject("通知-明天吃饭");
   helper.setText("<b style='color:red'>今天 7:30来开会</b>",true);

   //发送附件
   helper.addAttachment("1.jpg",new File(""));
   helper.addAttachment("2.jpg",new File(""));

   helper.setTo("[email protected]");
   helper.setFrom("[email protected]");

   mailSender.send(mimeMessage);

時限タスク

バックグラウンド

指定された時間またはシーンでコードを実行します。

関連するクラスとアノテーション

TaskScheduler  : 任务调度者
TaskExecutor   :任务执行者
@EnableScheduling  : 开启定时功能的注解
@schedule       :什么时候执行

特定の用途

springbootのWeb依存関係がインポートされている限り、この関数はデフォルトでインポートされ、再度インポートする必要はありません。

cron式については、他の記事を参照してください:Springでの@scheduleアノテーションの使用

  • スタートアップクラスにアノテーション@EnableSchedulingを追加します
@SpringBootApplication
@EnableAsync
@EnableScheduling
public class MyApplication {
    public static void main(String[] args) {
        SpringApplication.run(MyApplication.class, args);
    }
}
  • サービス層の書き込み方法
@Service
public class ScheduleService {

    public void testSchedule(){
        System.out.println("任务被执行了");
    }
}
  • コメントを追加@Scheduled

cron式は、私の別のブログを参照できます。春に@scheduleアノテーションを使用します。これは、一定の期間内に実行されます。

@Service
public class ScheduleService {

    /**
     * 每隔10s执行一次
     */
    @Scheduled(cron = "0/10 * * * * ?")
    public void testSchedule(){
        System.out.println(LocalDateTime.now()+"任务被执行了");
    }
}
  • 結果

精度を検証するために10秒ごとに実行されます。

SpringBootの非同期タスク、電子メール、およびタイミングタスク

おすすめ

転載: blog.csdn.net/doubututou/article/details/112765499