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依存追加
    
       <!-- 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は私たちに非同期的なタスクスケジュールを実行する方式を提供しています。
  • TaskExectorインターフェース
  • Task Schdulerインターフェース
  • 二つのコメント:
  • @EnbleSchenduling
  • @Schduled
  • クローン式の参考:https://www.cnblogs.com/javahr/p/8318728.html
    テストステップ:
    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の内容を紹介します。私達の以前の文章を検索したり、次の関連記事を見たりしてください。これからもよろしくお願いします。