blob: 58205bdcbc903957f6f42ee8c178674ec0076d1f [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.
#++
module Qpid
module Messaging
# A +Message+ represents an routable piece of information.
class Message
# Creates a +Message+.
#
# ==== Options
#
# * +:content+ - the content
#
# ==== Examples
#
# # create a simple message and sends it
# message = Qpid::Messaging::Message.new :content => "This is a message."
# sender.send message
#
def initialize(args = {})
@message_impl = (args[:impl] if args[:impl]) || nil
@message_impl = Cqpid::Message.new if @message_impl.nil?
args = {} if args.nil?
self.content_object = args[:content] if args[:content]
end
def message_impl # :nodoc:
@message_impl
end
# Sets the reply-to address.
#
# The address can either be an instance of Address or else and
# address string.
#
# ==== Options
#
# * +address+ - the address
#
# ==== Examples
#
# # set replies using an Address
# msg.reply_to = Qpid:Messaging::Address.new "my-responses"
# # set replies using an address string
# msg.reply_to = "my-feed/responses"
#
def reply_to=(address)
address = Qpid::Messaging::Address.new "#{address}" if !address.is_a? Qpid::Messaging::Address
@message_impl.setReplyTo address.address_impl
end
# Returns the reply to address for the +Message+.
def reply_to
address_impl = @message_impl.getReplyTo
# only return an address if a reply to was specified
Qpid::Messaging::Address.new(nil, address_impl) if address_impl
end
# Sets the subject for the +Message+.
#
# ==== Options
#
# * +subject+ - the subject
def subject=(subject); @message_impl.setSubject subject; end
# Returns the subject of the +Message+.
def subject; @message_impl.getSubject; end
# Sets the content type for the +Message+.
#
# This should be set by the sending application and indicates to the
# recipients of the message how to interpret or decode the content.
#
# By default, only dictionaries and maps are automatically given a content
# type. If this content type is replaced then retrieving the content will
# not behave correctly.
#
# ==== Options
#
# * +content_type+ - the content type
#
# ==== Examples
#
# # send base64 encoded data in a mesage
# msg = Qpid::Messaging::Message.new :content = "UXBpZCBSdWxlcyEK"
# msg.content_type = "application/base64"
#
def content_type=(content_type); @message_impl.setContentType content_type; end
# Returns the content type for the +Message+.
def content_type; @message_impl.getContentType; end
# Sets the message id.
#
# *NOTE:* this field must be a UUID type currently. A non-UUID value will
# be converted to a zero UUID, though a blank ID will be left untouched.
#
# ==== Options
#
# * +id+ - the id
#
# ==== Examples
#
# # this example only works in Ruby >= 1.9, for 1.8 use a UUID library
# require 'SecureRandom'
# msg.message_id = SecureRandom.uuid
#
def message_id=(message_id); @message_impl.setMessageId message_id.to_s; end
# Returns the message id.
def message_id; @message_impl.getMessageId; end
# Sets the user id for the +Message+.
#
# This should in general be the user-id which was used when authenticating
# the connection itself, as the messaging infrastructure will verify
# this.
#
# See Qpid::Messaging::Connection.authenticated_username
#
# *NOTE:* If the id is not a +String+ then the id is set using
# the object's string representation.
#
# ==== Options
#
# * +id+ - the id
#
def user_id=(user_id); @message_impl.setUserId user_id; end
# Returns the user id for the +Message+.
def user_id; @message_impl.getUserId; end
# Sets the correlation id of the +Message+.
#
# The correlation id can be used as part of a protocol for message
# exchange patterns; e.g., a request-response pattern might require
# the correlation id of the request and the response to match, or it
# might use the message id of the request as the correlation id on
# the response.
#
# *NOTE:* If the id is not a +String+ then the id is setup using
# the object's string representation.
#
# ==== Options
#
# * +id+ - the id
#
def correlation_id=(correlation_id); @message_impl.setCorrelationId correlation_id; end
# Returns the correlation id of the +Message+.
def correlation_id; @message_impl.getCorrelationId; end
# Sets the priority of the +Message+.
#
# This may be used by the messaging infrastructure to prioritize
# delivery of messages with higher priority.
#
# *NOTE:* If the priority is not an integer type then it is set using
# the object's integer representation. If the integer value is greater
# than 8-bits then only the first 8-bits are used.
#
# ==== Options
#
# * +priority+ - the priority
#
def priority=(priority); @message_impl.setPriority priority; end
# Returns the priority for the +Message+.
def priority; @message_impl.getPriority; end
# Sets the time-to-live in milliseconds.
#
# This can be used by the messaging infrastructure to discard messages
# that are no longer of relevance.
#
# ==== Options
#
# * +duration+ - the number of milliseconds
#
def ttl=(duration)
if duration.is_a? Qpid::Messaging::Duration
@message_impl.setTtl duration.duration_impl
else
@message_impl.setTtl Cqpid::Duration.new duration.to_i
end
end
# Returns the time-to-live in milliseconds.
def ttl; Qpid::Messaging::Duration.new @message_impl.getTtl.getMilliseconds; end
# Sets the durability of the +Message+.
#
# This is a hint to the messaging infrastructure that the message
# should be persisted or otherwise stored. This helps to ensure
# that the message is not lost due to failures or a shutdown.
#
# ==== Options
#
# * +durable+ - the durability flag (def. false)
#
def durable=(durable); @message_impl.setDurable durable; end
# Returns the durability for the +Message+.
def durable; @message_impl.getDurable; end
# This is a hint to the messaging infrastructure that if de-duplication
# is required, that this message should be examined to determine if it
# is a duplicate.
#
# ==== Options
#
# * +redelivered+ - sets the redelivered state (def. false)
#
# ==== Examples
#
# # processed is a collection of messages already received
# msg.redelivered = true if processed.include? msg.message_id
#
def redelivered=(redelivered); @message_impl.setRedelivered redelivered; end
# Returns whether the +Message+ has been marked as redelivered.
def redelivered; @message_impl.getRedelivered; end
# Returns all named properties.
#
# *NOTE:* It is recommended to use the []= method for
# retrieving and setting properties. Using this method may
# result in non-deterministic behavior.
def properties; @message_impl.getProperties; end
# Returns the value for the named property.
#
# ==== Options
#
# * +name+ - the property name
#
# ==== Examples
#
# # use of message properties to mark a message as digitally signed
# verify(msg) if msg[:signed]
#
def [](key); self.properties[key.to_s]; end
# Assigns a value to the named property.
#
# A property's name or value, if a symbol, will be converted to a string
# representation. However, you will still be able to access them using
# a symbol for the name.
#
# ==== Options
#
# * +name+ - the property name
# * +value+ - the property value
#
# ==== Examples
#
# # set the signed attribute on a message and then retrieve it
# msg[:signed] = true # sets "signed" => true
# puts "It's signed" if msg["signed"] # outputs "It's signed"
#
def []=(key, value)
@message_impl.setProperty(key.to_s,
Qpid::Messaging.stringify(value))
end
# Sets the content for the +Message+.
#
# Content is automatically encoded for Array and Hash types. Other types
# need to set their own content types (via content_type) in order to
# specify how recipients should process the content.
#
# ==== Options
#
# * +content+ - the content
#
# ==== Examples
#
# # set a simple content for a message
# msg.content = "This is a simple message."
# # sets content that is automatically encoded
# msg.content = {:foo => :bar}
#
def content=(content)
content_type = nil
@content = Qpid::Messaging.stringify(content)
case @content
when Hash
content_type = "amqp/map"
when Array
content_type = "amqp/list"
end
if content_type.nil?
@message_impl.setContent @content
else
Qpid::Messaging.encode @content, self, content_type
end
end
# Returns the content of the +Message+.
#
# Content is automatically decoded based on the specified content type.
# If the content type is application-specific, then no decoding is
# performed and the content is returnedas a +String+ representation.
#
# For example, if an array of integers are sent, then the receiver will
# find the message content to be an array of String objects, where each
# String is a representation of the sent integer value.
#
def content
if @content.nil?
@content = @message_impl.getContent
# decode the content is necessary if it
# has an encoded content type
if ["amqp/list", "amqp/map"].include? @message_impl.getContentType
@content = Qpid::Messaging.decode(self,
@message_impl.getContentType)
end
end
@content
end
# Returns the content's size in bytes.
def content_size; @message_impl.getContentSize; end
# Sets the message content.
#
# ==== Options
#
# * +content+ - the content
#
# ==== Examples
#
# # set a simple content for a message
# msg.content_object = "This is a simple message."
# # sets content that is automatically encoded
# msg.content_object = {:foo => :bar}
#
def content_object=(content)
@message_impl.setContentObject(Qpid::Messaging.stringify(content))
end
# Returns the content of the +Message+.
#
def content_object
@message_impl.getContentObject()
end
end
end
end