임베디드 넷티 서버가 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
'programing' 카테고리의 다른 글
업로드한 파일의 데이터를 javascript로 가져옵니다. (0) | 2023.03.25 |
---|---|
컬렉션을 포함한 Backbone.js 모델 (0) | 2023.03.20 |
Wordpress 이미지 업로드 시간 오류: 이미지 후 처리에 실패했습니다. (0) | 2023.03.20 |
MUI 설치는 React 18에서 작동하지 않습니다. (0) | 2023.03.20 |
WordPress 플러그인에 CSS 및 jQuery를 포함하는 방법 (0) | 2023.03.20 |