web-dev-qa-db-ja.com

Spring-Bootをクライアントアプリケーションとして実行する方法は?

単一のアプリケーションに2つのメインエントリポイントがあります。

最初のメインサーバーを起動し、コントローラーをマップして、いくつかのワーカースレッドを起動します。これらのワーカーは、クラウドキューからメッセージを受信します。

負荷が増加した場合は、作業を行うためにワーカーを追加できるようにしたいと思います。したがって、アプリケーションに2番目のメインエントリポイントがあり、起動できるようにしますデフォルトサーバーを起動せずにスプリングブート(クライアントアプリケーションとして)に次のようになります。ポートの競合を回避するため(そして明らかに失敗につながる)。

どうすればこれを達成できますか?

9
amitection

serverおよびclientプロファイルを使用してコマンドラインから起動する

同じjarと同じエントリポイントを2つの異なるプロファイルで使用するには、実行時にSpringプロファイルを指定するだけで、個別のアプリケーション-$ {profile} .propertiesがロードされます(場合によっては条件付きJava構成がトリガーされました)。

2つのばねプロファイル(clientおよびserver)を定義

  • それぞれに独自のapplication-${profile}.propertiesがあります
  • クライアントのプロパティはWebコンテナを無効にします

単一のSpringBootAppとエントリポイントがあります

@SpringBootApplication
public class SpringBootApp {
    public static void main(String[] args) {
        new SpringApplicationBuilder()
            .sources(SpringBootApp.class)
            .run(args);
    }
}

このクラスをメインクラスにします。

src/main/resources/application-server.properties

spring.application.name=server
server.port=8080

src/main/resources/application-client.properties

spring.application.name=client
spring.main.web-environment=false

コマンドラインから両方のプロファイルを起動します

$ Java -jar -Dspring.profiles.active=server YourApp.jar
$ Java -jar -Dspring.profiles.active=client YourApp.jar

アクティブなプロファイルに基づいて、@Configurationクラスが条件付きでトリガーされる場合もあります。

@Configuration
@Profile("client")
public class ClientConfig {
    //...
}

IDE with serverおよびclientプロファイルを使用して起動

ランチャー

@SpringBootApplication
public class SpringBootApp {
}

public class LauncherServer {
    public static void main(String[] args) {
        new SpringApplicationBuilder()
            .sources(SpringBootApp.class)
            .profiles("server")
            .run(args);
    }
}

public class ClientLauncher {
    public static void main(String[] args) {
        new SpringApplicationBuilder()
            .sources(SpringBootApp.class)
            .profiles("client")
            .web(false)
            .run(args);
    }
}

追加の構成クラス(クライアントまたはサーバーに固有)を指定できます。

new SpringApplicationBuilder()
    .sources(SpringBootApp.class, ClientSpecificConfiguration.class)
    .profiles("client")
    .web(false)
    .run(args);

src/main/resources/application-server.properties

spring.application.name=server
server.port=8080

src/main/resources/application-client.properties

spring.application.name=client
#server.port= in my example, the client is not a webapp

2つのSpringBootApp(ClientSpringBootAppServerSpringBootApp)があり、それぞれに独自のメインがあります。これは同様のセットアップであり、異なるAutoConfigurationまたはComponentScan

@SpringBootApplication
@ComponentScan("...")
public class ServerSpringBootApp {
    public static void main(String[] args) {
        new SpringApplicationBuilder()
            .sources(ServerSpringBootApp.class)
            .profiles("server")
            .run(args);
    }
}

//Example of a difference between client and server
@SpringBootApplication(exclude = SecurityAutoConfiguration.class) 
@ComponentScan("...")
public class ClientSpringBootApp {
    public static void main(String[] args) {
        new SpringApplicationBuilder()
            .sources(ClientSpringBootApp.class)
            .profiles("client")
            .web(false)
            .run(args);
    }
}
18
alexbt