import org.springaicommunity.claude.agent.sdk.ClaudeClient;
import org.springaicommunity.claude.agent.sdk.ClaudeSyncClient;
import org.springaicommunity.claude.agent.sdk.config.PermissionMode;
import org.springaicommunity.claude.agent.sdk.parsing.ParsedMessage;
import org.springaicommunity.claude.agent.sdk.transport.CLIOptions;
import org.springaicommunity.claude.agent.sdk.types.AssistantMessage;
import java.nio.file.Path;
import java.util.Iterator;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicReference;
public class InterruptHandlingExample {
private static final AtomicBoolean shutdownRequested = new AtomicBoolean(false);
private static final AtomicReference<ClaudeSyncClient> activeClient = new AtomicReference<>();
public static void main(String[] args) {
// Register shutdown hook
Runtime.getRuntime().addShutdownHook(new Thread(() -> {
System.out.println("\n[Shutdown] Signal received...");
shutdownRequested.set(true);
ClaudeSyncClient client = activeClient.get();
if (client != null) {
client.interrupt();
System.out.println("[Shutdown] Session interrupted.");
}
}, "claude-shutdown-hook"));
System.out.println("Shutdown hook registered. Press Ctrl+C to test.\n");
try (ClaudeSyncClient client = ClaudeClient.sync()
.workingDirectory(Path.of("."))
.model(CLIOptions.MODEL_HAIKU)
.permissionMode(PermissionMode.BYPASS_PERMISSIONS)
.build()) {
// Store reference for shutdown hook
activeClient.set(client);
// Execute tasks, checking shutdown state
client.connect("What is 2 + 2?");
printResponse(client);
if (!shutdownRequested.get()) {
client.query("List three colors.");
printResponse(client);
}
// Clear reference before normal close
activeClient.set(null);
} catch (Exception e) {
System.err.println("Error: " + e.getMessage());
}
System.out.println("Session completed.");
}
private static void printResponse(ClaudeSyncClient client) {
if (shutdownRequested.get()) {
System.out.println("[Skipped due to shutdown]");
return;
}
Iterator<ParsedMessage> response = client.receiveResponse();
while (response.hasNext() && !shutdownRequested.get()) {
ParsedMessage msg = response.next();
if (msg.isRegularMessage() && msg.asMessage() instanceof AssistantMessage am) {
am.getTextContent().ifPresent(System.out::println);
}
}
}
}