我有一个要求,我通过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()));
});
}
我没有使用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.
问题内容: 我有一个mongodb,其结构如下: 我需要找到用户在任何特定位置所花费的总时间。我已阅读多个博客,但尚未找到任何具体答案。我有以下几点: 问题答案: 您可以 从字段中找到,然后使用 来获取总数 您可以将其进一步划分以获取天,小时,分钟或秒 对于mongodb 4.0 及更高版本
我使用camel和cxf组件从Web服务中获取一些数据。在某些情况下,Web服务返回标准的soap:fault。我有下一个步骤: 阅读cxf和camel邮件列表中的类似问题,我理解cxfendpoint应该抛出异常,如果有soap foalt,org.apache.cxf.binding.soap.soapfault类型的异常,但我不能得到它。onException子句的目标是处理soap错误异常