2

到目前为止,我已经在 Quarkus 中使用 smallrye Mutiny 完成了非常基本的事情。基本上,我有一两个非常小的 Web 服务,它们只与 Web 应用程序交互。这些服务返回一个Uni<Response>.

现在我正在编写一个日志服务,我希望我的其他人将信息传递给。在这个日志服务中,我需要向调用服务返回一个值。日志服务会将此值作为Uni<Integer>. 我正在努力解决的是如何将调用服务中的返回值提取为int.

这是日志服务中的功能

    @GET
    @Path("/requestid")
    @Produces(MediaType.TEXT_PLAIN)
    public Uni<Integer> getMaxRequestId(){
        return service.getMaxRequestId();
    }

    public Uni<Integer> getMaxRequestId() {
        Integer result = Integer.valueOf(em.createQuery("select MAX(request_id) from service_requests").getFirstResult());
        
        if(result == null) {
            result = 0;
        }
        return Uni.createFrom().item(result += 1);
    }

这是调用服务中的客户端代码

@Path("/requests")
public class RequestIdResource {
    
    @RestClient
    RequestIdServices service;
    
    @GET
    @Path("/requestid")
    @Produces(MediaType.TEXT_PLAIN)
    public Uni<Integer> getMaxRequestId(){
        return service.getMaxRequestId();
    }
}

    public void filter(ContainerRequestContext requestContext) throws IOException {

        int requestid = client.getMaxRequestId();

        rm.name = ConfigProvider.getConfig().getValue("quarkus.application.name", String.class);
        rm.server = requestContext.getUriInfo().getBaseUri().getHost();
        rm.text = requestContext.getUriInfo().getPath(true);
        rm.requestid = requestid;
        
    }

基本上我尝试过的所有东西都会创建另一个Uni. 也许我只是在使用这个概念都错了。但是我怎样才能摆脱Integer困境,Uni这样我才能得到intValue呢?

4

1 回答 1

3

您需要调用终端操作,或使用该值并继续该链。

如果您想调用终端操作员,您可以调用该await操作以使您的代码阻塞并等待响应。

如果您想将此响应式调用与客户端代码中存在的另一个合并,您可以使用该方法加入或组合您的实际 Mutiny 流与来自响应的 on combine

如果您只想使用该值而不检索它,您可以订阅并获取结果。

如果你有一个 multi 你可以直接调用该方法toList

假设您想要涉及一些超时并且想要获取实际的整数,您可以使用await方法和超时。

于 2021-09-27T12:57:44.807 回答