programing

임베디드 넷티 서버가 spring-boot-starter-webflux로 시작되지 않도록 하려면 어떻게 해야 합니까?

newstyles 2023. 3. 20. 21:44

임베디드 넷티 서버가 spring-boot-starter-webflux로 시작되지 않도록 하려면 어떻게 해야 합니까?

Springs new reactive webflux extension을 사용하여 클라이언트와 서버 어플리케이션 간의 통신을 확립하고 싶습니다.

의존관리는 gradle을 사용합니다.서버 및 클라이언트 측의 build.gradle 파일은 기본적으로 다음과 같습니다.

buildscript {
    repositories {
        mavenCentral()
        maven { url "https://repo.spring.io/snapshot" }
    }
    dependencies {
        classpath("org.springframework.boot:spring-boot-gradle-plugin:2.0.0.BUILD-SNAPSHOT")
    }
}

repositories {
    mavenCentral()
    maven { url "https://repo.spring.io/snapshot" }
}

apply plugin: 'java'
apply plugin: 'org.springframework.boot'
apply plugin: "io.spring.dependency-management" 

dependencies {
    compile("org.springframework.boot:spring-boot-starter-webflux")
}

(2.0.0에 주의해 주세요.BUILD-SNAPSHOT은 이동 대상이며, 의존 관계 내부의 변경으로 인해 가까운 문제가 언젠가는 사라질 수 있습니다.)

서버측 애플리케이션을 기동하면, 임베디드 넷티 서버의 기동을 포함한 모든 것이 정상적으로 기동합니다.

단, 클라이언트애플리케이션의 기동시에, 넷티 서버도 기동해, 「java.net」가 발생합니다.Bind Exception:이미 사용 중인 주소"입니다.클라이언트측 Netty 서버는 서버측 Netty 서버와 같은 포트로 리슨하기 때문입니다.

질문입니다.애초에 클라이언트 측에서 Netty를 시작하는 이유는 무엇이며, 어떻게 하면 예방할 수 있을까요?

Spring-Boot Documentation에 따르면 Spring은 웹 지원이 필요한지 여부를 판단하고 그에 따라 Spring Application 컨텍스트를 구성합니다.

또한 Docs에 따르면 이는 setWebEnvironment(false) 호출에 의해 덮어쓸 수 있습니다.클라이언트의 기동 코드는 다음과 같습니다.

@SpringBootApplication(scanBasePackages = { "com.tatics.flux.main" })
public class Client {
    public static void main(String[] args) throws Exception {
        SpringApplication app = new SpringApplication(Client.class);
        app.setWebEnvironment(false);
        app.run(Client.class, args);

        WebClient webClient = WebClient.create();

        Mono<String> result = webClient
                .post()
                .uri("http://localhost:8080/fluxService")

                // This does not work any more: .body("Hallo")
                // and must be replaced by:
                .body(BodyInserters.fromObject("Hallo"))

                .accept(MediaType.TEXT_PLAIN)
                .exchange()
                .flatMap(response -> response.bodyToMono(String.class));
    }
}

불행히도 넷티는 아직 시작됐어요.또한 setWebEnvironment(false)는 비권장이라고 표시되어 있습니다.

netty의 기동을 방지하고 그 이외의 방법으로 모든 webflux 의존성을 유지하는 방법에 대한 도움에 감사드립니다.

다음은 자동 구성 보고서에서 발췌한 것입니다.

=========================
AUTO-CONFIGURATION REPORT
=========================

Positive matches:
-----------------
...

ReactiveWebServerAutoConfiguration matched:
  - found ReactiveWebApplicationContext (OnWebApplicationCondition)

ReactiveWebServerAutoConfiguration#defaultReactiveWebServerCustomizer matched:
  - @ConditionalOnMissingBean (types: org.springframework.boot.autoconfigure.web.reactive.DefaultReactiveWebServerCustomizer; SearchStrategy: all) did not find any beans (OnBeanCondition)

ReactiveWebServerConfiguration.ReactorNettyAutoConfiguration matched:
  - @ConditionalOnClass found required class 'reactor.ipc.netty.http.server.HttpServer'; @ConditionalOnMissingClass did not find unwanted class (OnClassCondition)
  - @ConditionalOnMissingBean (types: org.springframework.boot.web.reactive.server.ReactiveWebServerFactory; SearchStrategy: all) did not find any beans (OnBeanCondition)

ReactorCoreAutoConfiguration matched:
  - @ConditionalOnClass found required classes 'reactor.core.publisher.Mono', 'reactor.core.publisher.Flux'; @ConditionalOnMissingClass did not find unwanted class (OnClassCondition)

...

Negative matches:
-----------------
...
ReactiveWebServerConfiguration.JettyAutoConfiguration:
  Did not match:
     - @ConditionalOnClass did not find required class 'org.eclipse.jetty.server.Server' (OnClassCondition)

ReactiveWebServerConfiguration.TomcatAutoConfiguration:
  Did not match:
     - @ConditionalOnClass did not find required class 'org.apache.catalina.startup.Tomcat' (OnClassCondition)

ReactiveWebServerConfiguration.UndertowAutoConfiguration:
  Did not match:
     - @ConditionalOnClass did not find required class 'io.undertow.Undertow' (OnClassCondition)

...

ReactiveWebServerConfiguration.JettyAutoConfiguration:
  Did not match:
     - @ConditionalOnClass did not find required class 'org.eclipse.jetty.server.Server' (OnClassCondition)

ReactiveWebServerConfiguration.TomcatAutoConfiguration:
  Did not match:
     - @ConditionalOnClass did not find required class 'org.apache.catalina.startup.Tomcat' (OnClassCondition)

ReactiveWebServerConfiguration.UndertowAutoConfiguration:
  Did not match:
     - @ConditionalOnClass did not find required class 'io.undertow.Undertow' (OnClassCondition)

@Brian_Clozel 답변 추가:

Netty(또는 다른 서버)를 디세블로 하려면 , application.yml 를 지정합니다.

spring.main.web-application-type: none

또는 application.properties:

spring.main.web-application-type=none

코드의 주요 문제는 현재 작성 중이라는 것입니다.SpringApplication를 커스터마이즈하여 최종적으로 모든 것을 폐기하고 정적 메서드를 실행합니다.run(Object primarySource, String... args).

다음 기능이 작동합니다.

@SpringBootApplication
public class Client {

    public static void main(String[] args) throws Exception {
        SpringApplication app = new SpringApplication(Client.class);
        app.setWebApplicationType(WebApplicationType.NONE);
        app.run(args);
    }

    @Bean
    public CommandLineRunner myCommandLineRunner() {
      return args -> {
        // we have to block here, since command line runners don't
        // consume reactive types and simply return after the execution
        String result = WebClient.create("http://localhost:8080")
                .post()
                .uri("/fluxService")
                .body("Hallo")
                .accept(MediaType.TEXT_PLAIN)
                .retrieve()
                .bodyToMono(String.class)
                .block();
        // print the result?
      };
    }
}

그렇지 않은 경우 다음 명령을 사용하여 응용 프로그램을 실행하십시오.--debug자동 구성 보고서의 관련 부분(특히 서버에 관한 자동 설정)에 플래그를 붙이고 질문에 추가합니다.

언급URL : https://stackoverflow.com/questions/43574234/how-to-prevent-embedded-netty-server-from-starting-with-spring-boot-starter-webf