Skip to content

Commit 67818f8

Browse files
committed
Gemini feedback
1 parent 30d7ddd commit 67818f8

File tree

3 files changed

+30
-20
lines changed

3 files changed

+30
-20
lines changed

client/base/src/main/java/io/a2a/client/AbstractClient.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@
3131
* transport protocol. It supports sending messages, managing tasks, and
3232
* handling event streams.
3333
*/
34-
public abstract class AbstractClient {
34+
public abstract class AbstractClient implements AutoCloseable {
3535

3636
protected final @NonNull List<BiConsumer<ClientEvent, AgentCard>> consumers;
3737
protected final @Nullable Consumer<Throwable> streamingErrorHandler;

client/base/src/main/java/io/a2a/client/Client.java

Lines changed: 25 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -52,30 +52,40 @@
5252
* <li><b>Resubscription:</b> Resume receiving events for ongoing tasks after disconnection</li>
5353
* </ul>
5454
* <p>
55-
* <b>Creating a client:</b> Use {@link #builder(AgentCard)} to create instances:
55+
* <b>Resource management:</b> Client implements {@link AutoCloseable} and should be used with
56+
* try-with-resources to ensure proper cleanup:
5657
* <pre>{@code
57-
* // 1. Get agent card
5858
* AgentCard card = A2A.getAgentCard("http://localhost:9999");
5959
*
60-
* // 2. Build and configure client
60+
* try (Client client = Client.builder(card)
61+
* .withTransport(JSONRPCTransport.class, new JSONRPCTransportConfigBuilder())
62+
* .addConsumer((event, agentCard) -> {
63+
* if (event instanceof MessageEvent me) {
64+
* System.out.println("Response: " + me.getMessage().parts());
65+
* }
66+
* })
67+
* .build()) {
68+
*
69+
* // Send messages - client automatically closed when done
70+
* client.sendMessage(A2A.toUserMessage("Tell me a joke"));
71+
* }
72+
* }</pre>
73+
* <p>
74+
* <b>Manual resource management:</b> If not using try-with-resources, call {@link #close()}
75+
* explicitly when done:
76+
* <pre>{@code
6177
* Client client = Client.builder(card)
6278
* .withTransport(JSONRPCTransport.class, new JSONRPCTransportConfigBuilder())
6379
* .addConsumer((event, agentCard) -> {
64-
* if (event instanceof MessageEvent me) {
65-
* Message msg = me.getMessage();
66-
* System.out.println("Agent response: " + msg.parts());
67-
* } else if (event instanceof TaskUpdateEvent tue) {
68-
* Task task = tue.getTask();
69-
* System.out.println("Task " + task.id() + " is " + task.status().state());
70-
* }
80+
* // Handle events
7181
* })
7282
* .build();
7383
*
74-
* // 3. Send messages
75-
* client.sendMessage(A2A.toUserMessage("Tell me a joke"));
76-
*
77-
* // 4. Clean up when done
78-
* client.close();
84+
* try {
85+
* client.sendMessage(A2A.toUserMessage("Tell me a joke"));
86+
* } finally {
87+
* client.close(); // Always close to release resources
88+
* }
7989
* }</pre>
8090
* <p>
8191
* <b>Event consumption model:</b> Responses from the agent are delivered as {@link ClientEvent}

client/transport/spi/src/main/java/io/a2a/client/transport/spi/ClientTransportConfig.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -55,12 +55,12 @@ public void setInterceptors(List<ClientCallInterceptor> interceptors) {
5555
/**
5656
* Get the list of configured interceptors.
5757
* <p>
58-
* Returns the internal list of interceptors. Modifications to the returned list
59-
* will affect this configuration.
58+
* Returns an unmodifiable view of the interceptor list. Attempting to modify
59+
* the returned list will throw {@link UnsupportedOperationException}.
6060
*
61-
* @return the list of configured interceptors (never null, but may be empty)
61+
* @return an unmodifiable list of configured interceptors (never null, but may be empty)
6262
*/
6363
public List<ClientCallInterceptor> getInterceptors() {
64-
return interceptors;
64+
return java.util.Collections.unmodifiableList(interceptors);
6565
}
6666
}

0 commit comments

Comments
 (0)