ANNA Suite  2020b
Multipurpose development suite for Telco applications
Classes | Public Types | Public Member Functions | Static Public Member Functions | Protected Member Functions | Static Protected Member Functions | List of all members
anna::comm::ByRangeDelivery< TKey, TDelivery, TSerializer > Class Template Reference

#include <ByRangeDelivery.hpp>

Inheritance diagram for anna::comm::ByRangeDelivery< TKey, TDelivery, TSerializer >:
Inheritance graph
[legend]
Collaboration diagram for anna::comm::ByRangeDelivery< TKey, TDelivery, TSerializer >:
Collaboration graph
[legend]

Classes

struct  Range
 

Public Types

typedef std::vector< Range * > range_container
 
typedef range_container::iterator range_iterator
 
typedef range_container::const_iterator const_range_iterator
 
- Public Types inherited from anna::comm::Delivery
typedef std::vector< Resource * > Resources
 
typedef Resources::iterator iterator
 
typedef Resources::const_iterator const_iterator
 

Public Member Functions

 ByRangeDelivery (const char *name, const bool isCritical)
 
virtual ~ByRangeDelivery ()
 
range_iterator createRange (const TKey &bottom, const TKey &top) noexcept(false)
 
void attach (range_iterator &ii, Server *server) noexcept(false)
 
void prepare (const TKey &key) noexcept(false)
 
std::string asString () const
 
xml::NodeasXML (xml::Node *parent) const
 
- Public Member Functions inherited from anna::comm::Service
 Service (const char *name, const bool isCritical)
 
bool isCritical () const
 
void attach (Server *server) noexcept(false)
 
comm::Serversend (Message &message) noexcept(false)
 
comm::Serversend (Message *message) noexcept(false)
 
int broadcast (Message &message)
 
int broadcast (Message *message)
 
std::string asString () const
 
xml::NodeasXML (xml::Node *parent) const
 
- Public Member Functions inherited from anna::comm::Delivery
virtual ~Delivery ()
 
const std::string & getName () const
 
void initialize () noexcept(false)
 
bool wasAvailable () const
 
const MillisecondgetRecoveryTime () const
 
void setRecoveryTime (const Millisecond &recoveryTime)
 
virtual bool isAvailable () const
 
Resourceapply () noexcept(false)
 
bool fault (const Resource *resource)
 
bool recover (const Resource *resource)
 
bool contains (const Resource *resource) const
 
iterator begin ()
 
const_iterator begin () const
 
iterator end ()
 
int size () const
 
const_iterator end () const
 
- Public Member Functions inherited from anna::Mutex
 Mutex (const Mode::_v mode=Mode::Recursive)
 
virtual ~Mutex ()
 
virtual void lock () noexcept(false)
 
virtual void unlock ()
 
bool trylock () noexcept(false)
 
 operator const pthread_mutex_t * () const
 

Static Public Member Functions

static const char * className ()
 
- Static Public Member Functions inherited from anna::comm::Service
static Serverserver (iterator &ii)
 
static const Serverserver (const_iterator &ii)
 
- Static Public Member Functions inherited from anna::comm::Delivery
static Resourceresource (iterator &ii)
 
static const Resourceresource (const_iterator &ii)
 

Protected Member Functions

range_iterator range_begin ()
 
range_iterator range_end ()
 
const_range_iterator range_begin () const
 
const_range_iterator range_end () const
 
virtual void do_initialize () noexcept(false)
 
- Protected Member Functions inherited from anna::comm::Delivery
 Delivery (const char *name)
 
void add (Resource *resource) noexcept(false)
 
virtual bool do_contains (const Resource *resource) const
 
- Protected Member Functions inherited from anna::Safe
 Safe ()
 

Static Protected Member Functions

static Rangerange (range_iterator &ii)
 
static const Rangerange (const_range_iterator &ii)
 

Additional Inherited Members

- Static Public Attributes inherited from anna::comm::Delivery
static const Millisecond DefaultRecoveryTime
 

Detailed Description

template<typename TKey, typename TDelivery = RoundRobinDelivery, typename TSerializer = anna::functions>
class anna::comm::ByRangeDelivery< TKey, TDelivery, TSerializer >

Servicio de reparto de carga permite selecionar el servidor al que enviar la peticion en base al valor de una clave previamente indicada.

A diferencia de los comm::Service habituales la asociacion entre el servicio y el proceso no debe hacerse mediante comm::Service::attach, sino mediante comm::ByRangeDelivery::attach.

Parameters
TKeyTipo de clave usada para indexar los servicios de reparto.
TDeliveryTipo de reparto usado en cada rango.
TSerializerClase que es capaz de convertir la TKey en una cadena. Debe implementar un metodo asString que recibe una instancia de TKey y devuelva una cadena.

La clase Delivery debe implementar los mismos metodos que un comm::Service.

Member Typedef Documentation

◆ const_range_iterator

template<typename TKey , typename TDelivery = RoundRobinDelivery, typename TSerializer = anna::functions>
typedef range_container::const_iterator anna::comm::ByRangeDelivery< TKey, TDelivery, TSerializer >::const_range_iterator

◆ range_container

template<typename TKey , typename TDelivery = RoundRobinDelivery, typename TSerializer = anna::functions>
typedef std::vector<Range*> anna::comm::ByRangeDelivery< TKey, TDelivery, TSerializer >::range_container

◆ range_iterator

template<typename TKey , typename TDelivery = RoundRobinDelivery, typename TSerializer = anna::functions>
typedef range_container::iterator anna::comm::ByRangeDelivery< TKey, TDelivery, TSerializer >::range_iterator

Constructor & Destructor Documentation

◆ ByRangeDelivery()

template<typename TKey , typename TDelivery = RoundRobinDelivery, typename TSerializer = anna::functions>
anna::comm::ByRangeDelivery< TKey, TDelivery, TSerializer >::ByRangeDelivery ( const char *  name,
const bool  isCritical 
)
inline

Constructor.

Parameters
nameNombre logico del servicio de reparto de carga.
isCriticalIndica las caracteristicas del reparto de carga. Debe valor true si el reparto de carga a crear es critico o false en otro caso.
90  :
91  comm::Service(name, isCritical),
92  a_currentRange(NULL)
93  {;}
bool isCritical() const
Definition: Service.hpp:45

◆ ~ByRangeDelivery()

template<typename TKey , typename TDelivery = RoundRobinDelivery, typename TSerializer = anna::functions>
virtual anna::comm::ByRangeDelivery< TKey, TDelivery, TSerializer >::~ByRangeDelivery ( )
inlinevirtual

Destructor.

98  {
99  for(range_iterator ii = range_begin(), maxii = range_end(); ii != maxii; ii ++)
100  delete range(ii)->delivery;
101 
102  a_ranges.clear();
103  }
TDelivery * delivery
Definition: ByRangeDelivery.hpp:47
static Range * range(range_iterator &ii)
Definition: ByRangeDelivery.hpp:225
range_iterator range_end()
Definition: ByRangeDelivery.hpp:220
range_iterator range_begin()
Definition: ByRangeDelivery.hpp:219
range_container::iterator range_iterator
Definition: ByRangeDelivery.hpp:81

Member Function Documentation

◆ asString()

template<typename TKey , typename TDelivery = RoundRobinDelivery, typename TSerializer = anna::functions>
std::string anna::comm::ByRangeDelivery< TKey, TDelivery, TSerializer >::asString ( ) const
inlinevirtual

Devuelve una cadena con la informacion referente a este objeto.

Returns
Una cadena con la informacion referente a este objeto.

Reimplemented from anna::comm::Delivery.

185  {
186  std::string result = className();
187  result += " { ";
188  result += comm::Delivery::asString();
189  result += " | Ranges: ";
190 
191  for(const_range_iterator ii = range_begin(), maxii = range_end(); ii != maxii; ii ++) {
192  result += "\n\t";
193  result += range(ii)->asString();
194  }
195 
196  return result += "}";
197  }
virtual std::string asString() const
static const char * className()
Definition: ByRangeDelivery.hpp:216
static Range * range(range_iterator &ii)
Definition: ByRangeDelivery.hpp:225
range_iterator range_end()
Definition: ByRangeDelivery.hpp:220
range_container::const_iterator const_range_iterator
Definition: ByRangeDelivery.hpp:82
range_iterator range_begin()
Definition: ByRangeDelivery.hpp:219
std::string asString() const
Definition: ByRangeDelivery.hpp:60
Here is the call graph for this function:

◆ asXML()

template<typename TKey , typename TDelivery = RoundRobinDelivery, typename TSerializer = anna::functions>
xml::Node* anna::comm::ByRangeDelivery< TKey, TDelivery, TSerializer >::asXML ( xml::Node parent) const
inlinevirtual

Devuelve un nodo XML con la informacion referente a este objeto.

Parameters
parentNodo XML a partir del cual introducir la informacion.
Returns
Un nodo XML con la informacion referente a este objeto.

Reimplemented from anna::comm::Delivery.

200  {
201  xml::Node* result = parent->createChild("anna.comm.ByRangeDelivery");
202  xml::Node* node = comm::Service::asXML(result);
203 
204  for(const_range_iterator ii = range_begin(), maxii = range_end(); ii != maxii; ii ++)
205  range(ii)->asXML(node);
206 
207  return result;
208  }
Node * createChild(const char *name)
static Range * range(range_iterator &ii)
Definition: ByRangeDelivery.hpp:225
range_iterator range_end()
Definition: ByRangeDelivery.hpp:220
range_container::const_iterator const_range_iterator
Definition: ByRangeDelivery.hpp:82
xml::Node * asXML(xml::Node *parent) const
xml::Node Node
Definition: Node.hpp:21
xml::Node * asXML(xml::Node *parent) const
Definition: ByRangeDelivery.hpp:70
range_iterator range_begin()
Definition: ByRangeDelivery.hpp:219
Here is the call graph for this function:

◆ attach()

template<typename TKey , typename TDelivery = RoundRobinDelivery, typename TSerializer = anna::functions>
void anna::comm::ByRangeDelivery< TKey, TDelivery, TSerializer >::attach ( range_iterator ii,
Server server 
)
inlinenoexcept

Asocia el comm::Server recibido como parametro al rango representado por el iterador recibido.

Parameters
iiIterador de rango al que asociar el servicio. Debe ser resultado de invocar a createRange.
serverInstancia del comm::Server a incorporar dentro del rango.
153  {
154  range(ii)->delivery->attach(server);
156  }
TDelivery * delivery
Definition: ByRangeDelivery.hpp:47
static Server * server(iterator &ii)
static Range * range(range_iterator &ii)
Definition: ByRangeDelivery.hpp:225
void attach(Server *server) noexcept(false)
Here is the call graph for this function:

◆ className()

template<typename TKey , typename TDelivery = RoundRobinDelivery, typename TSerializer = anna::functions>
static const char* anna::comm::ByRangeDelivery< TKey, TDelivery, TSerializer >::className ( )
inlinestatic

Metodo que devuelve el nombre completo de este selector de recursos. Para evitar ambigüedades este nombre incluye la lista completa de namespaces a los que pertenece la clase.

Returns
Una cadena con el nombre de este selector.
216 { return "anna::comm::ByRangeDelivery"; }

◆ createRange()

template<typename TKey , typename TDelivery = RoundRobinDelivery, typename TSerializer = anna::functions>
range_iterator anna::comm::ByRangeDelivery< TKey, TDelivery, TSerializer >::createRange ( const TKey &  bottom,
const TKey &  top 
)
inlinenoexcept

Instancia un rango de reparto con los parametros definidos como parametros. Una vez que obtengamos el comm::Delivery asociado al rango creado debemos asociar tantos comm::Resource como sea necesario.

Parameters
bottomValor minimo del rango.
topValor maximo del rango.
Returns
La instancia del servicio de reparto asociado a este rango.
115  {
116  Range* result;
117 
118  if(bottom > top) {
119  std::string msg(asString());
120  msg += " | Bottom: ";
121  msg += TSerializer::asString(bottom);
122  msg += " | Invalid range (bottom > top)";
123  throw RuntimeException(msg, ANNA_FILE_LOCATION);
124  }
125 
126  if((result = find(bottom)) != NULL) {
127  std::string msg(asString());
128  msg += " | Bottom: ";
129  msg += TSerializer::asString(bottom);
130  msg += " | Overlapped with ";
131  msg += result->asString();
132  throw RuntimeException(msg, ANNA_FILE_LOCATION);
133  }
134 
135  if((result = find(top)) != NULL) {
136  std::string msg(asString());
137  msg += " | top: ";
138  msg += TSerializer::asString(top);
139  msg += " | Overlapped with ";
140  msg += result->asString();
141  throw RuntimeException(msg, ANNA_FILE_LOCATION);
142  }
143 
144  a_ranges.push_back(result = new Range(getName(), bottom, top));
145  return range_begin() + a_ranges.size() - 1;
146  }
const std::string & getName() const
Definition: Delivery.hpp:52
std::string asString() const
Definition: ByRangeDelivery.hpp:184
range_iterator range_begin()
Definition: ByRangeDelivery.hpp:219
#define ANNA_FILE_LOCATION
Definition: defines.hpp:23
Here is the call graph for this function:

◆ do_initialize()

template<typename TKey , typename TDelivery = RoundRobinDelivery, typename TSerializer = anna::functions>
virtual void anna::comm::ByRangeDelivery< TKey, TDelivery, TSerializer >::do_initialize ( )
inlineprotectedvirtualnoexcept

Inicializa el reparto de recursos.

Implements anna::comm::Delivery.

229  {
230  for(range_iterator ii = range_begin(), maxii = range_end(); ii != maxii; ii ++)
231  range(ii)->delivery->initialize();
232  }
TDelivery * delivery
Definition: ByRangeDelivery.hpp:47
static Range * range(range_iterator &ii)
Definition: ByRangeDelivery.hpp:225
range_iterator range_end()
Definition: ByRangeDelivery.hpp:220
range_iterator range_begin()
Definition: ByRangeDelivery.hpp:219
range_container::iterator range_iterator
Definition: ByRangeDelivery.hpp:81

◆ prepare()

template<typename TKey , typename TDelivery = RoundRobinDelivery, typename TSerializer = anna::functions>
void anna::comm::ByRangeDelivery< TKey, TDelivery, TSerializer >::prepare ( const TKey &  key)
inlinenoexcept

Establece la clave que se usara para decidir que pareja de maquinas usar para enviar el mensaje.

Parameters
keyClave usada para calcular el reparto.
Warning
Este metodo debe invocarse siempre antes de usar este servicio de reparto.
163  {
164  Range* w = find(key);
165 
166  if(w == NULL && Logger::isActive(Logger::Warning)) {
167  std::string msg(asString());
168  msg += " | TKey: ";
169  msg += TSerializer::asString(key);
170  msg += " | No range associated";
172  } else
173  a_currentRange = w;
174 
175  if(a_currentRange == NULL) {
176  std::string msg(asString());
177  msg += " | TKey: ";
178  msg += TSerializer::asString(key);
179  msg += " | No delivery service associated has been found";
180  throw RuntimeException(msg, ANNA_FILE_LOCATION);
181  }
182  }
std::string asString() const
Definition: ByRangeDelivery.hpp:184
static void warning(const std::string &text, const char *fromFile, const int fromLine)
Definition: Logger.hpp:338
Definition: Logger.hpp:41
#define ANNA_FILE_LOCATION
Definition: defines.hpp:23
static bool isActive(const Level level)
Definition: Logger.hpp:169
Here is the call graph for this function:

◆ range() [1/2]

template<typename TKey , typename TDelivery = RoundRobinDelivery, typename TSerializer = anna::functions>
static Range* anna::comm::ByRangeDelivery< TKey, TDelivery, TSerializer >::range ( range_iterator ii)
inlinestaticprotected
225 { return *ii; }

◆ range() [2/2]

template<typename TKey , typename TDelivery = RoundRobinDelivery, typename TSerializer = anna::functions>
static const Range* anna::comm::ByRangeDelivery< TKey, TDelivery, TSerializer >::range ( const_range_iterator ii)
inlinestaticprotected
226 { return *ii; }

◆ range_begin() [1/2]

template<typename TKey , typename TDelivery = RoundRobinDelivery, typename TSerializer = anna::functions>
range_iterator anna::comm::ByRangeDelivery< TKey, TDelivery, TSerializer >::range_begin ( )
inlineprotected
219 { return a_ranges.begin(); }

◆ range_begin() [2/2]

template<typename TKey , typename TDelivery = RoundRobinDelivery, typename TSerializer = anna::functions>
const_range_iterator anna::comm::ByRangeDelivery< TKey, TDelivery, TSerializer >::range_begin ( ) const
inlineprotected
222 { return a_ranges.begin(); }

◆ range_end() [1/2]

template<typename TKey , typename TDelivery = RoundRobinDelivery, typename TSerializer = anna::functions>
range_iterator anna::comm::ByRangeDelivery< TKey, TDelivery, TSerializer >::range_end ( )
inlineprotected
220 { return a_ranges.end(); }

◆ range_end() [2/2]

template<typename TKey , typename TDelivery = RoundRobinDelivery, typename TSerializer = anna::functions>
const_range_iterator anna::comm::ByRangeDelivery< TKey, TDelivery, TSerializer >::range_end ( ) const
inlineprotected
223 { return a_ranges.end(); }

The documentation for this class was generated from the following file: