1. ホーム
  2. ジャワ

SpringBoot TomCatの動作方法を変更する

2022-02-26 09:50:55
<パス

1. なぜSpringBootの実行方法を変更する必要があるのですか?

  • Tomcat Connector(コネクタ)には3つの動作モードがあります:bio nio apr
    • バイオ(ブロッキングI/O)

      • つまり、ブロッキングI/O操作は、Tomcatが従来のJava I/O操作(つまり、java.ioパッケージとそのサブパッケージ)を使用していることを示し、JAVA HTTP/1.1コネクタに基づいて、Tomcat 7以下はデフォルトでbioモードで実行されていることを意味します。一般に、バイオ・モードは3つの動作モードの中で最も低性能です。サーバーの現在の状態は、Tomcat Managerで確認することができます。(Tomcat7以下、Linuxシステムでデフォルトで使用されます)。
      • 1リクエストに1スレッド、デメリット:並行性が高い、スレッド数が多い、リソースの無駄遣い
    • nio(新規I/O)

      • Java nioは、Java SE 1.4以降(つまりjava.nioパッケージとそのサブパッケージ)で提供される新しい形式のI/O操作である。Java nioはバッファベースのJava APIで、ノンブロッキングのI/O操作を提供するため、nioはノンブロッキングI/O(non-blocking IO)の頭文字をとったものとも見なされている。従来のI/O操作(バイオ)に比べて、同時実行性能が優れています。Tomcatをnioモードで動作させるには、Tomcatのインストールディレクトリ/conf/server.xmlの対応するプロトコルのプロパティの値を、org.apache.coyote.http11.Http11NioProtocolに変更するだけです。
		 <Connector port="1024" protocol="org.apache.coyote.http11.Http11NioProtocol"
               connectionTimeout="20000"
               redirectPort="8443" />


  • apr(Apache Portable Runtime/アパッチポータブルランタイム)
    • Tomcatは、Apache HTTPサーバのコアダイナミックリンクライブラリをJNIとして呼び出して、ファイルの読み込みやネットワーク転送の処理を行います。OSレベルから非同期IOの問題を解決する
    • tomcat 8.0 以降はデフォルトでaprに対応済み(下位バージョンは急げば切り替え可能)

SpringBoot のデフォルトは java -Xmx256m -Xss256k -jar xx.jar を実行するために、Tomcatの内蔵起動メソッドはデフォルトでNIOなので、Aprで起動したい場合はどうすればいいのでしょうか?

2. SpringBoot内蔵のTomcatコンテナを削除します。

  • pomファイルを変更する
jar</packaging> change to => 
war</packaging>

        
org.springframework.boot</groupId>
            
spring-boot-starter-web</artifactId>
            <! -- Remove embedded tomcat plugin -- > 
            
org.springframework.boot</groupId>
                    
spring-boot-starter-tomcat</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

        <! -- Removing the inline Tomcat requires re-adding the servlet -->
        
javax.servlet</groupId>
		    
javax.servlet-api</artifactId>
		    
${servlet.version}</version>
		    
provided</scope>
		</dependency>

package com.ctx.springboot; import org.springframework.boot.autoconfigure; import org.springframework.boot.builder; import org.springframework.boot.web.support.SpringBootServletInitializer; @SpringBootApplication public class SpringBootStartApplication extends SpringBootServletInitializer { @Override protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) { return builder.sources(SpringBootStartApplication.class); } }