Hacktoberfest 2026: die Issues, die Maintainer für den Oktober markiert haben – offen und einsteigerfreundlich. Hacktoberfest-Issues durchsuchen

StdioClientTransport: Inbound Scheduler and Error Scheduler threads are locked on Windows

Offen
#759 1 Kommentar 0 Reaktionen 0 zugewiesene Personen Auf GitHub ansehen

Dieses Issue hat noch niemand übernommen.

Bewertung

Schwierigkeit
4/5
Geschätzter Aufwand
3-5 Tage
Anfängerfreundlichkeit
38/100
Issue-Typ
Bug
Klarheit
Größtenteils klar
Aktivitätsstatus
Veraltet
Tech-Stack
java
Bereich
backend

Rechercherichtung

Beginne bei io.modelcontextprotocol.client.transport.StdioClientTransport, mit Fokus auf den Inbound Scheduler, den Error Scheduler und die closeGracefully-Methode, und prüfe dann den beigefügten Windows-Thread-Dump auf blockierte Lesevorgänge. Reproduziere die Spring AI Filesystem Demo unter Windows und verifiziere, dass das Herunterfahren den Java-Prozess beendet, ohne Scheduler-Threads gesperrt zu hinterlassen.

Vom Indexierungsmodell aus dem Issue-Text verfasst.

Beschreibung

bug P2

Bug description
Two threads, Inbound Scheduler and Error Scheduler, remain locked forever (at java.io.FileInputStream.readBytes native call) in io.modelcontextprotocol.client.transport.StdioClientTransport after the graceful shutdown is completed using closeGracefully method.

Looks like a Windows specific issue with native I/O calls. The problem is observed when running on Windows. No problems with Linux environment.

The thread dump is attached.
dump_jdk17.txt
See "pool-2-thread-1" and "pool-5-thread-1" dumps.

Environment
Windows 11 Enterprise
mcp-core 0.17.1
Spring AI 2.0.0-SNAPSHOT
JDK Temurin 17.0.14 (also tried Amazon Corretto 21.0.5)

Linux Behavior
Works fine under Ubuntu 24.04 and JDK Temurin 21.0.10

Steps to reproduce

Expected behavior
The Java process terminates after running the Spring AI Filesystem Demo example.

Possible solution
On Windows, use daemon threads for inbound and error schedulers

private ThreadFactory daemonThreadFactory = runnable -> {
		Thread t = new Thread(runnable);
		t.setDaemon(true);
		return t;
	};
if (isWindows) {
    this.inboundScheduler = Schedulers.fromExecutorService(Executors.newSingleThreadExecutor(daemonThreadFactory), "inbound");
    this.errorScheduler = Schedulers.fromExecutorService(Executors.newSingleThreadExecutor(daemonThreadFactory), "error");
}

Tried this solution locally. It resolves the termination issue. But the graceful shutdown logic in io.modelcontextprotocol.client.transport.StdioClientTransport#closeGracefully should be revised as well.

Vorherrschende Sprache
Java
Sterne
3.7k
Forks
1.1k
Ø Merge
1 T. 15 Std.
Gemergte PRs (30 T.)
9

Beitragsleitfaden

Beitragsleitfaden öffnen

Erste Schritte

  1. Lesen Sie das ganze Issue und danach den Beitragsleitfaden des Projekts.
  2. Schreiben Sie ins Issue, dass Sie es übernehmen — das erspart doppelte Arbeit.
  3. Forken Sie das Repository und arbeiten Sie in einem Branch.
  4. Öffnen Sie einen Pull Request, der die Issue-Nummer nennt.

Mehr aus modelcontextprotocol/java-sdk

Alle Issues in modelcontextprotocol/java-sdk

Ähnliche Issues

Weitere Issues zu Java

Neue Issues direkt in Ihr Postfach

Eine kurze Übersicht über anfängerfreundliche GitHub-Issues.