This is an automated email from the ASF dual-hosted git repository.

davsclaus pushed a commit to branch fix/CAMEL-24002
in repository https://gitbox.apache.org/repos/asf/camel.git

commit 11263b736879a5fbe6258010b3849b72a4782283
Author: Claus Ibsen <[email protected]>
AuthorDate: Sat Jul 11 08:23:09 2026 +0200

    CAMEL-24002: camel cmd send exits 0 on failure and terminated launchers 
cause ambiguous name
    
    Fix two defects in camel cmd send:
    
    1. findPids in ActionBaseCommand now checks context.phase and skips
       entries with phase >= 9 (Terminated). This prevents stale launcher
       processes from exported runtimes (spring-boot/quarkus) from causing
       ambiguous name matches.
    
    2. showStatus now returns int instead of void. Returns exit code 1 on
       timeout, failed, or error status. doCall propagates this instead of
       hardcoding return 0.
    
    Co-Authored-By: Claude Opus 4.6 <[email protected]>
    Signed-off-by: Claus Ibsen <[email protected]>
---
 .../core/commands/action/ActionBaseCommand.java    | 25 +++++++++++++---------
 .../core/commands/action/CamelSendAction.java      | 12 +++++++----
 2 files changed, 23 insertions(+), 14 deletions(-)

diff --git 
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/action/ActionBaseCommand.java
 
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/action/ActionBaseCommand.java
index 8e4025432245..cf9bcea3b3c0 100644
--- 
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/action/ActionBaseCommand.java
+++ 
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/action/ActionBaseCommand.java
@@ -95,22 +95,27 @@ abstract class ActionBaseCommand extends CamelCommand {
                     JsonObject root = loadStatus(ph.pid());
                     // there must be a status file for the running Camel 
integration
                     if (root != null) {
+                        // skip terminated processes (e.g. launcher process 
for spring-boot/quarkus runtimes)
+                        JsonObject context = (JsonObject) root.get("context");
+                        if (context != null) {
+                            int phase = context.getIntegerOrDefault("phase", 
0);
+                            if (phase >= 9) {
+                                return;
+                            }
+                        }
                         String pName = ProcessHelper.extractName(root, ph);
                         // ignore file extension, so it is easier to match by 
name
                         pName = FileUtil.onlyName(pName);
                         if (pName != null && !pName.isEmpty() && 
PatternHelper.matchPattern(pName, pattern)) {
                             pids.add(ph.pid());
-                        } else {
+                        } else if (context != null) {
                             // try camel context name
-                            JsonObject context = (JsonObject) 
root.get("context");
-                            if (context != null) {
-                                pName = context.getString("name");
-                                if ("CamelJBang".equals(pName)) {
-                                    pName = null;
-                                }
-                                if (pName != null && !pName.isEmpty() && 
PatternHelper.matchPattern(pName, pattern)) {
-                                    pids.add(ph.pid());
-                                }
+                            pName = context.getString("name");
+                            if ("CamelJBang".equals(pName)) {
+                                pName = null;
+                            }
+                            if (pName != null && !pName.isEmpty() && 
PatternHelper.matchPattern(pName, pattern)) {
+                                pids.add(ph.pid());
                             }
                         }
                     }
diff --git 
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/action/CamelSendAction.java
 
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/action/CamelSendAction.java
index 9916840175df..930df8c0fa28 100644
--- 
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/action/CamelSendAction.java
+++ 
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/action/CamelSendAction.java
@@ -225,12 +225,10 @@ public class CamelSendAction extends ActionBaseCommand {
         this.pid = pids.get(0);
 
         Path outputFile = writeSendData();
-        showStatus(outputFile);
-
-        return 0;
+        return showStatus(outputFile);
     }
 
-    protected void showStatus(Path outputFile) throws Exception {
+    protected int showStatus(Path outputFile) throws Exception {
         try {
             // wait longer than timeout
             JsonObject jo = getJsonObject(outputFile, timeout + 10000);
@@ -278,8 +276,14 @@ public class CamelSendAction extends ActionBaseCommand {
                         printer().println(table);
                     }
                 }
+                String status = jo.getString("status");
+                if ("failed".equals(status) || "error".equals(status) || 
"timeout".equals(status)) {
+                    return 1;
+                }
+                return 0;
             } else {
                 printer().println("Send timeout");
+                return 1;
             }
         } finally {
             // delete output file after use

Reply via email to