blob: 6d637a1665db9212a6e0f11220c1a16476c5f578 [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 +Connection+ represents a network connection to a remote endpoint.
class Connection
attr_reader :options # :nodoc:
# Creates a connection object. Raises a MessagingError if an invalid
# connection option is used.
#
# == Options
#
# * +:url+ - the URL for the broker
# * +:options+ - connection options
#
# == Controlling Reconnect Behavior
#
# The following connection options can be used to configure
# the reconnection behavior for this connection.
#
# * +:username+ - the authentication username
# * +:password+ - the authentication password
# * +:heartbeat+
# * +:tcp_nodelay+
# * +:sasl_mechanism+
# * +:sasl_service+
# * +:sasl_min_ssf+
# * +:sasl_max_ssf+
# * +:transport+
# * +:reconnect+ - indicates whether to attempt reconnections
# * +:reconnect_timeout+ - the number of seconds to attempt reconnecting
# * +:reconnect_limit+ - the number of retries before reporting failure
# * +:reconnect_interval_min+ - initial delay, in seconds, before attempting a reconnection
# * +:reconnect_interval_max+ - number of seconds to wait before additional reconnect attempts
# * +:reconnect_interval+ - shorthand for setting both min and max values
# * +:reconnect_urls+ - a list of alternate URLs to use for reconnection attempts
#
# == Examples
#
# # creates a connection to the broker running local *localhost*
# conn = Qpid::Messaging::Connnection.new
# # creates a connection to *broker1.domain.com* on port *5672*
# conn = Qpid::Messaging::Connection.new :url => "amqp:tcp:broker1.domain.com:5672"
# # creates a connection to localhost with the specified authentication credentials
# conn = Qpid::Messaging::Connection.new :options => {:username => "login", :password => "password"}
#
def initialize(opts = {})
@url = opts[:url] || "localhost"
@options = Qpid::Messaging.stringify(opts[:options] || {})
@connection_impl = opts[:impl] || Cqpid::Connection.new(@url, @options)
end
def connection_impl # :nodoc:
@connection_impl
end
# Establishes the connection.
#
# == Examples
#
# # open a connection if it's not already open
# conn.open unless conn.open?
#
def open
@connection_impl.open
end
# Reports whether the connection is open.
#
# == Examples
#
# # close the connection if it's not already closed
# conn.close if conn.open?
#
def open?; true && !@connection_impl.nil? && @connection_impl.isOpen; end
# Closes the connection.
#
# == Examples
#
# # close a connection
# conn.close
#
def close; @connection_impl.close; end
# Creates a new session.
#
# == Arguments
#
# * +:name+ - specifies the name for this session
# * +:transactional+ - if +true+ then a creates a transaction session (def. +false+)
#
# == Examples
#
# # create a session named 'session1'
# session = conn.create_session :name => "session1"
# # create a transactional session
# session = conn.create_session :transaction => true
#
def create_session(args = {})
name = args[:name] || ""
if open?
if args[:transactional]
session = @connection_impl.createTransactionalSession name
else
session = @connection_impl.createSession name
end
return Session.new(self, session)
else
raise RuntimeError.new "No connection available."
end
end
# Returns a Session with the given name. Raises an exception if no
# session with the given name exists.
#
# == Options
#
# * +name+ - the existing session's name
#
# == Examples
#
# # retrieve a session named 'mysession' from the current connection
# name = "my-session"
# # if no such session exists then catchh the exception raised
# begin
# session = conn.session name
# rescue MessagingException => error
# puts "No such session: #{name}."
# end
#
def session name
session_impl = @connection_impl.getSession name
Qpid::Messaging::Session.new self, session_impl if session_impl
end
# Returns the username used to authenticate with the connection.
#
# If the connection did not user authentication credentials, then the
# username returned is "anonymous".
#
# == Examples
#
# # create a new connection for user "qpiduser"
# conn = Qpid::Messaging::Connection.new :username => "qpiduser"
# conn.open
# # displays the authenticate username
# puts "Connected as #{conn.authenticated_username}" # should say 'qpiduser'
#
def authenticated_username; @connection_impl.getAuthenticatedUsername if open?; end
private
def convert_options(options)
result = {}
unless options.nil? || options.empty?
options.each_pair {|key, value| result[key.to_s] = value.to_s}
end
return result
end
end
end
end