非同期タスク
バックグラウンド
たとえば、私たちのビジネス処理では、処理が完了するまでに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秒待ってから値を返すことを確認します。
- 問題が解決しました
この問題を解決するには、非同期メソッドを使用してください。
最初にスタートアップクラス@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秒ごとに実行されます。