1 // ANNA - Anna is Not Nothingness Anymore //
3 // (c) Copyright 2005-2015 Eduardo Ramos Testillano & Francisco Ruiz Rayo //
5 // See project site at http://redmine.teslayout.com/projects/anna-suite //
6 // See accompanying file LICENSE or copy at http://www.teslayout.com/projects/public/anna.LICENSE //
9 #ifndef anna_comm_Delivery_hpp
10 #define anna_comm_Delivery_hpp
14 #include <anna/core/mt/Mutex.hpp>
15 #include <anna/config/defines.hpp>
29 Clase que modela un algoritmo de reparto de carga.
31 class Delivery : public Mutex {
33 typedef std::vector <Resource*> Resources;
34 typedef Resources::iterator iterator;
35 typedef Resources::const_iterator const_iterator;
38 * Establece el periodo de comprobacion de recuperacion de los
39 * recursos en los que se han detectado problemas internos.
41 static const Millisecond DefaultRecoveryTime;
46 virtual ~Delivery() { a_resources.clear(); }
49 Devuelve el nombre del reparto. Coincide con el indicado en el constructor.
50 \return el nombre del reparto. Coincide con el indicado en el constructor.
52 const std::string& getName() const throw() { return a_name; }
55 Inicializa el reparto de recursos.
57 void initialize() throw(RuntimeException);
60 Devuelve el estado anterior que tenia esta instancia. El resultado de #isAvailable
61 puede ser distinto a este metodo ya que a diferencia de este se basa en el estado
62 actual de los procesos asociados a este servicio, mientras que este metodo devuelve
63 el estado en el que estaban la ultima vez que se hizo una comprobacion.
65 bool wasAvailable() const throw() { return a_isAvailable; }
68 * Obtiene el periodo de comprobacion de recuperacion de los recusos que han sido
69 * desactivados debido a que se han detectado problemas internos.
71 * \return El periodo de comprobacion de recuperacion
73 const Millisecond &getRecoveryTime() const throw() { return a_recoveryTime; }
76 * Establece el periodo de comprobacion de recuperacion de los recusos que han sido
77 * desactivados debido a que se han detectado problemas internos.
79 * \param recoveryTime Periodo de comprobacion de recuperacion.
81 void setRecoveryTime(const Millisecond &recoveryTime) throw() { a_recoveryTime = recoveryTime; }
84 Comprueba la lista de recursos remotos para comprobar si hay alguno que este disponible
85 (ver Resource::isAvailable) y no este deshabilitado (ver Resource::disable).
87 \return \em true si tiene algun recurso remoto utilizado o \em false en otro caso.
89 virtual bool isAvailable() const throw();
92 Devuelve la instancia del recurso remoto que debemos usar en esta ocasion.
93 @return La instancia del recurso remoto que debemos usar en esta ocasion.
94 \warning Antes de invocar a este método la instancia se debe proteger de accesos concurrentes
96 Resource* apply() throw(RuntimeException);
99 Este metodo sirve a nuestra aplicacion para notificar que el recurso ha dejado de
101 \param resource Recurso remoto en el que hemos detectado el error.
102 \return \em true si ninguno de los recursos asociados a este reparto de carga estan disponibles o \em false en otro caso.
103 \warning Antes de invocar a este método la instancia se debe proteger de accesos concurrentes
105 bool fault(const Resource* resource) throw();
108 Este metodo sirve a nuestra aplicacion para que el recurso vuelve a estar disponible.
109 \param resource Recurso remoto que hemos recuperado.
110 \return \em true si alguno de los recursos asociados a este reparto de carga pasa a estar disponible o \em false en otro caso.
111 \warning Antes de invocar a este método la instancia se debe proteger de accesos concurrentes
113 bool recover(const Resource* resource) throw();
116 Indica si reparto contiene la referencia a un determinado recurso.
117 \return \em true si contiene la referencia al recurso recibido como parametro o \em false
120 bool contains(const Resource* resource) const throw();
123 Devuelve un iterador al comienzo de la lista de recursos remotos asociados a este reparto.
124 \return Un iterador al comienzo de la lista de recursos remotos asociados a este reparto.
126 iterator begin() throw() { return a_resources.begin(); }
129 Devuelve un iterador al comienzo de la lista de recursos remotos asociados a este reparto.
130 \return Un iterador al comienzo de la lista de recursos remotos asociados a este reparto.
132 const_iterator begin() const throw() { return a_resources.begin(); }
135 Devuelve un iterador al final de la lista de recursos remotos asociados a este reparto.
136 \return Un iterador al final de la lista de recursos remotos asociados a este reparto.
138 iterator end() throw() { return a_resources.end(); }
141 Devuelve el numero de recursos asociados a la lista.
142 \return El numero de recursos asociados a la lista.
144 int size() const throw() { return a_resources.size(); }
147 Devuelve un iterador al final de la lista de recursos remotos asociados a este reparto.
148 \return Un iterador al final de la lista de recursos remotos asociados a este reparto.
150 const_iterator end() const throw() { return a_resources.end(); }
153 Devuelve una cadena con la informacion referente a este objeto.
154 @return Una cadena con la informacion referente a este objeto.
156 virtual std::string asString() const throw();
159 Devuelve un nodo XML con la informacion referente a este objeto.
160 \param parent Nodo XML a partir del cual introducir la informacion.
161 \return Un nodo XML con la informacion referente a este objeto.
163 virtual xml::Node* asXML(xml::Node* parent) const throw();
166 Devuelve el recurso remoto apuntado por el iterador recibido como parametro.
167 \param ii Iterador usado para recorrer los recursos asociados a este reparto.
168 \return El recurso remoto apuntado por el iterador recibido como parametro.
170 static Resource* resource(iterator& ii) throw() { return *ii; }
173 Devuelve el recurso remoto apuntado por el iterador recibido como parametro.
174 \param ii Iterador usado para recorrer los recursos asociados a este reparto.
175 \return El recurso remoto apuntado por el iterador recibido como parametro.
177 static const Resource* resource(const_iterator& ii) throw() { return *ii; }
182 @param name Nombre logico de este reparto.
184 Delivery(const char* name) :
187 a_recoveryTime(DefaultRecoveryTime),
191 Conecta el recurso remoto recibido como parametro con este reparto.
192 @param resource Instancia del recurso que vamos a registrar en este reparto.
194 void add(Resource* resource) throw(RuntimeException);
197 Inicializa el reparto de recursos.
199 virtual void do_initialize() throw(RuntimeException) = 0;
202 Devuelve la instancia del recurso remoto que debemos que debemos usar en esta ocasion.
203 @return La instancia del recurso remoto que debemos usar en esta ocasion.
205 virtual Resource* do_apply() throw(RuntimeException) = 0;
208 Este metodo sirve a nuestra aplicacion para indicar que no fue posible usar el
209 recurso obtenido mediante #apply.
210 \param resource Recurso remoto que ha ocasionado el error.
211 \return \em true si ninguno de los recursos asociados a este reparto de carga estan disponibles o \em false en otro caso.
213 virtual bool do_fault(const Resource* resource) throw();
216 Este metodo sirve a nuestra aplicacion para indicar que ha recuperado la conexion
218 \param resource Recurso remoto con el que ha recuperado la conexion.
220 virtual bool do_recover(const Resource* resource) throw();
223 Este metodo sirve a nuestra aplicacion para indicar que ha recuperado la conexion
225 \param resource Recurso remoto con el que ha recuperado la conexion.
227 virtual bool do_contains(const Resource* resource) const throw();
231 Resources a_resources;
233 Millisecond a_timeStamp;
234 Millisecond a_recoveryTime;
236 bool unsafe_recover(const Resource* resource) throw();
238 static bool internalErrorDetected(const Resource* resource) throw();