blob: b18901c7e9f6610a448e2565604ea9ffae337356 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef _CMS_MESSAGE_H_
#define _CMS_MESSAGE_H_
#include <cms/Config.h>
#include <cms/Destination.h>
#include <cms/DeliveryMode.h>
#include <cms/CMSException.h>
#include <cms/IllegalStateException.h>
#include <cms/MessageFormatException.h>
#include <cms/MessageNotWriteableException.h>
namespace cms {
/**
* Root of all messages. As in JMS, a message is comprised of 3 parts:
* CMS-specific headers, user-defined properties, and the body.
*
* <B>Message Bodies</B>
*
* The CMS API defines four types of message bodies, each type is contained within its
* own Message Interface definition.
*
* - Stream - A StreamMessage object's message body contains a stream of primitive values
* in the C++ language. It is filled and read sequentially. Unlike the
* BytesMessage type the values written to a StreamMessage retain information
* on their type and rules for type conversion are enforced when reading back
* the values from the Message Body.
* - Map - A MapMessage object's message body contains a set of name-value pairs, where
* names are std::string objects, and values are C++ primitives. The entries can
* be accessed sequentially or randomly by name. The MapMessage makes no garuntee
* on the order of the elements within the Message body.
* - Text - A TextMessage object's message body contains a std::string object. This message
* type can be used to transport plain-text messages, and XML messages.
* - Bytes - A BytesMessage object's message body contains a stream of uninterpreted bytes.
* This message type is for literally encoding a body to match an existing message
* format. In many cases, it is possible to use one of the other body types,
* which are easier to use.
*
* <B>Message Properties</B>
*
* Message properties support the following conversion table. The marked cases
* must be supported. The unmarked cases must throw a CMSException. The
* String-to-primitive conversions may throw a runtime exception if the primitive's
* valueOf method does not accept the String as a valid representation of the
* primitive.
*
* A value written as the row type can be read as the column type.
*
* <PRE>
* | | boolean byte short int long float double String
* |----------------------------------------------------------
* |boolean | X X
* |byte | X X X X X
* |short | X X X X
* |int | X X X
* |long | X X
* |float | X X X
* |double | X X
* |String | X X X X X X X X
* |----------------------------------------------------------
* </PRE>
*
* When a Message is delivered its properties are considered to be in a read-only
* mode and cannot be changed. Attempting to change the value of a delivered
* Message's properties will result in a CMSException being thrown.
*
* @see JMS API
* @since 1.0
*/
class CMS_API Message {
public:
/**
* The Default delivery mode for Message Producers is PERSISTENT.
*/
static const int DEFAULT_DELIVERY_MODE;
/**
* The Default priority assigned to a Message is 4.
*/
static const int DEFAULT_MSG_PRIORITY;
/**
* The Default Time to Live for a Message Producer is unlimited, the message will never expire.
*/
static const long long DEFAULT_TIME_TO_LIVE;
/**
* Defines the Type Identifiers used to identify the type contained within a specific
* Message property or MapMessage keyed value. CMS Providers can store other types in
* their internal representations, which should map to the UNKNOWN_TYPE from the CMS
* API.
*/
enum ValueType {
NULL_TYPE = 0,
BOOLEAN_TYPE = 1,
BYTE_TYPE = 2,
CHAR_TYPE = 3,
SHORT_TYPE = 4,
INTEGER_TYPE = 5,
LONG_TYPE = 6,
DOUBLE_TYPE = 7,
FLOAT_TYPE = 8,
STRING_TYPE = 9,
BYTE_ARRAY_TYPE = 10,
UNKNOWN_TYPE = 11
};
public:
virtual ~Message();
/**
* Clone this message exactly, returns a new instance that the
* caller is required to delete.
*
* @return new copy of this message
*/
virtual Message* clone() const = 0;
/**
* Acknowledges all consumed messages of the session of this consumed
* message.
*
* All consumed CMS messages support the acknowledge method for use
* when a client has specified that its CMS session's consumed messages
* are to be explicitly acknowledged. By invoking acknowledge on a
* consumed message, a client acknowledges all messages consumed by the
* session that the message was delivered to.
*
* Calls to acknowledge are ignored for both transacted sessions and
* sessions specified to use implicit acknowledgment modes.
*
* A client may individually acknowledge each message as it is consumed,
* or it may choose to acknowledge messages as an application-defined
* group (which is done by calling acknowledge on the last received
* message of the group, thereby acknowledging all messages consumed by
* the session.)
*
* Messages that have been received but not acknowledged may be
* redelivered.
*
* @throws CMSException - if an internal error occurs.
* @throws IllegalStateException - if this method is called on a closed session.
*/
virtual void acknowledge() const = 0;
/**
* Clears out the body of the message. This does not clear the
* headers or properties.
*
* @throws CMSException - if an internal error occurs.
*/
virtual void clearBody() = 0;
/**
* Clears out the message body. Clearing a message's body does not clear
* its header values or property entries.
*
* If this message body was read-only, calling this method leaves the
* message body in the same state as an empty body in a newly created
* message.
*
* @throws CMSException - if an internal error occurs.
*/
virtual void clearProperties() = 0;
/**
* Retrieves the property names.
*
* @return The complete set of property names currently in this
* message.
*
* @throws CMSException - if an internal error occurs.
*/
virtual std::vector<std::string> getPropertyNames() const = 0;
/**
* Indicates whether or not a given property exists.
*
* @param name
* The name of the property to look up.
* @return True if the property exists in this message.
*
* @throws CMSException - if an internal error occurs.
*/
virtual bool propertyExists(const std::string& name) const = 0;
/**
* Returns the value type for the given property key. The CMS provider
* should translate all internal type identifiers into the CMS Value types
* returning UNKNOWN_TYPE for any specialized types not directly supported
* in the CMS API.
*
* @param name
* The string property name key used to look up the value type.
*
* @return The ValueType contained in the given property.
*
* @throws CMSException if no property exists that matches the requested key.
*/
virtual ValueType getPropertyValueType(const std::string& name) const = 0;
/**
* Gets a boolean property.
*
* @param name
* The name of the property to retrieve.
* @return The value for the named property.
*
* @throws CMSException if the property does not exist.
* @throws MessageFormatException - if this type conversion is invalid.
*/
virtual bool getBooleanProperty(const std::string& name) const = 0;
/**
* Gets a byte property.
*
* @param name
* The name of the property to retrieve.
* @return The value for the named property.
*
* @throws CMSException if the property does not exist.
* @throws MessageFormatException - if this type conversion is invalid.
*/
virtual unsigned char getByteProperty(const std::string& name) const = 0;
/**
* Gets a double property.
*
* @param name
* The name of the property to retrieve.
* @return The value for the named property.
*
* @throws CMSException if the property does not exist.
* @throws MessageFormatException - if this type conversion is invalid.
*/
virtual double getDoubleProperty(const std::string& name) const = 0;
/**
* Gets a float property.
*
* @param name
* The name of the property to retrieve.
* @return The value for the named property.
*
* @throws CMSException if the property does not exist.
* @throws MessageFormatException - if this type conversion is invalid.
*/
virtual float getFloatProperty(const std::string& name) const = 0;
/**
* Gets a int property.
*
* @param name
* The name of the property to retrieve.
* @return The value for the named property.
*
* @throws CMSException if the property does not exist.
* @throws MessageFormatException - if this type conversion is invalid.
*/
virtual int getIntProperty(const std::string& name) const = 0;
/**
* Gets a long property.
*
* @param name
* The name of the property to retrieve.
* @return The value for the named property.
*
* @throws CMSException if the property does not exist.
* @throws MessageFormatException - if this type conversion is invalid.
*/
virtual long long getLongProperty(const std::string& name) const = 0;
/**
* Gets a short property.
*
* @param name
* The name of the property to retrieve.
* @return The value for the named property.
*
* @throws CMSException if the property does not exist.
* @throws MessageFormatException - if this type conversion is invalid.
*/
virtual short getShortProperty(const std::string& name) const = 0;
/**
* Gets a string property.
*
* @param name
* The name of the property to retrieve.
* @return The value for the named property.
*
* @throws CMSException if the property does not exist.
* @throws MessageFormatException - if this type conversion is invalid.
*/
virtual std::string getStringProperty(const std::string& name) const = 0;
/**
* Sets a boolean property.
*
* @param name
* The name of the property to retrieve.
* @param value
* The value for the named property.
*
* @throws CMSException - if the name is an empty string.
* @throws MessageNotWriteableException - if properties are read-only
*/
virtual void setBooleanProperty(const std::string& name, bool value) = 0;
/**
* Sets a byte property.
*
* @param name
* The name of the property to retrieve.
* @param value
* The value for the named property.
*
* @throws CMSException - if the name is an empty string.
* @throws MessageNotWriteableException - if properties are read-only
*/
virtual void setByteProperty(const std::string& name, unsigned char value) = 0;
/**
* Sets a double property.
*
* @param name
* The name of the property to retrieve.
* @param value
* The value for the named property.
*
* @throws CMSException - if the name is an empty string.
* @throws MessageNotWriteableException - if properties are read-only
*/
virtual void setDoubleProperty(const std::string& name, double value) = 0;
/**
* Sets a float property.
* @param name
* The name of the property to retrieve.
* @param value
* The value for the named property.
*
* @throws CMSException - if the name is an empty string.
* @throws MessageNotWriteableException - if properties are read-only
*/
virtual void setFloatProperty(const std::string& name, float value) = 0;
/**
* Sets a int property.
*
* @param name
* The name of the property to retrieve.
* @param value
* The value for the named property.
*
* @throws CMSException - if the name is an empty string.
* @throws MessageNotWriteableException - if properties are read-only
*/
virtual void setIntProperty(const std::string& name, int value) = 0;
/**
* Sets a long property.
*
* @param name
* The name of the property to retrieve.
* @param value
* The value for the named property.
*
* @throws CMSException - if the name is an empty string.
* @throws MessageNotWriteableException - if properties are read-only
*/
virtual void setLongProperty(const std::string& name, long long value) = 0;
/**
* Sets a short property.
*
* @param name
* The name of the property to retrieve.
* @param value
* The value for the named property.
*
* @throws CMSException - if the name is an empty string.
* @throws MessageNotWriteableException - if properties are read-only
*/
virtual void setShortProperty(const std::string& name, short value) = 0;
/**
* Sets a string property.
*
* @param name
* The name of the property to retrieve.
* @param value
* The value for the named property.
*
* @throws CMSException - if the name is an empty string.
* @throws MessageNotWriteableException - if properties are read-only
*/
virtual void setStringProperty(const std::string& name, const std::string& value) = 0;
/**
* Gets the correlation ID for the message.
*
* This method is used to return correlation ID values that are either
* provider-specific message IDs or application-specific String values.
*
* @return string representation of the correlation Id
*
* @throws CMSException - if an internal error occurs.
*/
virtual std::string getCMSCorrelationID() const = 0;
/**
* Sets the correlation ID for the message.
*
* A client can use the CMSCorrelationID header field to link one
* message with another. A typical use is to link a response message
* with its request message.
*
* CMSCorrelationID can hold one of the following:
*
* - A provider-specific message ID
* - An application-specific String
* - A provider-native byte[] value
*
* Since each message sent by a CMS provider is assigned a message ID
* value, it is convenient to link messages via message ID. All message
* ID values must start with the 'ID:' prefix.
*
* In some cases, an application (made up of several clients) needs to
* use an application-specific value for linking messages. For instance,
* an application may use CMSCorrelationID to hold a value referencing
* some external information. Application-specified values must not
* start with the 'ID:' prefix; this is reserved for provider-generated
* message ID values.
*
* If a provider supports the native concept of correlation ID, a CMS
* client may need to assign specific CMSCorrelationID values to match
* those expected by clients that do not use the CMS API. A byte[] value
* is used for this purpose. CMS providers without native correlation ID
* values are not required to support byte[] values. The use of a byte[]
* value for CMSCorrelationID is non-portable.
*
* @param correlationId
* The message ID of a message being referred to.
*
* @throws CMSException - if an internal error occurs.
*/
virtual void setCMSCorrelationID(const std::string& correlationId) = 0;
/**
* Gets the DeliveryMode for this message
*
* @return DeliveryMode enumerated value.
*
* @throws CMSException - if an internal error occurs.
*/
virtual int getCMSDeliveryMode() const = 0;
/**
* Sets the DeliveryMode for this message
*
* CMS providers set this field when a message is sent. This method can
* be used to change the value for a message that has been received.
*
* @param mode
* DeliveryMode enumerated value.
*
* @throws CMSException - if an internal error occurs.
*/
virtual void setCMSDeliveryMode(int mode) = 0;
/**
* Gets the Destination object for this message.
*
* The CMSDestination header field contains the destination to which the
* message is being sent.
*
* When a message is sent, this field is ignored. After completion of
* the send or publish method, the field holds the destination specified
* by the method.
*
* When a message is received, its CMSDestination value must be
* equivalent to the value assigned when it was sent.
*
* @return Destination object
*
* @throws CMSException - if an internal error occurs.
*/
virtual const Destination* getCMSDestination() const = 0;
/**
* Sets the Destination object for this message.
*
* CMS providers set this field when a message is sent. This method can
* be used to change the value for a message that has been received.
*
* @param destination
* Destination Object
*
* @throws CMSException - if an internal error occurs.
*/
virtual void setCMSDestination(const Destination* destination) = 0;
/**
* Gets the message's expiration value.
*
* When a message is sent, the CMSExpiration header field is left
* unassigned. After completion of the send or publish method, it holds
* the expiration time of the message. This is the sum of the
* time-to-live value specified by the client and the GMT at the time
* of the send or publish.
*
* If the time-to-live is specified as zero, CMSExpiration is set to
* zero to indicate that the message does not expire.
*
* When a message's expiration time is reached, a provider should
* discard it. The CMS API does not define any form of notification of
* message expiration.
*
* Clients should not receive messages that have expired; however, the
* CMS API does not guarantee that this will not happen.
*
* @return the time the message expires, which is the sum of the
* time-to-live value specified by the client and the GMT at the time
* of the send
*
* @throws CMSException - if an internal error occurs.
*/
virtual long long getCMSExpiration() const = 0;
/**
* Sets the message's expiration value.
*
* CMS providers set this field when a message is sent. This method can
* be used to change the value for a message that has been received.
*
* @param expireTime
* the message's expiration time
*
* @throws CMSException - if an internal error occurs.
*/
virtual void setCMSExpiration(long long expireTime) = 0;
/**
* The CMSMessageID header field contains a value that uniquely
* identifies each message sent by a provider.
*
* When a message is sent, CMSMessageID can be ignored. When the
* send or publish method returns, it contains a provider-assigned
* value.
*
* A CMSMessageID is a String value that should function as a unique
* key for identifying messages in a historical repository. The exact
* scope of uniqueness is provider-defined. It should at least cover
* all messages for a specific installation of a provider, where an
* installation is some connected set of message routers.
*
* All CMSMessageID values must start with the prefix 'ID:'. Uniqueness
* of message ID values across different providers is not required.
*
* Since message IDs take some effort to create and increase a
* message's size, some CMS providers may be able to optimize message
* overhead if they are given a hint that the message ID is not used by
* an application. By calling the MessageProducer.setDisableMessageID
* method, a CMS client enables this potential optimization for all
* messages sent by that message producer. If the CMS provider accepts
* this hint, these messages must have the message ID set to null; if
* the provider ignores the hint, the message ID must be set to its
* normal unique value.
*
* @return provider-assigned message id
*
* @throws CMSException - if an internal error occurs.
*/
virtual std::string getCMSMessageID() const = 0;
/**
* Sets the message ID.
*
* CMS providers set this field when a message is sent. This method can
* be used to change the value for a message that has been received.
*
* @param id
* the ID of the message
*
* @throws CMSException - if an internal error occurs.
*/
virtual void setCMSMessageID(const std::string& id) = 0;
/**
* Gets the message priority level.
*
* The CMS API defines ten levels of priority value, with 0 as the
* lowest priority and 9 as the highest. In addition, clients should
* consider priorities 0-4 as gradations of normal priority and
* priorities 5-9 as gradations of expedited priority.
*
* The CMS API does not require that a provider strictly implement
* priority ordering of messages; however, it should do its best to
* deliver expedited messages ahead of normal messages.
*
* @return priority value
*
* @throws CMSException - if an internal error occurs.
*/
virtual int getCMSPriority() const = 0;
/**
* Sets the Priority Value for this message
*
* CMS providers set this field when a message is sent. This method can
* be used to change the value for a message that has been received.
*
* @param priority
* priority value for this message
*
* @throws CMSException - if an internal error occurs.
*/
virtual void setCMSPriority(int priority) = 0;
/**
* Gets an indication of whether this message is being redelivered.
*
* If a client receives a message with the CMSRedelivered field set, it
* is likely, but not guaranteed, that this message was delivered
* earlier but that its receipt was not acknowledged at that time.
*
* @return true if this message is being redelivered
*
* @throws CMSException - if an internal error occurs.
*/
virtual bool getCMSRedelivered() const = 0;
/**
* Specifies whether this message is being redelivered.
*
* This field is set at the time the message is delivered. This method
* can be used to change the value for a message that has been received.
*
* @param redelivered
* boolean redelivered value
*
* @throws CMSException - if an internal error occurs.
*/
virtual void setCMSRedelivered(bool redelivered) = 0;
/**
* Gets the Destination object to which a reply to this message should
* be sent.
*
* @return Destination to which to send a response to this message
*
* @throws CMSException - if an internal error occurs.
*/
virtual const cms::Destination* getCMSReplyTo() const = 0;
/**
* Sets the Destination object to which a reply to this message should
* be sent.
*
* The CMSReplyTo header field contains the destination where a reply
* to the current message should be sent. If it is null, no reply is
* expected. The destination may be either a Queue object or a Topic
* object.
*
* Messages sent with a null CMSReplyTo value may be a notification of
* some event, or they may just be some data the sender thinks is of
* interest.
*
* Messages with a CMSReplyTo value typically expect a response. A
* response is optional; it is up to the client to decide. These
* messages are called requests. A message sent in response to a
* request is called a reply.
*
* In some cases a client may wish to match a request it sent earlier
* with a reply it has just received. The client can use the
* CMSCorrelationID header field for this purpose.
*
* @param destination
* Destination to which to send a response to this message
*
* @throws CMSException - if an internal error occurs.
*/
virtual void setCMSReplyTo(const cms::Destination* destination) = 0;
/**
* Gets the message timestamp.
*
* The CMSTimestamp header field contains the time a message was handed
* off to a provider to be sent. It is not the time the message was
* actually transmitted, because the actual send may occur later due to
* transactions or other client-side queuing of messages.
*
* When a message is sent, CMSTimestamp is ignored. When the send or
* publish method returns, it contains a time value somewhere in the
* interval between the call and the return. The value is in the format
* of a normal millis time value in the Java programming language.
*
* Since timestamps take some effort to create and increase a message's
* size, some CMS providers may be able to optimize message overhead if
* they are given a hint that the timestamp is not used by an
* application. By calling the MessageProducer.setDisableMessageTimestamp
* method, a CMS client enables this potential optimization for all
* messages sent by that message producer. If the CMS provider accepts
* this hint, these messages must have the timestamp set to zero; if the
* provider ignores the hint, the timestamp must be set to its normal
* value.
*
* @return the message timestamp
*
* @throws CMSException - if an internal error occurs.
*/
virtual long long getCMSTimestamp() const = 0;
/**
* Sets the message timestamp.
*
* CMS providers set this field when a message is sent. This method can
* be used to change the value for a message that has been received.
*
* @param timeStamp
* integer time stamp value
*
* @throws CMSException - if an internal error occurs.
*/
virtual void setCMSTimestamp(long long timeStamp) = 0;
/**
* Gets the message type identifier supplied by the client when the
* message was sent.
*
* @return the message type
* @see setCMSType
*
* @throws CMSException - if an internal error occurs.
*/
virtual std::string getCMSType() const = 0;
/**
* Sets the message type.
*
* Some CMS providers use a message repository that contains the
* definitions of messages sent by applications. The CMSType header
* field may reference a message's definition in the provider's
* repository.
*
* The CMS API does not define a standard message definition repository,
* nor does it define a naming policy for the definitions it contains.
*
* Some messaging systems require that a message type definition for
* each application message be created and that each message specify its
* type. In order to work with such CMS providers, CMS clients should
* assign a value to CMSType, whether the application makes use of it or
* not. This ensures that the field is properly set for those providers
* that require it.
*
* To ensure portability, CMS clients should use symbolic values for
* CMSType that can be configured at installation time to the values
* defined in the current provider's message repository. If string
* literals are used, they may not be valid type names for some CMS
* providers.
*
* @param type
* the message type
* @see getCMSType
*
* @throws CMSException - if an internal error occurs.
*/
virtual void setCMSType(const std::string& type) = 0;
};
}
#endif /*_CMS_MESSAGE_H_*/