Проблемы с обработкой подключения при многократном запуске сервера в эфемерном портуJAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Проблемы с обработкой подключения при многократном запуске сервера в эфемерном порту

Сообщение Anonymous »

In the following scenario:
In a loop:
  • construct and launch server
  • construct client and make a request
  • print response code
  • cleanup server and client
I am Видя случайные тайм -ауты и редко другие ошибки.
Обычно ошибка появляется после нескольких тысяч итераций. Первоначально я думал, что это ошибка 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
Пример Ошибка 2-EOF:

Код: Выделить всё

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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «JAVA»