Serversockecket.accept () не останавливается на закрытии () в докереJAVA

Программисты JAVA общаются здесь
Anonymous
Serversockecket.accept () не останавливается на закрытии () в докере

Сообщение Anonymous »

Я использовал, чтобы закрыть сокет, чтобы асинхронно остановить сервер. Это больше не работает. < /P>
mcve < /h1>
package com.example.bug;

import java.io.Closeable;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

public class SocketInvalidArgument implements Closeable {

public static void main(String[] args) throws IOException, InterruptedException {
for (int i = 0; i {
try (Closeable closeable = socket) {
while (!Thread.interrupted()) {
try {
try (Socket client = socket.accept()) { // Hangs indefinitely
// The client is immediately closed, not needed for this test
}
} catch (Exception e) {
if (!socket.isClosed()) {
e.printStackTrace();
}
break;
}
}
socket.close();
} catch (Exception e) {
e.printStackTrace();
}
});
acceptThread.start();
}

@Override
public void close() throws IOException {
try {
socket.close();
socket.close();
socket.close();
} finally {
try {
acceptThread.join(); // Hangs indefinitely
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
throw new IOException(e);
}
}
}

}
< /code>
Постоянно висит бесконечно на первой или второй итерации. < /p>
"main" #1 [44] prio=5 os_prio=0 cpu=3511.20ms elapsed=769.07s tid=0x00002aaab002a920 nid=44 in Object.wait() [0x00002aaaacc8f000]
java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait0(java.base@21.0.7/Native Method)
- waiting on (a java.lang.Thread)
at java.lang.Object.wait(java.base@21.0.7/Object.java:366)
at java.lang.Thread.join(java.base@21.0.7/Thread.java:2079)
- locked (a java.lang.Thread)
at java.lang.Thread.join(java.base@21.0.7/Thread.java:2155)
at com.example.bug.SocketInvalidArgument.close(SocketInvalidArgument.java:55)
at com.example.bug.SocketInvalidArgument.main(SocketInvalidArgument.java:15)
at java.lang.invoke.LambdaForm$DMH/0x00002aab3d030c00.invokeStatic(java.base@21.0.7/LambdaForm$DMH)
at java.lang.invoke.LambdaForm$MH/0x00002aab3d14d000.invoke(java.base@21.0.7/LambdaForm$MH)
at java.lang.invoke.Invokers$Holder.invokeExact_MT(java.base@21.0.7/Invokers$Holder)
at jdk.internal.reflect.DirectMethodHandleAccessor.invokeImpl(java.base@21.0.7/DirectMethodHandleAccessor.java:154)
at jdk.internal.reflect.DirectMethodHandleAccessor.invoke(java.base@21.0.7/DirectMethodHandleAccessor.java:103)
at java.lang.reflect.Method.invoke(java.base@21.0.7/Method.java:580)
at com.sun.tools.javac.launcher.Main.execute(jdk.compiler@21.0.7/Main.java:484)
at com.sun.tools.javac.launcher.Main.run(jdk.compiler@21.0.7/Main.java:208)
at com.sun.tools.javac.launcher.Main.main(jdk.compiler@21.0.7/Main.java:135)

"Thread-0" #20 [65] prio=5 os_prio=0 cpu=2.91ms elapsed=765.22s tid=0x00002aaab0603520 nid=65 runnable [0x00002aabefd7f000]
java.lang.Thread.State: RUNNABLE
at sun.nio.ch.Net.accept(java.base@21.0.7/Native Method)
at sun.nio.ch.NioSocketImpl.accept(java.base@21.0.7/NioSocketImpl.java:748)
at java.net.ServerSocket.implAccept(java.base@21.0.7/ServerSocket.java:698)
at java.net.ServerSocket.platformImplAccept(java.base@21.0.7/ServerSocket.java:663)
at java.net.ServerSocket.implAccept(java.base@21.0.7/ServerSocket.java:639)
at java.net.ServerSocket.implAccept(java.base@21.0.7/ServerSocket.java:585)
at java.net.ServerSocket.accept(java.base@21.0.7/ServerSocket.java:543)
at com.example.bug.SocketInvalidArgument.lambda$new$0(SocketInvalidArgument.java:29)
at com.example.bug.SocketInvalidArgument$$Lambda/0x00002aab3d14c238.run(Unknown Source)
at java.lang.Thread.runWith(java.base@21.0.7/Thread.java:1596)
at java.lang.Thread.run(java.base@21.0.7/Thread.java:1583)
< /code>
для воспроизведения: < /p>
docker run --rm --platform=linux/x86_64 -ti maven:3.9.9-eclipse-temurin-21 /bin/bash
cat > SocketInvalidArgument.java # paste the code
java SocketInvalidArgument.java
< /code>
среда < /h1>

[*] OpenJdk 64-битный сервер VM Temurin-21.0.7+6 (Build 21.0.7+6-LTS, смешанный режим, обмен) < /li>
Ubuntu 24.04.2 LTS (Linux 76083B607A5. 6.10.14-linuxkit #1 SMP Thu Mar 20 16:32:56 UTC 2025 x86_64 x86_64 x86_64 GNU/Linux)
[*] Docker Desktop (4.40.0 (187762))
[*] macos 12.7 (187762)
[*] gos 12.6 (187762)
. 21.6.0 Дарвинская ядра версии 21.6.0: понедельник 24 00:58:06 PDT 2024; Платформы. < /p>
Например, если вместо архитектуры x86_64 я использую изображение Ubuntu для AARH64, образец работает нормально. < /p>
Вопрос < /h1>

Это подход неправильно?>

Подробнее здесь: https://stackoverflow.com/questions/796 ... -in-docker

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