我正在尝试远程调试使用新的 Spring Boot Gradle 插件构建和运行的 Spring Boot 2.0 Web 应用程序。我读过要走的路是--debug-jvm像这样传递选项:
./gradlew bootRun --debug-jvm
Run Code Online (Sandbox Code Playgroud)
但我得到以下信息:
Problem configuring task :bootRun from command line.
> Unknown command-line option '--debug-jvm'.
Run Code Online (Sandbox Code Playgroud)
Spring Boot 2.0 有什么变化还是我遗漏了什么?该新插件的gradle参考并没有提及关于调试任何东西。
我正在运行 Spring Boot 和 spring-boot-gradle-plugin 版本 2.0.0.M6,gradle 版本 4.3.1。
我使用spring boot2。在一个多Java项目中。
我尝试构建我的主库(尚无Java文件)
apply plugin: 'java-library-distribution'
plugins {
id 'org.springframework.boot' version '2.0.0.M7'
}
repositories {
mavenCentral()
maven { url "https://repo.spring.io/snapshot" }
maven { url "https://repo.spring.io/milestone" }
}
dependencies {
compile group: 'org.springframework.boot', name: 'spring-boot-starter-data-jpa', version: '2.0.0.M7'
compile group: 'org.postgresql', name: 'postgresql', version: '42.1.4'
testCompile group: 'org.springframework.boot', name: 'spring-boot-starter-test', version: '2.0.0.M7'
}
distributions {
main{
baseName = 'common-model'
}
}
sourceCompatibility = 1.8
tasks.withType(JavaCompile) {
options.compilerArgs = ["-Xlint:unchecked", "-Xlint:deprecation", "-parameters"]
}
Run Code Online (Sandbox Code Playgroud)
在我的gradle /包装器中,我有
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-4.2-bin.zip
Run Code Online (Sandbox Code Playgroud)
我得到的错误
引起原因:org.gradle.api.internal.plugins.PluginApplicationException:无法应用插件[id'org.springframework.boot']
原因:org.gradle.api.GradleException:Spring …
我是反应流新手,正在学习使用 concat/concatWith 方法组合两个发布者(具体来说是 Flux)。
我可以用 concat 方法做的所有事情,都可以使用 concatWith 方法来实现。这是我使用的示例案例:
Mono<String> mono1 = Mono.just(" karan ");
Mono<String> mono2 = Mono.just(" | verma ");
Mono<String> mono3 = Mono.just(" | kv ");
Flux<String> flux1 = Flux.just(" {1} ","{2} ","{3} ","{4} " );
Flux<String> flux2 = Flux.just(" |A|"," |B| "," |C| ");
// FLux emits item each 500ms
Flux<String> intervalFlux1 = Flux.interval(Duration.ofMillis(1000))
.zipWith(flux1, (i, string) -> string);
// FLux emits item each 700ms
Flux<String> intervalFlux2 = Flux
.interval(Duration.ofMillis(1000))
.zipWith(flux2, (i, string) -> string);
System.out.println("**************Flux …Run Code Online (Sandbox Code Playgroud) 我有一个 Flux,对于每个对象,我应该对第三方 REST 进行 API 调用(大约 1000 次调用)。为了防止每秒出现许多请求,我使用:
Flux<Calls> callsIntervalFlux=
Flux.interval(Duration.ofMillis(100))
.zipWith(callsFlux, (i, call) -> call);
// and now Calls emits every 10ms, and REST API is not overloaded
Run Code Online (Sandbox Code Playgroud)
问题是,有时应用程序会因异常而失败:
reactor.core.Exceptions$ErrorCallbackNotImplemented: reactor.core.Exceptions$OverflowException: Could not emit tick 32 due to lack of requests (interval doesn't support small downstream requests that replenish slower than the ticks)
Caused by: reactor.core.Exceptions$OverflowException: Could not emit tick 32 due to lack of requests (interval doesn't support small downstream requests that replenish slower than the ticks)
Run Code Online (Sandbox Code Playgroud)
有没有我可以添加的逻辑来防止错误,或者只是跳过这个勾号?
我有一个使用Boot 2.0和webflux的应用程序,并且有一个端点返回Flux of ServerSentEvent.通过利用spring-amqp从RabbitMQ队列中消耗消息来创建事件.我的问题是:如何最好地将已MessageListener配置的侦听器方法桥接到可以传递给控制器的Flux?
Project Reactor的create部分提到"将现有的API与反应世界联系起来非常有用 - 例如基于侦听器的异步API",但我不确定如何直接挂钩消息监听器,因为它包含在DirectMessageListenerContainer和MessageListenerAdapter.他们的例子来自创建部分:
Flux<String> bridge = Flux.create(sink -> {
myEventProcessor.register(
new MyEventListener<String>() {
public void onDataChunk(List<String> chunk) {
for(String s : chunk) {
sink.next(s);
}
}
public void processComplete() {
sink.complete();
}
});
});
Run Code Online (Sandbox Code Playgroud)
到目前为止,我最好的选择是创建一个Processor并且onNext()每次在RabbitMQ监听器方法中调用以手动生成事件.
我目前正在将现有的Spring异步REST架构迁移到Spring的新WebFlux库,并且有一个关于加入多个请求的问题,以便他们可以监听相同的已发布响应.
用例如下:
客户端B如何订阅客户端A等待的相同响应流?
通过弹簧进行api调用的正确方法是什么WebClient,但忽略结果?该ClientResponse对象明确指出我必须对结果做一些事情......
注意:当通过WebClient exchange()方法授予对ClientResponse的访问权限时,必须始终使用body或toEntity方法之一来确保释放资源并避免HTTP连接池的潜在问题.如果没有预期的响应内容,您可以使用bodyToMono(Void.class).但请记住,如果响应确实包含内容,则连接将关闭,并且不会放回池中.
我可以进行WebClient调用并忽略结果吗?或者是否有一个通用的捕获我可以使用然后忽略的所有"body或toEntity方法"?
我正在尝试使用Webflux将生成的文件流式传输到另一个位置,但是,如果文件的生成遇到错误,则api会返回成功,但是DTO会在生成文件而不是文件本身时详细说明错误.这是使用一个非常古老和设计不佳的api所以请原谅使用post和api设计.
来自api调用(exchange())的响应是ClientResponse.从这里我可以使用bodyToMono转换为ByteArrayResource,它可以流式传输到文件,或者,如果创建文件时出错,那么我也可以使用bodyToMono转换为DTO.但是,我似乎无法做任何事情或取决于ClientResponse标题的内容.
在运行时我得到一个IllegalStateException引起的
block()/ blockFirst()/ blockLast()是阻塞,在线程reactor-http-client-epoll-12中不支持
我认为我的问题是我不能在同一个函数链中两次调用block().
我的代码片段是这样的:
webClient.post()
.uri(uriBuilder -> uriBuilder.path("/file/")
.queryParams(params).build())
.exchange()
.doOnSuccess(cr -> {
if (MediaType.APPLICATION_JSON_UTF8.equals(cr.headers().contentType().get())) {
NoPayloadResponseDto dto = cr.bodyToMono(NoPayloadResponseDto.class).block();
createErrorFile(dto);
}
else {
ByteArrayResource bAr = cr.bodyToMono(ByteArrayResource.class).block();
createSpreadsheet(bAr);
}
}
)
.block();
Run Code Online (Sandbox Code Playgroud)
基本上我想根据标头中定义的MediaType以不同方式处理ClientResponse.
这可能吗?
使用 SpringBoot 2 和 Poi 类(兴趣点):
public class Poi {
public Poi(String poidId, Double price, Double latitude, Double longitude) {...}
private String poidId;
private Double latitude;
private Double longitude;
private Double price;
//And Getters and Setters
}
Run Code Online (Sandbox Code Playgroud)
我有 2 个 Poi 通量:
Flux<Poi> availablePoisFlux;
Flux<Poi> poiFlux;
Run Code Online (Sandbox Code Playgroud)
第一个元素availablePoisFlux包含 Pois:
第二个元素poiFlux包含 Pois 和:
(poidId 是 Poi 的标识符)。
我想从两个 Flux(poiFlux 和 availablePoisFlux)创建一个带有 Pois(带有 poidId、价格、经度和纬度)的新 Flux resultPoisFlux。
poidId 属性是两个 …
我正在使用Spring WebClient(Spring 5.1.3)调用Web服务。服务以content-type: application/json和响应content-encoding: gzip
ClientResponse.bodyToMono 然后失败,出现错误“ JSON解码错误:非法字符((CTRL-CHAR,代码31))”,我认为这是因为在尝试解析JSON之前尚未对内容进行解码。
这是我如何创建WebClient的代码段(简化)
HttpClient httpClient = HttpClient.create().secure(sslContextSpec -> sslContextSpec.sslContext(sslContext));
return WebClient.builder().clientConnector(new ReactorClientHttpConnector(httpClient)).build();
Run Code Online (Sandbox Code Playgroud)
然后,我使用WebClient进行呼叫:
webClient.get().uri(uri)
.accept(MediaType.APPLICATION_JSON)
.header(HttpHeaders.ACCEPT_ENCODING, "gzip")
.exchange()
Run Code Online (Sandbox Code Playgroud)
HTTP请求具有2个标头:
Accept: application/json
Accept-Encoding: gzip
Run Code Online (Sandbox Code Playgroud)
响应具有以下标头:
set-cookie: xxx
content-type: application/json; charset=utf-8
content-length: 1175
content-encoding: gzip
cache-control: no-store, no-cache
Run Code Online (Sandbox Code Playgroud)
通过执行以下操作,我能够手动解码GZIP内容并从结果中获取有效的JSON
webClient.get().uri(uri)
.accept(MediaType.APPLICATION_JSON)
.header("accept-encoding", "gzip")
.exchange()
.flatMap(encodedResponse -> encodedResponse.body((inputMessage, context) ->
inputMessage.getBody().flatMap(dataBuffer -> {
ClientResponse.Builder decodedResponse = ClientResponse.from(encodedResponse);
try {
GZIPInputStream gz = new GZIPInputStream(dataBuffer.asInputStream());
decodedResponse.body(new String(gz.readAllBytes()));
} catch (IOException e) {
e.printStackTrace();
}
decodedResponse.headers(headers …Run Code Online (Sandbox Code Playgroud)