In a loop:
- construct and launch server
- construct client and make a request
- print response code
- cleanup server and client
Обычно ошибка появляется после нескольких тысяч итераций. Первоначально я думал, что это ошибка Wiremock, но я наблюдаю то же поведение на простом пристани. Мне нужно некоторое представление о том, что происходит. TCP
[*] Я добавил connector.setReaseAddress (true); - я намеревался использовать SO_REUSEADDR
[*] Я также пытался сократить максимальное срок службы сегмента до 1 через susctl -W net.Inet.tcp.msl -in numbers> numbers> numbers> numbers> numbers> numbers> - number num nepcs> numbers> - the number net.tcp. Time_wait state - но проблема сохраняется.
Код: Выделить всё
Exception in thread "main" java.net.http.HttpConnectTimeoutException: HTTP connect timed out
at java.net.http/jdk.internal.net.http.HttpClientImpl.send(HttpClientImpl.java:949)
at java.net.http/jdk.internal.net.http.HttpClientFacade.send(HttpClientFacade.java:133)
at com.example.Main.main(Main.java:43)
Caused by: java.net.http.HttpConnectTimeoutException: HTTP connect timed out
at java.net.http/jdk.internal.net.http.ResponseTimerEvent.handle(ResponseTimerEvent.java:68)
at java.net.http/jdk.internal.net.http.HttpClientImpl.purgeTimeoutsAndReturnNextDeadline(HttpClientImpl.java:1788)
at java.net.http/jdk.internal.net.http.HttpClientImpl$SelectorManager.run(HttpClientImpl.java:1386)
Caused by: java.net.ConnectException: HTTP connect timed out
at java.net.http/jdk.internal.net.http.ResponseTimerEvent.handle(ResponseTimerEvent.java:69)
... 2 more
Код: Выделить всё
Exception in thread "main" java.io.IOException: HTTP/1.1 header parser received no bytes
at java.net.http/jdk.internal.net.http.HttpClientImpl.send(HttpClientImpl.java:970)
at java.net.http/jdk.internal.net.http.HttpClientFacade.send(HttpClientFacade.java:133)
at com.example.Main.main(Main.java:43)
Caused by: java.io.IOException: HTTP/1.1 header parser received no bytes
at java.net.http/jdk.internal.net.http.common.Utils.wrapWithExtraDetail(Utils.java:412)
at java.net.http/jdk.internal.net.http.Http1Response$HeadersReader.onReadError(Http1Response.java:590)
at java.net.http/jdk.internal.net.http.Http1AsyncReceiver.checkForErrors(Http1AsyncReceiver.java:302)
at java.net.http/jdk.internal.net.http.Http1AsyncReceiver.flush(Http1AsyncReceiver.java:268)
at java.net.http/jdk.internal.net.http.common.SequentialScheduler$LockingRestartableTask.run(SequentialScheduler.java:182)
at java.net.http/jdk.internal.net.http.common.SequentialScheduler$CompleteRestartableTask.run(SequentialScheduler.java:149)
at java.net.http/jdk.internal.net.http.common.SequentialScheduler$SchedulableTask.run(SequentialScheduler.java:207)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642)
at java.base/java.lang.Thread.run(Thread.java:1583)
Caused by: java.io.EOFException: EOF reached while reading
at java.net.http/jdk.internal.net.http.Http1AsyncReceiver$Http1TubeSubscriber.onComplete(Http1AsyncReceiver.java:601)
at java.net.http/jdk.internal.net.http.SocketTube$InternalReadPublisher$ReadSubscription.signalCompletion(SocketTube.java:648)
at java.net.http/jdk.internal.net.http.SocketTube$InternalReadPublisher$InternalReadSubscription.read(SocketTube.java:853)
at java.net.http/jdk.internal.net.http.SocketTube$SocketFlowTask.run(SocketTube.java:181)
at java.net.http/jdk.internal.net.http.common.SequentialScheduler$SchedulableTask.run(SequentialScheduler.java:207)
at java.net.http/jdk.internal.net.http.common.SequentialScheduler.runOrSchedule(SequentialScheduler.java:280)
at java.net.http/jdk.internal.net.http.common.SequentialScheduler.runOrSchedule(SequentialScheduler.java:233)
at java.net.http/jdk.internal.net.http.SocketTube$InternalReadPublisher$InternalReadSubscription.signalReadable(SocketTube.java:782)
Сервер:
Код: Выделить всё
package com.example;
import org.eclipse.jetty.http.HttpHeader;
import org.eclipse.jetty.server.Handler;
import org.eclipse.jetty.server.Request;
import org.eclipse.jetty.server.Response;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.server.ServerConnector;
import org.eclipse.jetty.util.Callback;
import java.nio.ByteBuffer;
import java.nio.charset.StandardCharsets;
public class SingleEndpointServer implements AutoCloseable {
private final Server server;
public SingleEndpointServer() {
this.server = new Server();
ServerConnector connector = new ServerConnector(this.server);
connector.setPort(0); // Use port 0 for an ephemeral port
connector.setReuseAddress(true); // Set SO_REUSEADDR
this.server.addConnector(connector);
this.server.setHandler(new FixedEndpointHandler());
}
public void start() throws Exception {
this.server.start();
//System.out.println("Server started on port: " + getPort());
}
public void stop() throws Exception {
//System.out.println("Stopping server on port: " + getPort());
this.server.stop();
}
public int getPort() {
return ((ServerConnector) this.server.getConnectors()[0]).getLocalPort();
}
public String getBaseUrl() {
return "http://localhost:" + getPort();
}
@Override
public void close() throws Exception {
stop();
}
private static class FixedEndpointHandler extends Handler.Abstract {
@Override
public boolean handle(Request request, Response response, Callback callback) {
// Check if the request matches our hardcoded endpoint
if ("POST".equals(request.getMethod()) && "/test".equals(request.getHttpURI().getPath())) {
applyStubResponse(response, callback);
} else {
sendNotFoundResponse(response, callback, request);
}
return true; // Mark the request as handled
}
private void applyStubResponse(Response response, Callback callback) {
response.setStatus(400);
response.getHeaders().put(HttpHeader.CONTENT_TYPE, "application/json");
String body = "{\"error\": \"Expected error returned from server.\"}";
byte[] responseBody = body.getBytes(StandardCharsets.UTF_8);
ByteBuffer bodyBuffer = ByteBuffer.wrap(responseBody);
response.write(true, bodyBuffer, callback);
}
private void sendNotFoundResponse(Response response, Callback callback, Request request) {
String errorMessage = "Endpoint not found: " + request.getMethod() + " " + request.getHttpURI().getPath();
byte[] responseBody = errorMessage.getBytes(StandardCharsets.UTF_8);
ByteBuffer bodyBuffer = ByteBuffer.wrap(responseBody);
response.setStatus(404);
response.getHeaders().put(HttpHeader.CONTENT_TYPE, "text/plain; charset=utf-8");
response.write(true, bodyBuffer, callback);
}
}
}
< /code>
main: < /p>
package com.example;
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.time.Duration;
public class Main {
public static void main(String[] args) throws Exception {
for (int i = 0;; i++) {
System.out.println("=== Cycle " + (i + 1) + " ===");
SingleEndpointServer server = null;
try {
server = new SingleEndpointServer();
server.start();
HttpClient client = HttpClient.newBuilder()
.version(HttpClient.Version.HTTP_1_1)
.connectTimeout(Duration.ofSeconds(10))
.build();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create(server.getBaseUrl() + "/test"))
.POST(HttpRequest.BodyPublishers.ofString("{}"))
.header("Content-Type", "application/json")
.timeout(Duration.ofSeconds(5))
.build();
HttpResponse response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println("Response Status Code: " + response.statusCode());
} finally {
if (server != null) {
server.stop();
}
}
}
}
}
- орг.eclipse.jetty:jetty-server:12.0.25
Подробнее здесь: https://stackoverflow.com/questions/797 ... meral-port