在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);
}
}
这个问题确实与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,但没有提到科特林合作项目。 有什么方法可以通过协同程序进行上下文传播吗? 我正在用