小编Bri*_*zel的帖子

SpringBoot 2 使用 Gradle 插件调试

我正在尝试远程调试使用新的 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。

java spring gradle spring-boot

3
推荐指数
1
解决办法
2730
查看次数

编译发现gradle的错误版本

我使用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 …

gradle spring-boot

3
推荐指数
1
解决办法
6840
查看次数

Flux.concat 和 Flux.concatWith 之间的区别

我是反应流新手,正在学习使用 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)

reactive-programming project-reactor reactive-streams

3
推荐指数
1
解决办法
8510
查看次数

Spring WebFlux(反应器)。zipWith 时出错 - 由于缺少请求而无法发出滴答声

我有一个 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)

有没有我可以添加的逻辑来防止错误,或者只是跳过这个勾号?

project-reactor

3
推荐指数
1
解决办法
2113
查看次数

在spring-webflux中使用Spring AMQP使用者

我有一个使用Boot 2.0和webflux的应用程序,并且有一个端点返回Flux of ServerSentEvent.通过利用spring-amqp从RabbitMQ队列中消耗消息来创建事件.我的问题是:如何最好地将已MessageListener配置的侦听器方法桥接到可以传递给控制器​​的Flux?

Project Reactor的create部分提到"将现有的API与反应世界联系起来非常有用 - 例如基于侦听器的异步API",但我不确定如何直接挂钩消息监听器,因为它包含在DirectMessageListenerContainerMessageListenerAdapter.他们的例子来自创建部分:

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-amqp project-reactor

3
推荐指数
1
解决办法
1738
查看次数

Reactive Streams:Spring WebFlux - 订阅现有发布者

我目前正在将现有的Spring异步REST架构迁移到Spring的新WebFlux库,并且有一个关于加入多个请求的问题,以便他们可以监听相同的已发布响应.

用例如下:

  1. 客户端A连接到我们的Web服务器并请求数据
  2. 我们点击缓存来检查我们是否有数据
  3. 我们没有,所以我们去检索这些数据(客户A已订阅并等待响应)
  4. 客户端B连接到我们的Web服务器并请求相同的数据(命中相同的端点)
  5. 我们检查缓存,数据仍然不存在
  6. 由于我们已经为客户A提取此数据,因此我们不想再提出请求,但我们也不希望将客户B转移.客户B应该能够收听相同的信息

客户端B如何订阅客户端A等待的相同响应流?

java spring reactive-streams reactive spring-webflux

3
推荐指数
1
解决办法
1388
查看次数

通过spring`WebClient`进行api调用的正确方法是什么,但忽略了结果?

通过弹簧进行api调用的正确方法是什么WebClient,但忽略结果?该ClientResponse对象明确指出我必须对结果做一些事情......

文档:

注意:当通过WebClient exchange()方法授予对ClientResponse的访问权限时,必须始终使用body或toEntity方法之一来确保释放资源并避免HTTP连接池的潜在问题.如果没有预期的响应内容,您可以使用bodyToMono(Void.class).但请记住,如果响应确实包含内容,则连接将关闭,并且不会放回池中.

我可以进行WebClient调用并忽略结果吗?或者是否有一个通用的捕获我可以使用然后忽略的所有"body或toEntity方法"

spring spring-webflux

3
推荐指数
1
解决办法
501
查看次数

block()/ blockFirst()/ blockLast()在调用bodyToMono后阻塞错误AFTER exchange()

我正在尝试使用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.

这可能吗?

java reactive-programming project-reactor spring-webflux

3
推荐指数
3
解决办法
8684
查看次数

组合两个不同类型的 Flux 实例

使用 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:

  • 一个 poidId
  • 没有纬度信息
  • 没有经度信息
  • 价格信息

第二个元素poiFlux包含 Pois 和:

  • 一个 poidId
  • 纬度
  • 经度
  • 没有价格信息

(poidId 是 Poi 的标识符)。

我想从两个 Flux(poiFlux 和 availablePoisFlux)创建一个带有 Pois(带有 poidId、价格、经度和纬度)的新 Flux resultPoisFlux

poidId 属性是两个 …

reactive-programming project-reactor

3
推荐指数
1
解决办法
2479
查看次数

使用Spring WebClient解码内容编码gzip

我正在使用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)

spring reactor-netty spring-webflux

3
推荐指数
1
解决办法
1329
查看次数