При использовании виртуальных потоков не отправляется REST запрос на API
Я хочу написать программу, которая будет слать на мою апи тысячи сообщений в секунду. Для этого я хочу использовать виртуальные треды:
import kong.unirest.HttpResponse;
import kong.unirest.JsonNode;
import kong.unirest.Unirest;
import java.util.UUID;
import java.util.concurrent.Executors;
import java.util.concurrent.atomic.AtomicLong;
import java.util.stream.IntStream;
public class Main {
private final static String target = "https://01hdpvezxneb5bweqrstdxagdp00-9c86fc9c1e60a225c441.requestinspector.com";
private static AtomicLong counter = new AtomicLong(0);
public static void main(String[] args) {
//Unirest.config().proxy("127.0.0.1", 9051);
try (var exec = Executors.newVirtualThreadPerTaskExecutor()) {
IntStream.range(0, 10000).forEach(i -> {
exec.submit(Main::job);
});
}
}
private static void job() {
while (true) {
System.out.println(counter.incrementAndGet());
try {
send();
} catch (Exception ignored) {
}
}
}
private static int send() {
HttpResponse<JsonNode> response = Unirest.post(target)
.multiPartContent()
.header("User-Agent", UUID.randomUUID().toString())
.field("name", "hi")
.asJson();
System.out.println("Status: " + response.getStatus());
System.out.println(response.getBody());
return response.getStatus();
}
}
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.example</groupId>
<artifactId>untitled</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>21</maven.compiler.source>
<maven.compiler.target>21</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>com.konghq</groupId>
<artifactId>unirest-java</artifactId>
<version>3.14.5</version>
</dependency>
</dependencies>
</project>
Проблема в том, что все это виснет в тот момент, когда должна происходить отправка сообщения. В лог выводятся числа от 1 до 30 максимум в разном порядке, а ответ от апи не распечатывается. В дебагере я не могу дождаться получения ответа от апи, он не приходит. Почему так? Как заставить программу работать?
Ответы (1 шт):
Автор решения: Wonderf
→ Ссылка
Как я понял из документации виртуальные потоки ждут когда им разрешат работать.
Если достаточно долго подождать то будет в консоли приходить ответ.
Для вашей задачи лучше использовать другой вид потоков.
var exec = Executors.newCachedThreadPool()