This is an automated email from the ASF dual-hosted git repository. davsclaus pushed a commit to branch main in repository https://gitbox.apache.org/repos/asf/camel.git
The following commit(s) were added to refs/heads/main by this push: new 94b6dc08319 CAMEL-21749: camel-nats - Add metadata from status message so you can know the code/error message. 94b6dc08319 is described below commit 94b6dc08319d904e7cf1fc203975b8d41af0421b Author: Claus Ibsen <claus.ib...@gmail.com> AuthorDate: Mon May 26 14:46:55 2025 +0200 CAMEL-21749: camel-nats - Add metadata from status message so you can know the code/error message. --- .../org/apache/camel/catalog/components/nats.json | 6 ++-- .../org/apache/camel/component/nats/nats.json | 6 ++-- .../apache/camel/component/nats/NatsComponent.java | 3 ++ .../camel/component/nats/NatsConfiguration.java | 2 +- .../apache/camel/component/nats/NatsConstants.java | 5 +++ .../apache/camel/component/nats/NatsConsumer.java | 4 +++ .../apache/camel/component/nats/NatsProducer.java | 2 -- .../endpoint/dsl/NatsEndpointBuilderFactory.java | 36 ++++++++++++++++++---- 8 files changed, 51 insertions(+), 13 deletions(-) diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/nats.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/nats.json index 64909ca6ad1..fa50b43849e 100644 --- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/nats.json +++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/nats.json @@ -37,7 +37,9 @@ "CamelNatsSID": { "index": 1, "kind": "header", "displayName": "", "group": "common", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The SID of a consumed message.", "constantName": "org.apache.camel.component.nats.NatsConstants#NATS_SID" }, "CamelNatsReplyTo": { "index": 2, "kind": "header", "displayName": "", "group": "common", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The ReplyTo of a consumed message (may be null).", "constantName": "org.apache.camel.component.nats.NatsConstants#NATS_REPLY_TO" }, "CamelNatsSubject": { "index": 3, "kind": "header", "displayName": "", "group": "common", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The Subject of a consumed message.", "constantName": "org.apache.camel.component.nats.NatsConstants#NATS_SUBJECT" }, - "CamelNatsQueueName": { "index": 4, "kind": "header", "displayName": "", "group": "common", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The Queue name of a consumed message (may be null).", "constantName": "org.apache.camel.component.nats.NatsConstants#NATS_QUEUE_NAME" } + "CamelNatsQueueName": { "index": 4, "kind": "header", "displayName": "", "group": "common", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The Queue name of a consumed message (may be null).", "constantName": "org.apache.camel.component.nats.NatsConstants#NATS_QUEUE_NAME" }, + "CamelNatsStatusCode": { "index": 5, "kind": "header", "displayName": "", "group": "consumer", "label": "consumer", "required": false, "javaType": "int", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Status message code", "constantName": "org.apache.camel.component.nats.NatsConstants#NATS_STATUS_CODE" }, + "CamelNatsStatusError": { "index": 6, "kind": "header", "displayName": "", "group": "consumer", "label": "consumer", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Status message error message", "constantName": "org.apache.camel.component.nats.NatsConstants#NATS_STATUS_ERROR" } }, "properties": { "topic": { "index": 0, "kind": "path", "displayName": "Topic", "group": "common", "label": "", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.nats.NatsConfiguration", "configurationField": "configuration", "description": "The name of topic we want to use" }, @@ -66,7 +68,7 @@ "requestTimeout": { "index": 23, "kind": "parameter", "displayName": "Request Timeout", "group": "producer", "label": "producer", "required": false, "type": "integer", "javaType": "long", "deprecated": false, "autowired": false, "secret": false, "defaultValue": 20000, "configurationClass": "org.apache.camel.component.nats.NatsConfiguration", "configurationField": "configuration", "description": "Request timeout in milliseconds" }, "lazyStartProducer": { "index": 24, "kind": "parameter", "displayName": "Lazy Start Producer", "group": "producer (advanced)", "label": "producer,advanced", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a produ [...] "connection": { "index": 25, "kind": "parameter", "displayName": "Connection", "group": "advanced", "label": "advanced", "required": false, "type": "object", "javaType": "io.nats.client.Connection", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.nats.NatsConfiguration", "configurationField": "configuration", "description": "Reference an already instantiated connection to Nats server" }, - "headerFilterStrategy": { "index": 26, "kind": "parameter", "displayName": "Header Filter Strategy", "group": "advanced", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.spi.HeaderFilterStrategy", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.nats.NatsConfiguration", "configurationField": "configuration", "description": "Define the header filtering strategy" }, + "headerFilterStrategy": { "index": 26, "kind": "parameter", "displayName": "Header Filter Strategy", "group": "advanced", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.spi.HeaderFilterStrategy", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.nats.NatsConfiguration", "configurationField": "configuration", "description": "To use a custom header filter strategy." }, "traceConnection": { "index": 27, "kind": "parameter", "displayName": "Trace Connection", "group": "advanced", "label": "advanced", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "configurationClass": "org.apache.camel.component.nats.NatsConfiguration", "configurationField": "configuration", "description": "Whether or not connection trace messages should be printed to standard out for fine [...] "credentialsFilePath": { "index": 28, "kind": "parameter", "displayName": "Credentials File Path", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.nats.NatsConfiguration", "configurationField": "configuration", "description": "If we use useCredentialsFile to true we'll need to set the credentialsFilePath option. It [...] "secure": { "index": 29, "kind": "parameter", "displayName": "Secure", "group": "security", "label": "security", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "configurationClass": "org.apache.camel.component.nats.NatsConfiguration", "configurationField": "configuration", "description": "Set secure option indicating TLS is required" }, diff --git a/components/camel-nats/src/generated/resources/META-INF/org/apache/camel/component/nats/nats.json b/components/camel-nats/src/generated/resources/META-INF/org/apache/camel/component/nats/nats.json index 64909ca6ad1..fa50b43849e 100644 --- a/components/camel-nats/src/generated/resources/META-INF/org/apache/camel/component/nats/nats.json +++ b/components/camel-nats/src/generated/resources/META-INF/org/apache/camel/component/nats/nats.json @@ -37,7 +37,9 @@ "CamelNatsSID": { "index": 1, "kind": "header", "displayName": "", "group": "common", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The SID of a consumed message.", "constantName": "org.apache.camel.component.nats.NatsConstants#NATS_SID" }, "CamelNatsReplyTo": { "index": 2, "kind": "header", "displayName": "", "group": "common", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The ReplyTo of a consumed message (may be null).", "constantName": "org.apache.camel.component.nats.NatsConstants#NATS_REPLY_TO" }, "CamelNatsSubject": { "index": 3, "kind": "header", "displayName": "", "group": "common", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The Subject of a consumed message.", "constantName": "org.apache.camel.component.nats.NatsConstants#NATS_SUBJECT" }, - "CamelNatsQueueName": { "index": 4, "kind": "header", "displayName": "", "group": "common", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The Queue name of a consumed message (may be null).", "constantName": "org.apache.camel.component.nats.NatsConstants#NATS_QUEUE_NAME" } + "CamelNatsQueueName": { "index": 4, "kind": "header", "displayName": "", "group": "common", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The Queue name of a consumed message (may be null).", "constantName": "org.apache.camel.component.nats.NatsConstants#NATS_QUEUE_NAME" }, + "CamelNatsStatusCode": { "index": 5, "kind": "header", "displayName": "", "group": "consumer", "label": "consumer", "required": false, "javaType": "int", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Status message code", "constantName": "org.apache.camel.component.nats.NatsConstants#NATS_STATUS_CODE" }, + "CamelNatsStatusError": { "index": 6, "kind": "header", "displayName": "", "group": "consumer", "label": "consumer", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Status message error message", "constantName": "org.apache.camel.component.nats.NatsConstants#NATS_STATUS_ERROR" } }, "properties": { "topic": { "index": 0, "kind": "path", "displayName": "Topic", "group": "common", "label": "", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.nats.NatsConfiguration", "configurationField": "configuration", "description": "The name of topic we want to use" }, @@ -66,7 +68,7 @@ "requestTimeout": { "index": 23, "kind": "parameter", "displayName": "Request Timeout", "group": "producer", "label": "producer", "required": false, "type": "integer", "javaType": "long", "deprecated": false, "autowired": false, "secret": false, "defaultValue": 20000, "configurationClass": "org.apache.camel.component.nats.NatsConfiguration", "configurationField": "configuration", "description": "Request timeout in milliseconds" }, "lazyStartProducer": { "index": 24, "kind": "parameter", "displayName": "Lazy Start Producer", "group": "producer (advanced)", "label": "producer,advanced", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a produ [...] "connection": { "index": 25, "kind": "parameter", "displayName": "Connection", "group": "advanced", "label": "advanced", "required": false, "type": "object", "javaType": "io.nats.client.Connection", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.nats.NatsConfiguration", "configurationField": "configuration", "description": "Reference an already instantiated connection to Nats server" }, - "headerFilterStrategy": { "index": 26, "kind": "parameter", "displayName": "Header Filter Strategy", "group": "advanced", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.spi.HeaderFilterStrategy", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.nats.NatsConfiguration", "configurationField": "configuration", "description": "Define the header filtering strategy" }, + "headerFilterStrategy": { "index": 26, "kind": "parameter", "displayName": "Header Filter Strategy", "group": "advanced", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.spi.HeaderFilterStrategy", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.nats.NatsConfiguration", "configurationField": "configuration", "description": "To use a custom header filter strategy." }, "traceConnection": { "index": 27, "kind": "parameter", "displayName": "Trace Connection", "group": "advanced", "label": "advanced", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "configurationClass": "org.apache.camel.component.nats.NatsConfiguration", "configurationField": "configuration", "description": "Whether or not connection trace messages should be printed to standard out for fine [...] "credentialsFilePath": { "index": 28, "kind": "parameter", "displayName": "Credentials File Path", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.nats.NatsConfiguration", "configurationField": "configuration", "description": "If we use useCredentialsFile to true we'll need to set the credentialsFilePath option. It [...] "secure": { "index": 29, "kind": "parameter", "displayName": "Secure", "group": "security", "label": "security", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "configurationClass": "org.apache.camel.component.nats.NatsConfiguration", "configurationField": "configuration", "description": "Set secure option indicating TLS is required" }, diff --git a/components/camel-nats/src/main/java/org/apache/camel/component/nats/NatsComponent.java b/components/camel-nats/src/main/java/org/apache/camel/component/nats/NatsComponent.java index e1b10bb67c5..19b96a41ed1 100644 --- a/components/camel-nats/src/main/java/org/apache/camel/component/nats/NatsComponent.java +++ b/components/camel-nats/src/main/java/org/apache/camel/component/nats/NatsComponent.java @@ -37,6 +37,9 @@ public class NatsComponent extends HeaderFilterStrategyComponent implements SSLC @Override protected Endpoint createEndpoint(String uri, String remaining, Map<String, Object> parameters) throws Exception { NatsConfiguration config = new NatsConfiguration(); + if (getHeaderFilterStrategy() != null) { + config.setHeaderFilterStrategy(getHeaderFilterStrategy()); + } config.setTopic(remaining); config.setServers(servers); config.setVerbose(verbose); diff --git a/components/camel-nats/src/main/java/org/apache/camel/component/nats/NatsConfiguration.java b/components/camel-nats/src/main/java/org/apache/camel/component/nats/NatsConfiguration.java index 7190f51b4a1..b41fa518c34 100644 --- a/components/camel-nats/src/main/java/org/apache/camel/component/nats/NatsConfiguration.java +++ b/components/camel-nats/src/main/java/org/apache/camel/component/nats/NatsConfiguration.java @@ -353,7 +353,7 @@ public class NatsConfiguration { } /** - * Define the header filtering strategy + * To use a custom header filter strategy. */ public void setHeaderFilterStrategy(HeaderFilterStrategy headerFilterStrategy) { this.headerFilterStrategy = headerFilterStrategy; diff --git a/components/camel-nats/src/main/java/org/apache/camel/component/nats/NatsConstants.java b/components/camel-nats/src/main/java/org/apache/camel/component/nats/NatsConstants.java index 5c0b98a26a5..a7cce6d4d1b 100644 --- a/components/camel-nats/src/main/java/org/apache/camel/component/nats/NatsConstants.java +++ b/components/camel-nats/src/main/java/org/apache/camel/component/nats/NatsConstants.java @@ -30,5 +30,10 @@ public interface NatsConstants { String NATS_SUBJECT = "CamelNatsSubject"; @Metadata(description = "The Queue name of a consumed message (may be null).", javaType = "String") String NATS_QUEUE_NAME = "CamelNatsQueueName"; + @Metadata(label = "consumer", description = "Status message code", javaType = "int") + String NATS_STATUS_CODE = "CamelNatsStatusCode"; + @Metadata(label = "consumer", description = "Status message error message", javaType = "String") + String NATS_STATUS_ERROR = "CamelNatsStatusError"; + String NATS_REQUEST_TIMEOUT_THREAD_PROFILE_NAME = "CamelNatsRequestTimeoutExecutor"; } diff --git a/components/camel-nats/src/main/java/org/apache/camel/component/nats/NatsConsumer.java b/components/camel-nats/src/main/java/org/apache/camel/component/nats/NatsConsumer.java index 56f9f708194..31ff448a852 100644 --- a/components/camel-nats/src/main/java/org/apache/camel/component/nats/NatsConsumer.java +++ b/components/camel-nats/src/main/java/org/apache/camel/component/nats/NatsConsumer.java @@ -167,6 +167,10 @@ public class NatsConsumer extends DefaultConsumer { exchange.getIn().setHeader(NatsConstants.NATS_SUBJECT, msg.getSubject()); exchange.getIn().setHeader(NatsConstants.NATS_QUEUE_NAME, msg.getSubscription().getQueueName()); exchange.getIn().setHeader(NatsConstants.NATS_MESSAGE_TIMESTAMP, System.currentTimeMillis()); + if (msg.isStatusMessage() && msg.getStatus() != null) { + exchange.getIn().setHeader(NatsConstants.NATS_STATUS_CODE, msg.getStatus().getCode()); + exchange.getIn().setHeader(NatsConstants.NATS_STATUS_ERROR, msg.getStatus().getMessage()); + } if (msg.getHeaders() != null) { final HeaderFilterStrategy strategy = NatsConsumer.this.getEndpoint() .getConfiguration() diff --git a/components/camel-nats/src/main/java/org/apache/camel/component/nats/NatsProducer.java b/components/camel-nats/src/main/java/org/apache/camel/component/nats/NatsProducer.java index 32f17ede84f..a672763d127 100644 --- a/components/camel-nats/src/main/java/org/apache/camel/component/nats/NatsProducer.java +++ b/components/camel-nats/src/main/java/org/apache/camel/component/nats/NatsProducer.java @@ -44,9 +44,7 @@ public class NatsProducer extends DefaultAsyncProducer { private static final Logger LOG = LoggerFactory.getLogger(NatsProducer.class); private final ExecutorServiceManager executorServiceManager; - private ScheduledExecutorService scheduler; - private Connection connection; public NatsProducer(NatsEndpoint endpoint) { diff --git a/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/NatsEndpointBuilderFactory.java b/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/NatsEndpointBuilderFactory.java index e2e3c57afef..4b8fde899ac 100644 --- a/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/NatsEndpointBuilderFactory.java +++ b/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/NatsEndpointBuilderFactory.java @@ -784,7 +784,7 @@ public interface NatsEndpointBuilderFactory { return this; } /** - * Define the header filtering strategy. + * To use a custom header filter strategy. * * The option is a: * <code>org.apache.camel.spi.HeaderFilterStrategy</code> type. @@ -799,7 +799,7 @@ public interface NatsEndpointBuilderFactory { return this; } /** - * Define the header filtering strategy. + * To use a custom header filter strategy. * * The option will be converted to a * <code>org.apache.camel.spi.HeaderFilterStrategy</code> type. @@ -1481,7 +1481,7 @@ public interface NatsEndpointBuilderFactory { return this; } /** - * Define the header filtering strategy. + * To use a custom header filter strategy. * * The option is a: * <code>org.apache.camel.spi.HeaderFilterStrategy</code> type. @@ -1496,7 +1496,7 @@ public interface NatsEndpointBuilderFactory { return this; } /** - * Define the header filtering strategy. + * To use a custom header filter strategy. * * The option will be converted to a * <code>org.apache.camel.spi.HeaderFilterStrategy</code> type. @@ -2092,7 +2092,7 @@ public interface NatsEndpointBuilderFactory { return this; } /** - * Define the header filtering strategy. + * To use a custom header filter strategy. * * The option is a: * <code>org.apache.camel.spi.HeaderFilterStrategy</code> type. @@ -2107,7 +2107,7 @@ public interface NatsEndpointBuilderFactory { return this; } /** - * Define the header filtering strategy. + * To use a custom header filter strategy. * * The option will be converted to a * <code>org.apache.camel.spi.HeaderFilterStrategy</code> type. @@ -2281,6 +2281,30 @@ public interface NatsEndpointBuilderFactory { public String natsQueueName() { return "CamelNatsQueueName"; } + /** + * Status message code. + * + * The option is a: {@code int} type. + * + * Group: consumer + * + * @return the name of the header {@code NatsStatusCode}. + */ + public String natsStatusCode() { + return "CamelNatsStatusCode"; + } + /** + * Status message error message. + * + * The option is a: {@code String} type. + * + * Group: consumer + * + * @return the name of the header {@code NatsStatusError}. + */ + public String natsStatusError() { + return "CamelNatsStatusError"; + } } static NatsEndpointBuilder endpointBuilder(String componentName, String path) { class NatsEndpointBuilderImpl extends AbstractEndpointBuilder implements NatsEndpointBuilder, AdvancedNatsEndpointBuilder {