blob: 866889c6ba3dd576d68174c52431330afc645549 [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 <activemq/util/Properties.h>
#include <cms/Destination.h>
#include <cms/CMSException.h>
#include <cms/DeliveryMode.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.
*
* @see JMS API
*/
class Message
{
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 acknowledgement 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.
*/
virtual void acknowledge() const throw( CMSException ) = 0;
/**
* Clears out the body of the message. This does not clear the
* headers or properties.
*/
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.
*/
virtual void clearProperties() = 0;
/**
* Retrieves the propery names.
* @return The complete set of property names currently in this
* message.
*/
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.
*/
virtual bool propertyExists( 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.
*/
virtual bool getBooleanProperty( const std::string& name ) const
throw( CMSException ) = 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.
*/
virtual unsigned char getByteProperty( const std::string& name ) const
throw( CMSException ) = 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.
*/
virtual double getDoubleProperty( const std::string& name ) const
throw( CMSException ) = 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.
*/
virtual float getFloatProperty( const std::string& name ) const
throw( CMSException ) = 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.
*/
virtual int getIntProperty( const std::string& name ) const
throw( CMSException ) = 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.
*/
virtual long long getLongProperty( const std::string& name ) const
throw( CMSException ) = 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.
*/
virtual short getShortProperty( const std::string& name ) const
throw( CMSException ) = 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.
*/
virtual std::string getStringProperty( const std::string& name ) const
throw( CMSException ) = 0;
/**
* Sets a boolean property.
* @param name The name of the property to retrieve.
* @param value The value for the named property.
* @throws CMSException
*/
virtual void setBooleanProperty( const std::string& name,
bool value ) throw( CMSException ) = 0;
/**
* Sets a byte property.
* @param name The name of the property to retrieve.
* @param value The value for the named property.
* @throws CMSException
*/
virtual void setByteProperty( const std::string& name,
unsigned char value ) throw( CMSException ) = 0;
/**
* Sets a double property.
* @param name The name of the property to retrieve.
* @param value The value for the named property.
* @throws CMSException
*/
virtual void setDoubleProperty( const std::string& name,
double value ) throw( CMSException ) = 0;
/**
* Sets a float property.
* @param name The name of the property to retrieve.
* @param value The value for the named property.
* @throws CMSException
*/
virtual void setFloatProperty( const std::string& name,
float value ) throw( CMSException ) = 0;
/**
* Sets a int property.
* @param name The name of the property to retrieve.
* @param value The value for the named property.
* @throws CMSException
*/
virtual void setIntProperty( const std::string& name,
int value ) throw( CMSException ) = 0;
/**
* Sets a long property.
* @param name The name of the property to retrieve.
* @param value The value for the named property.
* @throws CMSException
*/
virtual void setLongProperty( const std::string& name,
long long value ) throw( CMSException ) = 0;
/**
* Sets a short property.
* @param name The name of the property to retrieve.
* @param value The value for the named property.
* @throws CMSException
*/
virtual void setShortProperty( const std::string& name,
short value ) throw( CMSException ) = 0;
/**
* Sets a string property.
* @param name The name of the property to retrieve.
* @param value The value for the named property.
* @throws CMSException
*/
virtual void setStringProperty( const std::string& name,
const std::string& value ) throw( CMSException ) = 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
*/
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.
*/
virtual void setCMSCorrelationID( const std::string& correlationId ) = 0;
/**
* Gets the DeliveryMode for this message
* @return DeliveryMode enumerated value.
*/
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.
*/
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
*/
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
*/
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
*/
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
*/
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
*/
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 vaue for a message that has been received.
*
* @param id - the ID of the message
*/
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
*/
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
*/
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
*/
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
*/
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
*/
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
*/
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 queueing 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
*/
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
*/
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
*/
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
*/
virtual void setCMSType( const std::string& type ) = 0;
};
}
#endif /*_CMS_MESSAGE_H_*/