当前位置: 首页 > 知识库问答 >
问题:

Quarkus上的reactive microprofile

齐乐
2023-03-14

在Quarkus上,我试图用动态的baseUrl构建一个反应性的microprofile REST客户机,但是到目前为止,在所有的实现变体中,REST调用都在订阅后阻塞。有趣的是,非反应实现的工作方式像一个魅力。让我们看看一些代码...

REST客户端接口:

package ...;

import io.smallrye.mutiny.Uni;

import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.Response;
import java.io.InputStream;
import java.util.concurrent.CompletionStage;

import static javax.ws.rs.core.MediaType.APPLICATION_OCTET_STREAM;

@Path("")
public interface RetrievalRestApi {

  @GET
  @Produces(APPLICATION_OCTET_STREAM)
  Uni<InputStream> retrieve();

  @GET
  @Produces(APPLICATION_OCTET_STREAM)
  InputStream retrieve2(); // non-reactive, the only one that works...

  @GET
  @Produces(APPLICATION_OCTET_STREAM)
  Uni<Response> retrieve3();

  @GET
  @Produces(APPLICATION_OCTET_STREAM)
  CompletionStage<InputStream> retrieve4();
}

package ...;

import io.quarkus.test.junit.QuarkusTest;
import io.smallrye.mutiny.Uni;
import org.apache.commons.io.IOUtils;
import org.eclipse.microprofile.rest.client.RestClientBuilder;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;

import javax.inject.Inject;
import javax.ws.rs.core.Response;
import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.nio.charset.StandardCharsets;
import java.util.List;
import java.util.function.Consumer;

import static org.junit.jupiter.api.Assertions.assertNotNull;

@QuarkusTest
class RetrievalRestApiTest {
  private URL restUrl;

  @BeforeEach
  void setUp() throws MalformedURLException {
    restUrl = new URL("https://some-valid-url");
  }

  @Test
  void testRetrieve() {
    Uni<InputStream> uni = RestClientBuilder.newBuilder()
                                            .baseUrl(restUrl)
                                            .build(RetrievalRestApi.class)
                                            .retrieve()
                                            .onFailure().invoke((Consumer<Throwable>) System.out::println);
    InputStream inputStream = uni.subscribe()
                                 .withSubscriber(UniAssertSubscriber.create())
                                 .await()
                                 .assertCompleted()
                                 .getItem();
    assertNotNull(inputStream);
  }

  @Test
  void testRetrieve2() throws IOException {
    InputStream inputStream = RestClientBuilder.newBuilder()
                                               .baseUrl(restUrl)
                                               .build(RetrievalRestApi.class)
                                               .retrieve2();
    assertNotNull(inputStream);
    String content = IOUtils.toString(inputStream, StandardCharsets.UTF_8);
    assertNotNull(content);
  }

  @Test
  void testRetrieve3() {
    Uni<Response> uni = RestClientBuilder.newBuilder()
                                         .baseUrl(restUrl)
                                         .build(RetrievalRestApi.class)
                                         .retrieve3()
                                         .onFailure().invoke((Consumer<Throwable>) System.out::println);
    Response response = uni.subscribe()
                                 .withSubscriber(UniAssertSubscriber.create())
                                 .await()
                                 .assertCompleted()
                                 .getItem();
    assertNotNull(response);
  }

  @Test
  void testRetrieve4() {
    Uni<InputStream> uni = Uni.createFrom().completionStage(RestClientBuilder.newBuilder()
                                         .baseUrl(restUrl)
                                         .build(RetrievalRestApi.class)
                                         .retrieve4())
                                         .onFailure().invoke((Consumer<Throwable>) System.out::println);
    InputStream inputStream = uni.subscribe()
                                 .withSubscriber(UniAssertSubscriber.create())
                                 .await()
                                 .assertCompleted()
                                 .getItem();
    assertNotNull(inputStream);
  }
}

共有1个答案

陆高峰
2023-03-14

这个问题确实与https://github.com/quarkusio/quarkus/issues/13440有关。在将Quarkus升级到1.12.0.Final之后,这个问题就消失了。

 类似资料:
  • 我有以下设置: Keycoap在docker中运行,公共接口映射到127.0.0.1:8180,内部Keycoap-n:8080 Quarkus在docker中运行,公共接口映射到127.0.0.1:8080 两者都在同一docker网络中运行,并可以通信。 外部AutzClient(不在docker中),使用令牌与quarkus通信 如果客户端和quarkus在Docker之外,并通过同一接口与

  • 我想用P6Spy和Quarkus一起使用,但无法按照一般说明配置它。有人设法让这两个人一起工作吗?

  • 嗨,我正在尝试使用多部分表单上传多个文件 我使用这个,但我得到了错误的请求状态,我如何上传多个文件?

  • 我有一个带有异步endpoint的quarkus应用程序,它创建一个具有默认属性的实体,在request方法中启动一个新线程,并执行一个长期运行的作业,然后返回该实体作为响应供客户端跟踪。 此外,长时间运行的作业将在实体运行时对其进行更新,因此它也必须是事务性的。但是,数据库实体没有得到更新。 这些是我面临的问题: 收到以下警告: 我尝试使用但没有用。 我尝试在上使用API方法,而不是在指南中提到

  • Quarkus 是一个用于编写 Java 应用的云原生、容器优先框架。 特性包括: 容器优先:最小的Java应用程序,最适合在容器中运行 云原生:在 Kubernetes 等环境中采用 12 要素原则。 统一命令式与反应式:在一个编程模型下带来非阻塞和命令式开发风格。 基于标准:Standards-based:基于一些标准和框架(RESTEasy、Hibernate、Netty、Eclipse V

  • 我试图将一些Hibernate/Hibernate搜索调用卸载到另一个线程,但我收到的错误表明CDI没有在该线程中正确设置。 我已经看过这本指南了https://quarkus.io/guides/context-propagation,但没有提到科特林合作项目。 有什么方法可以通过协同程序进行上下文传播吗? 我正在用