我有一个部署了worker verticle(vertx版本3.6.3)的程序。从这里,worker verticle,我使用Vertx WebClient库发出HTTP请求。我的vertx工作池大小为20,事件循环池大小为10。紧接着,发出http请求(在send()调用之后),我正在阻止使用completable future发出http请求(工作线程)的工作线程。当我阻塞工作线程时,HTTP请求从不响应,总是超时。当工作线程未被阻塞时,它会做出响应。我想,如果我阻止工作线程,池中会有其他工作线程来处理HTTP请求。我做错了什么?此外,我还启用了网络日志活动,但没有看到任何网络日志打印在日志中。
下面是我尝试过的程序,我正在运行一个示例HTTP服务器,该服务器在端口8080的本地主机上运行,响应良好。
import java.util.concurrent.TimeUnit;
import io.vertx.core.AbstractVerticle;
import io.vertx.core.DeploymentOptions;
import io.vertx.core.Vertx;
import io.vertx.core.VertxOptions;
import io.vertx.core.buffer.Buffer;
import io.vertx.ext.web.client.HttpResponse;
import io.vertx.ext.web.client.WebClient;
import io.vertx.ext.web.client.WebClientOptions;
public class VertxTestMain extends AbstractVerticle {
private static int workerPoolSize = 20;
private static int eventLoopPoolSize = 10;
@Override
public void start() {
vertx.eventBus().consumer("vertx.address", event -> {
CompletableFuture<String> future = new CompletableFuture<>();
doAHttpRequest(vertx, future);
try {
//future.get(20, TimeUnit.SECONDS);
} catch (Exception e) {
System.out.println(Thread.currentThread().getName()+ " ----- HTTP request never responded");
e.printStackTrace();
}
});
}
private void doAHttpRequest(Vertx vertx, CompletableFuture<String> future) {
//System.setProperty("java.util.logging.config.file", "/opt/maglev/persisted/data/vertx-default-jul-logging.properties");
WebClientOptions options = new WebClientOptions();
options.setLogActivity(true);
WebClient webClient = WebClient.create(vertx, options );
int port = 8080;
String host = "localhost";
String url = "/";
System.out.println(Thread.currentThread().getName()+ " ----- Sending http://" + host + ":" + port + "/" + url);
// Send a GET request
webClient
.get(port, host, url)
.timeout(10000)
.send(ar -> {
if (ar.succeeded()) {
HttpResponse<Buffer> response = ar.result();
System.out.println(Thread.currentThread().getName()+ " ----- Received response. " + response.bodyAsString());
System.out.println(Thread.currentThread().getName()+ " ----- Received response with status code. " + response.statusCode());
future.complete("success");
} else {
System.out.println(Thread.currentThread().getName()+ " ----- Something went wrong. " + ar.cause().getMessage());
future.completeExceptionally(ar.cause());
}
});
}
public static void main(String[] args) {
DeploymentOptions deploymentOptions = new DeploymentOptions().setWorker(true).setInstances(2);
VertxOptions vertxOptions = new VertxOptions();
vertxOptions.setWorkerPoolSize(workerPoolSize);
vertxOptions.setEventLoopPoolSize(eventLoopPoolSize);
Vertx vertx = Vertx.vertx(vertxOptions);
vertx.deployVerticle(VertxTestMain.class.getName(), deploymentOptions, event -> {
if(event.succeeded()) {
System.out.println(Thread.currentThread().getName()+ " ----- VertxTestMain verticle is deployed");
vertx.eventBus().send("vertx.address", "send");
}
else {
System.out.println(Thread.currentThread().getName()+ " ----- VertxTestMain verticle deployment failed. " + event.cause());
}
});
}
}
您不允许启动HTTP请求。
从您的方法返回Future,而不是传递它:
private CompletableFuture<String> doAHttpRequest(Vertx vertx) {
CompletableFuture<String> future = new CompletableFuture<>();
WebClientOptions options = new WebClientOptions();
options.setLogActivity(true);
WebClient webClient = WebClient.create(vertx, options );
int port = 8080;
String host = "localhost";
String url = "/";
System.out.println(Thread.currentThread().getName()+ " ----- Sending http://" + host + ":" + port + "/" + url);
// Send a GET request
webClient
.get(port, host, url)
.timeout(10000)
.send(ar -> {
if (ar.succeeded()) {
HttpResponse<Buffer> response = ar.result();
System.out.println(Thread.currentThread().getName()+ " ----- Received response. " + response.bodyAsString());
System.out.println(Thread.currentThread().getName()+ " ----- Received response with status code. " + response.statusCode());
future.complete("success");
} else {
System.out.println(Thread.currentThread().getName()+ " ----- Something went wrong. " + ar.cause().getMessage());
future.completeExceptionally(ar.cause());
}
});
return future;
}
您还可以重用WebClient,无需为每个请求创建它。
此外,请查看Promise
API Vert. x提供的,因为它可能更适合您的用例:
https://vertx.io/docs/apidocs/io/vertx/core/Promise.html
问题内容: 我正在学习如何在Android中使用线程,并且为此,我制作了一个播放一系列笔记的小型应用程序。这个想法是,有一个开始按钮和一个结束按钮,(显然)如果您按下开始按钮,它将开始播放音乐,而如果您按下结束按钮,它将停止播放。开始按钮可以正常工作,但是问题是结束按钮不能正常工作。我在找出原因时遇到了麻烦,因此也许有些人可以帮助我。这是代码: 问题答案: 您正在调用正在播放的线程,但此时可能正在
问题内容: 这是我的代码: 我的回应是: 500服务器错误 我打开我的变量,然后看到: POST / rest / platform / domain / list HTTP / 1.1 即使我曾经将其设置为GET,为什么也将其设置为POST ? 问题答案: 将请求方法隐式设置为POST,因为这是您要发送请求正文时的默认方法。 如果要使用GET,请删除该行并删除该行。您无需发送GET请求的请求正文
我试图使用cURL获取一个HTTP请求响应,这很好。然而,当我在Python中使用“请求”包时,我没有得到任何响应(它只是超时,没有错误或返回响应)。 我的cURL代码如下: 当我在cURL代码中使用-v时,我得到以下消息: 试图144.126.138.12... TCP_NODELAY集 连接到144.126.138.12(144.126.138.12)端口17001(#0) POST/api/
在下面的代码中,线程。activeCount()始终返回2,即使executor中的线程在5秒后终止。 我期望Thread.activeCount()在5秒后返回1。为什么它总是返回2?
我在tomcat上配置了ssl,在IE上禁用了tls支持,并启用了ssl支持,但我仍然得到错误消息 Tomcat设置
我试图弄清楚spring是如何将线程安全的请求/会话范围的bean注入控制器组件(即通过方法访问这些bean的单线程和多线程)的 作为例子,考虑<代码> HttpServletRequest 字段,该控件标记为“代码> @ AutoWordEng/代码>注释(我知道将控制器与servlet API配对是不好的,但在学习目的上可以)。我了解到这样的bean是使用CGLib代理的,但仍然无法弄清楚代理