Skip to content
This repository was archived by the owner on Feb 14, 2025. It is now read-only.

Commit 8a0cd4e

Browse files
committed
refactor: improve resource management in StdioServerTransport
- Use try-with-resources for proper reader cleanup - Remove unnecessary reader/writer instance variables - Access process streams directly when needed
1 parent 8397849 commit 8a0cd4e

File tree

1 file changed

+8
-18
lines changed

1 file changed

+8
-18
lines changed

spring-ai-mcp-core/src/main/java/org/springframework/ai/mcp/client/stdio/StdioServerTransport.java

Lines changed: 8 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,8 @@
1717
package org.springframework.ai.mcp.client.stdio;
1818

1919
import java.io.BufferedReader;
20-
import java.io.BufferedWriter;
2120
import java.io.IOException;
21+
import java.io.InputStreamReader;
2222
import java.util.ArrayList;
2323
import java.util.HashMap;
2424
import java.util.List;
@@ -51,12 +51,6 @@ public class StdioServerTransport extends AbstractMcpTransport {
5151

5252
private Process process;
5353

54-
private BufferedReader processErrorReader;
55-
56-
private BufferedReader processReader;
57-
58-
private BufferedWriter processWriter;
59-
6054
private Scheduler inboundScheduler;
6155

6256
private Scheduler outboundScheduler;
@@ -116,11 +110,6 @@ public void start() {
116110
throw new RuntimeException("Process input or output stream is null");
117111
}
118112

119-
// Initialize readers and writers
120-
this.processErrorReader = this.process.errorReader();
121-
this.processReader = this.process.inputReader();
122-
this.processWriter = this.process.outputWriter();
123-
124113
// Start threads
125114
this.isRunning = true;
126115
startInboundProcessing();
@@ -143,7 +132,8 @@ public void awaitForExit() {
143132

144133
private void startErrorProcessing() {
145134
this.errorScheduler.schedule(() -> {
146-
try {
135+
try (BufferedReader processErrorReader = new BufferedReader(
136+
new InputStreamReader(process.getErrorStream()))) {
147137
String line;
148138
while (isRunning && processErrorReader != null && (line = processErrorReader.readLine()) != null) {
149139
try {
@@ -169,9 +159,9 @@ private void startErrorProcessing() {
169159

170160
private void startInboundProcessing() {
171161
this.inboundScheduler.schedule(() -> {
172-
try {
162+
try (BufferedReader processReader = new BufferedReader(new InputStreamReader(process.getInputStream()))) {
173163
String line;
174-
while (this.isRunning && this.processReader != null && (line = this.processReader.readLine()) != null) {
164+
while (this.isRunning && processReader != null && (line = processReader.readLine()) != null) {
175165
try {
176166
JSONRPCMessage message = deserializeJsonRpcMessage(line);
177167
if (!this.getInboundSink().tryEmitNext(message).isSuccess()) {
@@ -222,9 +212,9 @@ private void startOutboundProcessing() {
222212
.handle((message, s) -> {
223213
if (message != null) {
224214
try {
225-
this.processWriter.write(objectMapper.writeValueAsString(message));
226-
this.processWriter.newLine();
227-
this.processWriter.flush();
215+
this.process.outputWriter().write(objectMapper.writeValueAsString(message));
216+
this.process.outputWriter().newLine();
217+
this.process.outputWriter().flush();
228218
s.next(message);
229219
}
230220
catch (IOException e) {

0 commit comments

Comments
 (0)