You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by nf...@apache.org on 2022/03/30 16:37:45 UTC

[camel] 10/16: CAMEL-17792: Add doc about the message headers of camel-jms

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

nfilotto pushed a commit to branch CAMEL-17792/doc-message-headers
in repository https://gitbox.apache.org/repos/asf/camel.git

commit fb4cd97b2207504a9b39db6375e5454879ef00a7
Author: Nicolas Filotto <nf...@talend.com>
AuthorDate: Wed Mar 30 17:29:02 2022 +0200

    CAMEL-17792: Add doc about the message headers of camel-jms
---
 .../org/apache/camel/component/jms/jms.json        | 19 +++++++++
 .../camel-jms/src/main/docs/jms-component.adoc     |  3 ++
 .../component/jms/InOnlyMessageSentCallback.java   |  2 +-
 .../org/apache/camel/component/jms/JmsBinding.java | 45 ++++++++++++----------
 .../apache/camel/component/jms/JmsConstants.java   | 35 +++++++++++++++++
 .../apache/camel/component/jms/JmsEndpoint.java    |  2 +-
 .../component/jms/JmsHeaderFilterStrategy.java     |  2 +-
 .../apache/camel/component/jms/JmsProducer.java    |  4 +-
 .../component/jms/reply/ReplyManagerSupport.java   |  3 +-
 9 files changed, 88 insertions(+), 27 deletions(-)

diff --git a/components/camel-jms/src/generated/resources/org/apache/camel/component/jms/jms.json b/components/camel-jms/src/generated/resources/org/apache/camel/component/jms/jms.json
index 5544eec..da00f39 100644
--- a/components/camel-jms/src/generated/resources/org/apache/camel/component/jms/jms.json
+++ b/components/camel-jms/src/generated/resources/org/apache/camel/component/jms/jms.json
@@ -123,6 +123,25 @@
     "transactionName": { "kind": "property", "displayName": "Transaction Name", "group": "transaction (advanced)", "label": "transaction,advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.jms.JmsConfiguration", "configurationField": "configuration", "description": "The name of the transaction to use." },
     "transactionTimeout": { "kind": "property", "displayName": "Transaction Timeout", "group": "transaction (advanced)", "label": "transaction,advanced", "required": false, "type": "integer", "javaType": "int", "deprecated": false, "autowired": false, "secret": false, "defaultValue": -1, "configurationClass": "org.apache.camel.component.jms.JmsConfiguration", "configurationField": "configuration", "description": "The timeout value of the transaction (in seconds), if using transacted mode." }
   },
+  "headers": {
+    "CamelJmsDestination": { "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "javax.jms.Destination", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The destination." },
+    "CamelJmsDestinationName": { "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The name of the queue or topic to use as destination." },
+    "JMSXGroupID": { "kind": "header", "displayName": "", "group": "common", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The JMS group ID." },
+    "JMSMessageID": { "kind": "header", "displayName": "", "group": "common", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The JMS unique message ID." },
+    "JMSCorrelationID": { "kind": "header", "displayName": "", "group": "common", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The JMS correlation ID." },
+    "JMSCorrelationIDAsBytes": { "kind": "header", "displayName": "", "group": "common", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The JMS correlation ID as bytes." },
+    "JMSDeliveryMode": { "kind": "header", "displayName": "", "group": "common", "label": "", "required": false, "javaType": "int", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The JMS delivery mode." },
+    "JMSDestination": { "kind": "header", "displayName": "", "group": "common", "label": "", "required": false, "javaType": "javax.jms.Destination", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The JMS destination." },
+    "JMSExpiration": { "kind": "header", "displayName": "", "group": "common", "label": "", "required": false, "javaType": "long", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The JMS expiration." },
+    "JMSPriority": { "kind": "header", "displayName": "", "group": "common", "label": "", "required": false, "javaType": "int", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The JMS priority (with 0 as the lowest priority\nand 9 as the highest)." },
+    "JMSRedelivered": { "kind": "header", "displayName": "", "group": "common", "label": "", "required": false, "javaType": "boolean", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Is the JMS message redelivered." },
+    "JMSTimestamp": { "kind": "header", "displayName": "", "group": "common", "label": "", "required": false, "javaType": "long", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The JMS timestamp." },
+    "JMSReplyTo": { "kind": "header", "displayName": "", "group": "common", "label": "", "required": false, "javaType": "javax.jms.Destination", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The JMS reply-to destination." },
+    "JMSType": { "kind": "header", "displayName": "", "group": "common", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The JMS type." },
+    "JMSXUserID": { "kind": "header", "displayName": "", "group": "common", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The XUser id." },
+    "CamelJmsMessageType": { "kind": "header", "displayName": "", "group": "common", "label": "", "required": false, "javaType": "org.apache.camel.component.jms.JmsMessageType", "enum": [ "Bytes", "Map", "Object", "Stream", "Text", "Blob" ], "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The message type." },
+    "CamelJmsRequestTimeout": { "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "long", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "defaultValue": "20_000", "description": "The timeout for waiting for a reply when using the InOut Exchange Pattern (in milliseconds)." }
+  },
   "properties": {
     "destinationType": { "kind": "path", "displayName": "Destination Type", "group": "common", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "enum": [ "queue", "topic", "temp-queue", "temp-topic" ], "deprecated": false, "autowired": false, "secret": false, "defaultValue": "queue", "description": "The kind of destination to use" },
     "destinationName": { "kind": "path", "displayName": "Destination Name", "group": "common", "label": "", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Name of the queue or topic to use as destination" },
diff --git a/components/camel-jms/src/main/docs/jms-component.adoc b/components/camel-jms/src/main/docs/jms-component.adoc
index 8991f4e..c471aa7 100644
--- a/components/camel-jms/src/main/docs/jms-component.adoc
+++ b/components/camel-jms/src/main/docs/jms-component.adoc
@@ -190,6 +190,9 @@ include::partial$component-endpoint-options.adoc[]
 
 // endpoint options: END
 
+// component headers: START
+include::partial$component-endpoint-headers.adoc[]
+// component headers: END
 
 == Samples
 
diff --git a/components/camel-jms/src/main/java/org/apache/camel/component/jms/InOnlyMessageSentCallback.java b/components/camel-jms/src/main/java/org/apache/camel/component/jms/InOnlyMessageSentCallback.java
index e298da1..78e2671 100644
--- a/components/camel-jms/src/main/java/org/apache/camel/component/jms/InOnlyMessageSentCallback.java
+++ b/components/camel-jms/src/main/java/org/apache/camel/component/jms/InOnlyMessageSentCallback.java
@@ -41,7 +41,7 @@ public class InOnlyMessageSentCallback implements MessageSentCallback {
         if (exchange != null) {
             String id = getJMSMessageID(message);
             if (id != null) {
-                exchange.getMessage().setHeader("JMSMessageID", id);
+                exchange.getMessage().setHeader(JmsConstants.JMS_HEADER_MESSAGE_ID, id);
             }
         }
     }
diff --git a/components/camel-jms/src/main/java/org/apache/camel/component/jms/JmsBinding.java b/components/camel-jms/src/main/java/org/apache/camel/component/jms/JmsBinding.java
index da4c35d..1203270 100644
--- a/components/camel-jms/src/main/java/org/apache/camel/component/jms/JmsBinding.java
+++ b/components/camel-jms/src/main/java/org/apache/camel/component/jms/JmsBinding.java
@@ -65,7 +65,6 @@ import org.apache.camel.util.IOHelper;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import static org.apache.camel.component.jms.JmsConstants.JMS_X_GROUP_ID;
 import static org.apache.camel.component.jms.JmsMessageHelper.getSafeLongProperty;
 import static org.apache.camel.component.jms.JmsMessageHelper.normalizeDestinationName;
 import static org.apache.camel.component.jms.JmsMessageType.Bytes;
@@ -179,22 +178,25 @@ public class JmsBinding {
         if (jmsMessage != null) {
             // lets populate the standard JMS message headers
             try {
-                map.put("JMSCorrelationID", jmsMessage.getJMSCorrelationID());
-                map.put("JMSCorrelationIDAsBytes", JmsMessageHelper.getJMSCorrelationIDAsBytes(jmsMessage));
-                map.put("JMSDeliveryMode", jmsMessage.getJMSDeliveryMode());
-                map.put("JMSDestination", jmsMessage.getJMSDestination());
-                map.put("JMSExpiration", jmsMessage.getJMSExpiration());
-                map.put("JMSMessageID", jmsMessage.getJMSMessageID());
-                map.put("JMSPriority", jmsMessage.getJMSPriority());
-                map.put("JMSRedelivered", jmsMessage.getJMSRedelivered());
-                map.put("JMSTimestamp", jmsMessage.getJMSTimestamp());
-
-                map.put("JMSReplyTo", JmsMessageHelper.getJMSReplyTo(jmsMessage));
-                map.put("JMSType", JmsMessageHelper.getJMSType(jmsMessage));
+                map.put(JmsConstants.JMS_HEADER_CORRELATION_ID, jmsMessage.getJMSCorrelationID());
+                map.put(JmsConstants.JMS_HEADER_CORRELATION_ID_AS_BYTES,
+                        JmsMessageHelper.getJMSCorrelationIDAsBytes(jmsMessage));
+                map.put(JmsConstants.JMS_HEADER_DELIVERY_MODE, jmsMessage.getJMSDeliveryMode());
+                map.put(JmsConstants.JMS_HEADER_DESTINATION, jmsMessage.getJMSDestination());
+                map.put(JmsConstants.JMS_HEADER_EXPIRATION, jmsMessage.getJMSExpiration());
+                map.put(JmsConstants.JMS_HEADER_MESSAGE_ID, jmsMessage.getJMSMessageID());
+                map.put(JmsConstants.JMS_HEADER_PRIORITY, jmsMessage.getJMSPriority());
+                map.put(JmsConstants.JMS_HEADER_REDELIVERED, jmsMessage.getJMSRedelivered());
+                map.put(JmsConstants.JMS_HEADER_TIMESTAMP, jmsMessage.getJMSTimestamp());
+
+                map.put(JmsConstants.JMS_HEADER_REPLY_TO, JmsMessageHelper.getJMSReplyTo(jmsMessage));
+                map.put(JmsConstants.JMS_HEADER_TYPE, JmsMessageHelper.getJMSType(jmsMessage));
 
                 // this works around a bug in the ActiveMQ property handling
-                map.put(JMS_X_GROUP_ID, JmsMessageHelper.getStringProperty(jmsMessage, JMS_X_GROUP_ID));
-                map.put("JMSXUserID", JmsMessageHelper.getStringProperty(jmsMessage, "JMSXUserID"));
+                map.put(JmsConstants.JMS_X_GROUP_ID,
+                        JmsMessageHelper.getStringProperty(jmsMessage, JmsConstants.JMS_X_GROUP_ID));
+                map.put(JmsConstants.JMS_HEADER_XUSER_ID,
+                        JmsMessageHelper.getStringProperty(jmsMessage, JmsConstants.JMS_HEADER_XUSER_ID));
             } catch (JMSException e) {
                 throw new RuntimeCamelException(e);
             }
@@ -378,9 +380,10 @@ public class JmsBinding {
             String headerName, Object headerValue)
             throws JMSException {
         if (isStandardJMSHeader(headerName)) {
-            if (headerName.equals("JMSCorrelationID") && (endpoint == null || !endpoint.isUseMessageIDAsCorrelationID())) {
+            if (headerName.equals(JmsConstants.JMS_HEADER_CORRELATION_ID)
+                    && (endpoint == null || !endpoint.isUseMessageIDAsCorrelationID())) {
                 jmsMessage.setJMSCorrelationID(ExchangeHelper.convertToType(exchange, String.class, headerValue));
-            } else if (headerName.equals("JMSReplyTo") && headerValue != null) {
+            } else if (headerName.equals(JmsConstants.JMS_HEADER_REPLY_TO) && headerValue != null) {
                 if (headerValue instanceof String) {
                     // if the value is a String we must normalize it first, and must include the prefix
                     // as ActiveMQ requires that when converting the String to a javax.jms.Destination type
@@ -388,13 +391,13 @@ public class JmsBinding {
                 }
                 Destination replyTo = ExchangeHelper.convertToType(exchange, Destination.class, headerValue);
                 JmsMessageHelper.setJMSReplyTo(jmsMessage, replyTo);
-            } else if (headerName.equals("JMSType")) {
+            } else if (headerName.equals(JmsConstants.JMS_HEADER_TYPE)) {
                 jmsMessage.setJMSType(ExchangeHelper.convertToType(exchange, String.class, headerValue));
-            } else if (headerName.equals("JMSPriority")) {
+            } else if (headerName.equals(JmsConstants.JMS_HEADER_PRIORITY)) {
                 jmsMessage.setJMSPriority(ExchangeHelper.convertToType(exchange, Integer.class, headerValue));
-            } else if (headerName.equals("JMSDeliveryMode")) {
+            } else if (headerName.equals(JmsConstants.JMS_HEADER_DELIVERY_MODE)) {
                 JmsMessageHelper.setJMSDeliveryMode(exchange, jmsMessage, headerValue);
-            } else if (headerName.equals("JMSExpiration")) {
+            } else if (headerName.equals(JmsConstants.JMS_HEADER_EXPIRATION)) {
                 jmsMessage.setJMSExpiration(ExchangeHelper.convertToType(exchange, Long.class, headerValue));
             } else {
                 // The following properties are set by the MessageProducer:
diff --git a/components/camel-jms/src/main/java/org/apache/camel/component/jms/JmsConstants.java b/components/camel-jms/src/main/java/org/apache/camel/component/jms/JmsConstants.java
index 68066bb..69b9698 100644
--- a/components/camel-jms/src/main/java/org/apache/camel/component/jms/JmsConstants.java
+++ b/components/camel-jms/src/main/java/org/apache/camel/component/jms/JmsConstants.java
@@ -16,16 +16,51 @@
  */
 package org.apache.camel.component.jms;
 
+import org.apache.camel.spi.Metadata;
+
 /**
  * JMS constants
  */
 public final class JmsConstants {
 
+    @Metadata(label = "producer", description = "The destination.", javaType = "javax.jms.Destination")
     public static final String JMS_DESTINATION = "CamelJmsDestination";
+    @Metadata(label = "producer", description = "The name of the queue or topic to use as destination.", javaType = "String")
     public static final String JMS_DESTINATION_NAME = "CamelJmsDestinationName";
+    @Metadata(description = "The JMS group ID.", javaType = "String")
     public static final String JMS_X_GROUP_ID = "JMSXGroupID";
+    @Metadata(description = "The JMS unique message ID.", javaType = "String")
+    public static final String JMS_HEADER_MESSAGE_ID = "JMSMessageID";
+    @Metadata(description = "The JMS correlation ID.", javaType = "String")
+    public static final String JMS_HEADER_CORRELATION_ID = "JMSCorrelationID";
+    @Metadata(description = "The JMS correlation ID as bytes.", javaType = "String")
+    public static final String JMS_HEADER_CORRELATION_ID_AS_BYTES = "JMSCorrelationIDAsBytes";
+    @Metadata(description = "The JMS delivery mode.", javaType = "int")
+    public static final String JMS_HEADER_DELIVERY_MODE = "JMSDeliveryMode";
+    @Metadata(description = "The JMS destination.", javaType = "javax.jms.Destination")
+    public static final String JMS_HEADER_DESTINATION = "JMSDestination";
+    @Metadata(description = "The JMS expiration.", javaType = "long")
+    public static final String JMS_HEADER_EXPIRATION = "JMSExpiration";
+    @Metadata(description = "The JMS priority (with 0 as the lowest priority\n" +
+                            "and 9 as the highest).",
+              javaType = "int")
+    public static final String JMS_HEADER_PRIORITY = "JMSPriority";
+    @Metadata(description = "Is the JMS message redelivered.", javaType = "boolean")
+    public static final String JMS_HEADER_REDELIVERED = "JMSRedelivered";
+    @Metadata(description = "The JMS timestamp.", javaType = "long")
+    public static final String JMS_HEADER_TIMESTAMP = "JMSTimestamp";
+    @Metadata(description = "The JMS reply-to destination.", javaType = "javax.jms.Destination")
+    public static final String JMS_HEADER_REPLY_TO = "JMSReplyTo";
+    @Metadata(description = "The JMS type.", javaType = "String")
+    public static final String JMS_HEADER_TYPE = "JMSType";
+    @Metadata(description = "The XUser id.", javaType = "String")
+    public static final String JMS_HEADER_XUSER_ID = "JMSXUserID";
+    @Metadata(description = "The message type.", javaType = "org.apache.camel.component.jms.JmsMessageType")
     public static final String JMS_MESSAGE_TYPE = "CamelJmsMessageType";
     public static final String JMS_DELIVERY_MODE = "CamelJmsDeliveryMode";
+    @Metadata(label = "producer",
+              description = "The timeout for waiting for a reply when using the InOut Exchange Pattern (in milliseconds).",
+              javaType = "long", defaultValue = "20_000")
     public static final String JMS_REQUEST_TIMEOUT = "CamelJmsRequestTimeout";
 
     private JmsConstants() {
diff --git a/components/camel-jms/src/main/java/org/apache/camel/component/jms/JmsEndpoint.java b/components/camel-jms/src/main/java/org/apache/camel/component/jms/JmsEndpoint.java
index 25139a4..d491b7c 100644
--- a/components/camel-jms/src/main/java/org/apache/camel/component/jms/JmsEndpoint.java
+++ b/components/camel-jms/src/main/java/org/apache/camel/component/jms/JmsEndpoint.java
@@ -68,7 +68,7 @@ import org.springframework.util.ErrorHandler;
  */
 @ManagedResource(description = "Managed JMS Endpoint")
 @UriEndpoint(firstVersion = "1.0.0", scheme = "jms", title = "JMS", syntax = "jms:destinationType:destinationName",
-             category = { Category.MESSAGING })
+             category = { Category.MESSAGING }, headersClass = JmsConstants.class)
 @Metadata(excludeProperties = "bridgeErrorHandler")
 public class JmsEndpoint extends DefaultEndpoint
         implements AsyncEndpoint, HeaderFilterStrategyAware, MultipleConsumersSupport, Service {
diff --git a/components/camel-jms/src/main/java/org/apache/camel/component/jms/JmsHeaderFilterStrategy.java b/components/camel-jms/src/main/java/org/apache/camel/component/jms/JmsHeaderFilterStrategy.java
index e5da1f2..dd6ee57 100644
--- a/components/camel-jms/src/main/java/org/apache/camel/component/jms/JmsHeaderFilterStrategy.java
+++ b/components/camel-jms/src/main/java/org/apache/camel/component/jms/JmsHeaderFilterStrategy.java
@@ -33,7 +33,7 @@ public class JmsHeaderFilterStrategy extends DefaultHeaderFilterStrategy {
     protected void initialize() {
         // ignore provider specified JMS extension headers see page 39 of JMS 1.1 specification
         // added "JMSXRecvTimestamp" as a workaround for an Oracle bug/typo in AqjmsMessage
-        getOutFilter().add("JMSXUserID");
+        getOutFilter().add(JmsConstants.JMS_HEADER_XUSER_ID);
         getOutFilter().add("JMSXAppID");
         getOutFilter().add("JMSXDeliveryCount");
         getOutFilter().add("JMSXProducerTXID");
diff --git a/components/camel-jms/src/main/java/org/apache/camel/component/jms/JmsProducer.java b/components/camel-jms/src/main/java/org/apache/camel/component/jms/JmsProducer.java
index ca94be2..99bc202 100644
--- a/components/camel-jms/src/main/java/org/apache/camel/component/jms/JmsProducer.java
+++ b/components/camel-jms/src/main/java/org/apache/camel/component/jms/JmsProducer.java
@@ -206,7 +206,7 @@ public class JmsProducer extends DefaultAsyncProducer {
 
         final String correlationProperty = configuration.getCorrelationProperty();
 
-        final String correlationPropertyToUse = ofNullable(correlationProperty).orElse("JMSCorrelationID");
+        final String correlationPropertyToUse = ofNullable(correlationProperty).orElse(JmsConstants.JMS_HEADER_CORRELATION_ID);
 
         final String originalCorrelationId = in.getHeader(correlationPropertyToUse, String.class);
 
@@ -338,7 +338,7 @@ public class JmsProducer extends DefaultAsyncProducer {
                     // if the binding did not create the reply to then we have to try to create it here
                     if (jmsReplyTo == null) {
                         // prefer reply to from header over endpoint configured
-                        jmsReplyTo = exchange.getIn().getHeader("JMSReplyTo", String.class);
+                        jmsReplyTo = exchange.getIn().getHeader(JmsConstants.JMS_HEADER_REPLY_TO, String.class);
                         if (jmsReplyTo == null) {
                             jmsReplyTo = endpoint.getReplyTo();
                         }
diff --git a/components/camel-jms/src/main/java/org/apache/camel/component/jms/reply/ReplyManagerSupport.java b/components/camel-jms/src/main/java/org/apache/camel/component/jms/reply/ReplyManagerSupport.java
index 2564fbe..1c4c3e0 100644
--- a/components/camel-jms/src/main/java/org/apache/camel/component/jms/reply/ReplyManagerSupport.java
+++ b/components/camel-jms/src/main/java/org/apache/camel/component/jms/reply/ReplyManagerSupport.java
@@ -31,6 +31,7 @@ import org.apache.camel.AsyncCallback;
 import org.apache.camel.CamelContext;
 import org.apache.camel.Exchange;
 import org.apache.camel.ExchangeTimedOutException;
+import org.apache.camel.component.jms.JmsConstants;
 import org.apache.camel.component.jms.JmsEndpoint;
 import org.apache.camel.component.jms.JmsMessage;
 import org.apache.camel.component.jms.JmsMessageHelper;
@@ -205,7 +206,7 @@ public abstract class ReplyManagerSupport extends ServiceSupport implements Repl
                     // restore correlation id in case the remote server messed with it
                     if (holder.getOriginalCorrelationId() != null) {
                         JmsMessageHelper.setCorrelationId(message, holder.getOriginalCorrelationId());
-                        exchange.getOut().setHeader("JMSCorrelationID", holder.getOriginalCorrelationId());
+                        exchange.getOut().setHeader(JmsConstants.JMS_HEADER_CORRELATION_ID, holder.getOriginalCorrelationId());
                     }
                 }
             } finally {