springbootにおけるswagger、非同期/タイミング/メールタスクの問題
1、SprigBoot:Swaggerの最終版を集めます。
学習目標: Swaggerの概念と作用を理解します。 プロジェクトにおけるSwaggarの集積によるAPI文書の自動生成を把握する 。
1.1、Swagger概要
前後端分離フロントエンド->フロントエンド制御層、ビュー層 バックエンド->バックエンド制御層、サービス層、データアクセス層 の前後にAPIを介して相互作用する 。前後端は独立しており、松結合 発生する問題前後に集積され、フロントエンドまたはバックエンドが「適時に協議し、早期に解決する」ことができなくなり、最終的に問題が集中的に爆発した。
ソリューション は、まずschema[計画の概要]を定義し、最新のAPIをリアルタイムで追跡し、統合リスクを低減する 。
スワッグは、世界で最も人気のあるAPIの枠組み と名乗っています。 Restful App文書オンライン自動生成器=>API文書とAPI定義が同期して更新された 直接実行し、オンラインテストAPI は多言語(例えば、Java、PHPなど)をサポートしています。 公式サイト:https://swagger.io/ 1.2、Spring Boot統合Swagger
SpringBoot Swager=>スプリングフォックス、二つのjarバッグ Sprigfox-swager 2 swager-sprigmvc Swaggerを使う
要求:jdk 1.8+さもなければswagger 2は運行できません。
ステップ:
1、SpringBoot-webプロジェクトを新規作成する
2、Maven依存追加
4、Swaggerを使用するには、配置類-Swagger Configを作成してSwaggerを配置する必要があります。
重要なのは、ドキュメント名と説明を書くことです。すなわち、AppInfoは参構造の最初の2つのパラメータがあります。
1.3、Swaggerの配置
1、SwaggarのインスタンスBeanはDocetであるため、Docetのインスタンスを設定することによってSwaggagerを配置する。
1.4、スキャンインターフェースの設定
1、Docetを構築する時、select()方法でインターフェースをどのようにスキャンしますか?
3、スキャンインターフェースをパッケージパスで構成する以外に、他の方法でインターフェースをスキャンすることもできます。ここですべての構成を説明します。
1、enable()の方法でswaggarを有効にするかどうか、falseであれば、swaggerはブラウザからアクセスできなくなります。
enableチェーンプログラミング
4、配置ファイルでも実現できますが、画面だけが友好的ではないことを示します。
appication.properties
1.6、APIパケットの構成
1、パケットが設定されていない場合、デフォルトはdefaultです。グループをグループ化することができます。
3、どのように複数のグループを構成しますか?複数のパケットを設定するには、複数のdocketを設定するだけでよい。
1.7、エンティティ構成
1、エンティティクラスを新規作成する
注:@AppModelという注釈でエンティティがここに表示されたわけではなく、インターフェースメソッドの返却値に表示されているエンティティがここに表示されている限り、@App Modelと@App Model Propertyの2つの注釈はエンティティに注釈を加えただけです。
@AppModelはクラスにコメントを追加します。
@AppModelPropertyはクラス属性にコメントを追加します。
1.8、常用注釈
Swaggerのすべての注釈はio.swagger.annotationsによって定義されています。
以下にいくつかのよく使われているものを列挙していないものは別途に説明を調べることができます。
Swaggerコメント
簡単に説明する
@App(tags=「xxxモジュール説明」)
モジュールクラスに作用します。
@Apple Operation(「xxxインターフェース説明」)
インターフェースの方法に作用します。
@AppModel(「xxPOJO説明」)
モデルクラスに作用します。VO、BOなどです。
@Apple ModelProperty(value=「xxx属性説明」、hidden=true)
クラスの方法と属性において、hiddenはtrueに設定されています。この属性を隠すことができます。
@App Param(「xxxパラメータ説明」)
パラメータ、方法、フィールドに作用します。
要求されたインターフェースに注釈を配置することもできます。
controlerにコメントを追加します。
従来のPostmanやCurl方式のテストインターフェースに比べて、swaggerを使うとまるでおバカみたいな操作です。文書を追加的に説明する必要はないです。また間違いにくいです。データを入力してExecuteをクリックするだけで、自動化フレームに協力すれば、基本的に人が操作する必要はないと言えます。
Swaggerは優秀なツールです。今は国内で多くの中小インターネット会社が利用しています。伝統的なWordインターフェースの文書を先に出してからテストする方式に比べて、明らかにこれも現在の急速な反復開発の相場に合致しています。もちろんです。正式な環境ではSwaggarをオフにしてください。安全性を考慮して運行時のメモリも節約できます。
まとめ:
1、私達はswaggerを通じて、理解しにくい属性やインターフェースを提供し、注釈情報を追加することができます。
2、インターフェースドキュメントをリアルタイムで更新する
3、オンラインテストができます。
1.9、開拓:その他の皮膚
異なるバッグを導入して、異なる肌の定義を実現できます。
1、デフォルトのアクセスhttp://localhost:8080/swagger-ui/
2、bootstrap-ui訪問http://localhost:8080/doc.html
3、Layui-ui訪問http://localhost:8080/docs.html
4、mg-uiアクセスhttp://localhost:8080/document.html
2、SpringBoot:非同期、タイミング、メールタスク
2.1、非同期タスク
データを処理しているふりをして、スレッドを使って遅延を設定し、同期待ちの場合をシミュレーションします。
4、Aync Controller類を編纂する
私たちはControllerを書いてテストします。
問題:ユーザーに直接メッセージをもらいたいなら、バックグラウンドでマルチスレッドを使って処理すればいいですが、毎回自分でマニュアルでマルチスレッドを作成する必要があります。面倒くさいです。簡単な方法を使うだけでいいです。
6、ハローメソッドに@Async注釈を追加する;
AyncServiceのhelloメソッドが完了するまで待つ必要はなく、次のような文が続けられます。
2.2、メールジョブ
メール送信は、私達の日常開発にも多く、Springbootもサポートメールを送ってくれました。spring-book-start-mailを導入する必要があります。
Spring Boot自動配置Mail Sender AutoConfigration
Mail Propertiesの内容を定義して、aplication.ymlに配置します。
自動組立JavaMail Sender(実現クラス:JavaMail SenderImpl)
テストメール送信
テスト:
1、pom依存を導入する
このクラスにはbean,JavaMail SenderImplがあります。
そして私たちは設定ファイルを見に行きます。
context Loads 2結果
メールを確認して、メールの受信が成功しました。
私たちはThymeleafを使って前後の結合を行うだけで、自分のサイトのメール送受信機能を開発できます。
2.3、タイミングタスク
プロジェクト開発では、常にいくつかのタイミングタスクを実行する必要があります。例えば、毎日の明け方に、前回のログ情報を分析し、Springは私たちに非同期的なタスクスケジュールを実行する方式を提供しています。 TaskExectorインターフェース Task Schdulerインターフェース 二つのコメント:@EnbleSchenduling @Schduled クローン式の参考:https://www.cnblogs.com/javahr/p/8318728.html
テストステップ:
1、ScheduledServiceを作成する
私たちの中にハローの方法がありますが、彼は時間通りに実行しなければなりません。どうすればいいですか?
http://www.bejson.com/othertools/cron/
4、よく使う表現
学習目標:
1.1、Swagger概要
前後端分離
ソリューション
スワッグ
SpringBoot Swager=>スプリングフォックス、二つのjarバッグ
要求:jdk 1.8+さもなければswagger 2は運行できません。
ステップ:
1、SpringBoot-webプロジェクトを新規作成する
2、Maven依存追加
<!-- https://mvnrepository.com/artifact/io.springfox/springfox-swagger-ui -->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>3.0.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/io.springfox/springfox-swagger2 -->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>3.0.0</version>
</dependency>
3、Hello Controllerを作成し、テストは運行成功を確保する。4、Swaggerを使用するには、配置類-Swagger Configを作成してSwaggerを配置する必要があります。
@Configuration //
@EnableSwagger2// Swagger2
public class SwaggerConfig {
}
5、アクセステスト:http://localhost:8080/swagger-ui.swaggerのインターフェースが見られます。重要なのは、ドキュメント名と説明を書くことです。すなわち、AppInfoは参構造の最初の2つのパラメータがあります。
1.3、Swaggerの配置
1、SwaggarのインスタンスBeanはDocetであるため、Docetのインスタンスを設定することによってSwaggagerを配置する。
// swagger docket bean
@Bean
public Docket getDocket(){
return new Docket(DocumentationType.SWAGGER_2);
}
2、appinfo()属性で文書情報を設定できます。
//
private ApiInfo apiInfo() {
Contact contact = new Contact(" ", "http://xxx.xxx.com/ ", " ");
return new ApiInfo(
"Swagger ", //
" Swagger", //
"v1.0", //
"http://terms.service.url/ ", //
contact, //
"Apach 2.0 ", //
" ", //
new ArrayList<>()//
);
}
3、Docetの実例と関連してapiInfo()
@Bean
public Docket docket() {
return new Docket(DocumentationType.SWAGGER_2).apiInfo(apiInfo());
}
4、プロジェクトを再起動し、テストにアクセスするhttp://localhost:8080/swagger-ui.効果を見てください。1.4、スキャンインターフェースの設定
1、Docetを構築する時、select()方法でインターフェースをどのようにスキャンしますか?
@Bean
public Docket docket() {
return new Docket(DocumentationType.SWAGGER_2)
.apiInfo(apiInfo())
.select()// .select() , ,RequestHandlerSelectors
.apis(RequestHandlerSelectors.basePackage("com.wei.swagger.controller"))
.build();
}
2、プロジェクトのテストを再開します。カバンの経路によってインターフェースをスキャンするように設定しますので、一つの種類しか見られません。3、スキャンインターフェースをパッケージパスで構成する以外に、他の方法でインターフェースをスキャンすることもできます。ここですべての構成を説明します。
any() // ,
none() //
// , withMethodAnnotation(GetMapping.class) get
withMethodAnnotation(final Class<? extends Annotation> annotation)
// , .withClassAnnotation(Controller.class) controller
withClassAnnotation(final Class<? extends Annotation> annotation)
basePackage(final String basePackage) //
4、これ以外に、インタフェーススキャンフィルタリングパスも構成できます。
// swagger docket bean
@Bean
public Docket getDocket(Environment environment){
return new Docket(DocumentationType.SWAGGER_2)
.apiInfo(getApiInfo())
.select()
//RequestHandlerSelectors 、
//basePackage swagger
//RequestHandlerSelectors any none
//withClassAnnotation XX
//withMethodAnnotation XX
.apis(RequestHandlerSelectors.basePackage("com.wei.swagger.controller"))
//paths
.paths(PathSelectors.ant("/wei/**"))
.build();
}
5、ここのオプション値はまだあります。
any() //
none() //
regex(final String pathRegex) //
ant(final String antPattern) // ant()
1.5、Swaggarスイッチの配置1、enable()の方法でswaggarを有効にするかどうか、falseであれば、swaggerはブラウザからアクセスできなくなります。
enableチェーンプログラミング
@Bean
public Docket getDocket(Environment environment){
return new Docket(DocumentationType.SWAGGER_2)
.enable(false)// swagger : false。 ture
.apiInfo(getApiInfo())
.select()
//RequestHandlerSelectors 、
//basePackage swagger
//RequestHandlerSelectors any none
//withClassAnnotation XX
//withMethodAnnotation XX
.apis(RequestHandlerSelectors.basePackage("com.wei.swagger.controller"))
//paths
.paths(PathSelectors.ant("/wei/**"))
.build();
}
2、どのように動態的に配置しますか?プロジェクトがtest、dev環境にある時、swaggerを表示します。prodにある時は表示しませんか?
@Bean
public Docket getDocket(Environment environment){
Profiles profiles = Profiles.of("dev","test"); //dev or test
System.out.println(profiles);
// environment.acceptsProfiles(profiles)
boolean b = environment.acceptsProfiles(profiles);
return new Docket(DocumentationType.SWAGGER_2)
.enable(b)// swagger : false。 ture
.apiInfo(getApiInfo())
.select()
//RequestHandlerSelectors 、
//basePackage swagger
//RequestHandlerSelectors any none
//withClassAnnotation XX
//withMethodAnnotation XX
.apis(RequestHandlerSelectors.basePackage("com.wei.swagger.controller"))
//paths
.paths(PathSelectors.ant("/wei/**"))
.build();
}
3、プロジェクトの中で一つのdevのプロファイルを追加して効果を見ることができます。4、配置ファイルでも実現できますが、画面だけが友好的ではないことを示します。
appication.properties
spring.profiles.active=prod
appication-dev.properties
springfox.documentation.swagger-ui.enabled=true
appication-prod.properties
springfox.documentation.swagger-ui.enabled=false
1.6、APIパケットの構成
1、パケットが設定されていない場合、デフォルトはdefaultです。グループをグループ化することができます。
@Bean
public Docket docket(Environment environment) {
return new Docket(DocumentationType.SWAGGER_2).apiInfo(apiInfo())
.groupName("group1") //
// ....
}
2、再起動項目はグループを見る3、どのように複数のグループを構成しますか?複数のパケットを設定するには、複数のdocketを設定するだけでよい。
@Bean
public Docket getDocket2(){
return new Docket(DocumentationType.SWAGGER_2).groupName("group2");
}
@Bean
public Docket getDocket3(){
return new Docket(DocumentationType.SWAGGER_2).groupName("group3");
}
4、再起動項目を確認すればいいです。1.7、エンティティ構成
1、エンティティクラスを新規作成する
package com.wei.swagger.pojo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@ApiModel("user ")
@Data
public class User {
@ApiModelProperty(" ")
private String username;
@ApiModelProperty(" ")
private String password;
}
2、このエンティティが要求インターフェースの戻り値上にある限り(パン型であっても)、エンティティ項目にマッピングすることができる。
@RequestMapping(value = "/user" , method = RequestMethod.POST)
public User user(){
return new User();
}
3、テストを再起動する注:@AppModelという注釈でエンティティがここに表示されたわけではなく、インターフェースメソッドの返却値に表示されているエンティティがここに表示されている限り、@App Modelと@App Model Propertyの2つの注釈はエンティティに注釈を加えただけです。
@AppModelはクラスにコメントを追加します。
@AppModelPropertyはクラス属性にコメントを追加します。
1.8、常用注釈
Swaggerのすべての注釈はio.swagger.annotationsによって定義されています。
以下にいくつかのよく使われているものを列挙していないものは別途に説明を調べることができます。
Swaggerコメント
簡単に説明する
@App(tags=「xxxモジュール説明」)
モジュールクラスに作用します。
@Apple Operation(「xxxインターフェース説明」)
インターフェースの方法に作用します。
@AppModel(「xxPOJO説明」)
モデルクラスに作用します。VO、BOなどです。
@Apple ModelProperty(value=「xxx属性説明」、hidden=true)
クラスの方法と属性において、hiddenはtrueに設定されています。この属性を隠すことができます。
@App Param(「xxxパラメータ説明」)
パラメータ、方法、フィールドに作用します。
要求されたインターフェースに注釈を配置することもできます。
@ApiOperation("test ")
@RequestMapping(value = "/test" , method = RequestMethod.GET)
public String test(@ApiParam(" ") String name){
return "test "+name;
}
テストの結果は以下の通りですcontrolerにコメントを追加します。
@Api(tags = "hello ")
public class HelloController {
}
このように、いくつかの比較的に理解しにくい属性あるいはインターフェースをあげることができて、いくつかの配置の情報を増加して、人に更に読みやすいです!従来のPostmanやCurl方式のテストインターフェースに比べて、swaggerを使うとまるでおバカみたいな操作です。文書を追加的に説明する必要はないです。また間違いにくいです。データを入力してExecuteをクリックするだけで、自動化フレームに協力すれば、基本的に人が操作する必要はないと言えます。
Swaggerは優秀なツールです。今は国内で多くの中小インターネット会社が利用しています。伝統的なWordインターフェースの文書を先に出してからテストする方式に比べて、明らかにこれも現在の急速な反復開発の相場に合致しています。もちろんです。正式な環境ではSwaggarをオフにしてください。安全性を考慮して運行時のメモリも節約できます。
まとめ:
1、私達はswaggerを通じて、理解しにくい属性やインターフェースを提供し、注釈情報を追加することができます。
2、インターフェースドキュメントをリアルタイムで更新する
3、オンラインテストができます。
1.9、開拓:その他の皮膚
異なるバッグを導入して、異なる肌の定義を実現できます。
1、デフォルトのアクセスhttp://localhost:8080/swagger-ui/
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>2.9.2</version>
</dependency>
2、bootstrap-ui訪問http://localhost:8080/doc.html
<!-- swagger-bootstrap-ui /doc.html-->
<dependency>
<groupId>com.github.xiaoymin</groupId>
<artifactId>swagger-bootstrap-ui</artifactId>
<version>1.9.1</version>
</dependency>
3、Layui-ui訪問http://localhost:8080/docs.html
<!-- swagger-ui-layer /docs.html-->
<dependency>
<groupId>com.github.caspar-chen</groupId>
<artifactId>swagger-ui-layer</artifactId>
<version>1.1.3</version>
</dependency>
4、mg-uiアクセスhttp://localhost:8080/document.html
<!-- swagger-ui-layer /document.html-->
<dependency>
<groupId>com.zyplayer</groupId>
<artifactId>swagger-mg-ui</artifactId>
<version>1.0.6</version>
</dependency>
2、SpringBoot:非同期、タイミング、メールタスク
2.1、非同期タスク
データを処理しているふりをして、スレッドを使って遅延を設定し、同期待ちの場合をシミュレーションします。
@Service
public class AsyncService {
public void hello(){
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(" ....");
}
}
3、controllerパッケージを作成する4、Aync Controller類を編纂する
私たちはControllerを書いてテストします。
@RestController
public class AsyncController {
@Autowired
AsyncService asyncService;
@GetMapping("/hello")
public String hello(){
asyncService.hello();
return "hello!!!ok!!!";
}
}
5、アクセスhttp://localhost:8080/helloテストを行います。3秒後にハロー!!ok!!これは同期待ちの場合です。問題:ユーザーに直接メッセージをもらいたいなら、バックグラウンドでマルチスレッドを使って処理すればいいですが、毎回自分でマニュアルでマルチスレッドを作成する必要があります。面倒くさいです。簡単な方法を使うだけでいいです。
6、ハローメソッドに@Async注釈を追加する;
// Spring
@Async
public void hello(){
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(" ....");
}
Spring Bootは自分でスレッドを開いて呼び出します。しかし、この注釈を有効にするには、メインプログラムに注釈@EnbaleAyncを追加して、非同期注釈機能を起動する必要があります。
@EnableAsync //
@SpringBootApplication
public class SpringbootTaskApplication {
public static void main(String[] args) {
SpringApplication.run(SpringbootTaskApplication.class, args);
}
}
7、テストを再開して、ウェブページは瞬間的に応答して、バックグラウンドコードは依然として実行します。AyncServiceのhelloメソッドが完了するまで待つ必要はなく、次のような文が続けられます。
2.2、メールジョブ
メール送信は、私達の日常開発にも多く、Springbootもサポートメールを送ってくれました。spring-book-start-mailを導入する必要があります。
Spring Boot自動配置Mail Sender AutoConfigration
Mail Propertiesの内容を定義して、aplication.ymlに配置します。
自動組立JavaMail Sender(実現クラス:JavaMail SenderImpl)
テストメール送信
テスト:
1、pom依存を導入する
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
2、自動配置類を確認する:Mail Sender AutoConfigrationこのクラスにはbean,JavaMail SenderImplがあります。
そして私たちは設定ファイルを見に行きます。
@ConfigurationProperties(
prefix = "spring.mail"
)
public class MailProperties {
private static final Charset DEFAULT_CHARSET;
private String host;
private Integer port;
private String username;
private String password;
private String protocol = "smtp";
private Charset defaultEncoding;
private Map<String, String> properties;
private String jndiName;
}
3、プロファイル:
[email protected]
spring.mail.password= 163
spring.mail.host=smtp.163.com
# qq, ssl
spring.mail.properties.mail.smtp.ssl.enable=true
4、Springユニットテスト
package com.wei;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSenderImpl;
import org.springframework.mail.javamail.MimeMessageHelper;
import javax.mail.MessagingException;
import javax.mail.internet.MimeMessage;
import java.io.File;
import java.io.IOException;
@SpringBootTest
class Springboot09TestApplicationTests {
@Autowired
JavaMailSenderImpl javaMailSender;
@Test
void contextLoads() {
//
SimpleMailMessage mailMessage = new SimpleMailMessage();
mailMessage.setFrom("[email protected]");
mailMessage.setTo("[email protected]");
mailMessage.setSubject("subject2..");
mailMessage.setText("text2...");
javaMailSender.send(mailMessage);
}
@Test
void contextLoads2() throws MessagingException, IOException {
//
MimeMessage mimeMessage = javaMailSender.createMimeMessage();
//
MimeMessageHelper helper = new MimeMessageHelper(mimeMessage,true); // true , multipart
helper.setSubject("subject");
helper.setText("<h1 style='color:red'>test </h1>",true); // true , html
//
String fileName = this.getClass().getClassLoader().getResource("1.jpg").getPath(); // resources
helper.addAttachment("1.jpg", new File(fileName));
helper.addAttachment("2.jpg", new File(fileName));
helper.setFrom("[email protected]"); //
helper.setTo("[email protected]"); //
javaMailSender.send(mimeMessage);
}
}
context Loads結果context Loads 2結果
メールを確認して、メールの受信が成功しました。
私たちはThymeleafを使って前後の結合を行うだけで、自分のサイトのメール送受信機能を開発できます。
2.3、タイミングタスク
プロジェクト開発では、常にいくつかのタイミングタスクを実行する必要があります。例えば、毎日の明け方に、前回のログ情報を分析し、Springは私たちに非同期的なタスクスケジュールを実行する方式を提供しています。
テストステップ:
1、ScheduledServiceを作成する
私たちの中にハローの方法がありますが、彼は時間通りに実行しなければなりません。どうすればいいですか?
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Service;
@Service
public class ScheduledService {
//
@Scheduled(cron = " * * ?")
public void hello(){
System.out.println("hello ");
}
}
2、ここでタイムミッションを完成したら、メインプログラムに@EnbleSchedulingのタイムミッション機能を追加する必要があります。
@EnableAsync //
@EnableScheduling //
@SpringBootApplication
public class SpringbootTaskApplication {
public static void main(String[] args) {
SpringApplication.run(SpringbootTaskApplication.class, args);
}
}
3、式ジェネレータhttp://www.bejson.com/othertools/cron/
4、よく使う表現
(1)0/2 * * * * ? 2
(1)0 0/2 * * * ? 2
(1)0 0 2 1 * ? 1 2
(2)0 15 10 ? * MON-FRI 10:15
(3)0 15 10 ? 6L 2002-2006 2002-2006 10:15
(4)0 0 10,14,16 * * ? 10 , 2 ,4
(5)0 0/30 9-17 * * ?
(6)0 0 12 ? * WED 12
(7)0 0 12 * * ? 12
(8)0 15 10 ? * * 10:15
(9)0 15 10 * * ? 10:15
(10)0 15 10 * * ? 10:15
(11)0 15 10 * * ? 2005 2005 10:15
(12)0 * 14 * * ? 2 2:59 1
(13)0 0/5 14 * * ? 2 2:55 5
(14)0 0/5 14,18 * * ? 2 2:55 6 6:55 5
(15)0 0-5 14 * * ? 2 2:05 1
(16)0 10,44 14 ? 3 WED 2:10 2:44
(17)0 15 10 ? * MON-FRI 10:15
(18)0 15 10 15 * ? 15 10:15
(19)0 15 10 L * ? 10:15
(20)0 15 10 ? * 6L 10:15
(21)0 15 10 ? * 6L 2002-2005 2002 2005 10:15
(22)0 15 10 ? * 6#3 10:15
ここで、このspringbootのswagger、非同期/タイミング/メールタスクの問題についての記事を紹介します。もっと関連のあるspringboot swaggerの内容を紹介します。私達の以前の文章を検索したり、次の関連記事を見たりしてください。これからもよろしくお願いします。