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

Vertx客户端正在花时间检查故障

黄聪
2023-03-14

我有一个要求,我通过Vertx客户端将一个微服务连接到其他微服务。在代码中,我正在检查另一个微服务是否关闭,然后在失败时它应该创建一些JsonObject,其中solrError为键,失败消息为值。如果有solr错误,我的意思是如果其他微服务关闭,通过负载平衡调用solr,那么它应该会抛出一些错误响应。但是Vertx客户端需要一些时间来检查失败,当条件被检查时,jsonject中没有solrError,因为Vertx客户端需要一些时间来检查失败,所以条件失败,resp为空。为了避免这种情况,可以做些什么,以便Vertx客户端在检查solrError的条件之前失败并返回内部服务器错误响应?

下面是代码:

 solrQueryService.executeQuery(query).subscribe().with(jsonObject -> {
        ObjectMapper objMapper = new ObjectMapper();
        SolrOutput solrOutput = new SolrOutput();
        List<Doc> docs = new ArrayList<>();
        try {
            if(null != jsonObject.getMap().get("solrError")){
             resp = Response.status(Response.Status.INTERNAL_SERVER_ERROR)
                        .entity(new BaseException(
                                exceptionService.processSolrDownError(request.header.referenceId))
                                        .getResponse()).build();
            }
            solrOutput = objMapper.readValue(jsonObject.toString(), SolrOutput.class);
            if (null != solrOutput.getResponse()
                    && CollectionUtils.isNotEmpty(solrOutput.getResponse().getDocs())) {
                docs.addAll(solrOutput.getResponse().getDocs());
                                    uniDocList  = Uni.createFrom().item(docs);
            }
        } catch (JsonProcessingException e) {
            e.printStackTrace();
        }
    });
    
    if(null!=resp && resp.getStatus() !=200) {
        return resp ;
    }
    
    SolrQueryService is preparing query and send out URL and query to Vertx web client as below :
    
    public Uni<JsonObject> search(URL url, SolrQuery query,Integer timeout) {
    int port = url.getPort();
    if (port == -1 && "https".equals(url.getProtocol())) {
        port = 443;
    }
    if (port == -1 && "http".equals(url.getProtocol())) {
        port = 80;
    }
    HttpRequest<Buffer> request = client.post(port, url.getHost(), url.getPath()).timeout(timeout);
    return request.sendJson(query).map(resp -> {
        return resp.bodyAsJsonObject();
    }).onFailure().recoverWithUni(f -> {
        return Uni.createFrom().item(new JsonObject().put("solrError", f.getMessage()));
    });

}

共有1个答案

强化
2023-03-14

我没有使用Vertx客户端,但假设它是被动的和非阻塞的。假设是这样,您的代码似乎混合了命令式和反应式构造。第一行中的subscribe是被动的,当服务器响应客户端请求时,将调用您提供的lambda。然而,在订阅之后,您有了在lambda甚至有机会被调用之前运行的命令式代码,因此您对“resp”对象的检查和访问永远不会是lambda本身发生的事情的结果。

您需要将所有代码移动到lambda中,或者至少在订阅的结果上生成后续代码链。

 类似资料:
  • 我注意到Rest客户端上有两个指南:MicroProfile和Vertx。既然微文件支持异步,那么使用基于Vertx的Rest客户端有什么好处?

  • 跟随wiki页面https://cwiki.apache.org/qpid/amqp-java-jms-messaging-client.html到https://cwiki.apache.org/qpid/connection-url-format.html. Simple me需要qpid-amqp-1-0-client-jms-0.20-sources。jar接受URI格式,但它似乎忽视了一

  • 我想知道如何将缓存配置添加到Vertx http web客户端。 使用Apache http客户端,我可以轻松地设置setCacheConfig 有什么想法吗?

  • 我将cxf库用于web服务客户端。 当响应延迟了大约5秒时,cxf需要大约20秒来返回响应。ws返回33912长响应。 不过,客户对快速响应没有问题。 我找不到问题所在。我测试了wsendpoint,它在8秒内返回最大值。但cxf客户端有时需要30-50秒。 我打开了调试日志,这两行之间需要9秒 2018-01-11 17:17:14.022调试10492--[nio-8086-exec-6]o.

  • 我使用camel和cxf组件从Web服务中获取一些数据。在某些情况下,Web服务返回标准的soap:fault。我有下一个步骤: 阅读cxf和camel邮件列表中的类似问题,我理解cxfendpoint应该抛出异常,如果有soap foalt,org.apache.cxf.binding.soap.soapfault类型的异常,但我不能得到它。onException子句的目标是处理soap错误异常

  • 问题内容: 我有一个mongodb,其结构如下: 我需要找到用户在任何特定位置所花费的总时间。我已阅读多个博客,但尚未找到任何具体答案。我有以下几点: 问题答案: 您可以 从字段中找到,然后使用 来获取总数 您可以将其进一步划分以获取天,小时,分钟或秒 对于mongodb 4.0 及更高版本