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_Server_hpp
10 #define anna_comm_Server_hpp
15 #include <anna/config/defines.hpp>
17 #include <anna/comm/Resource.hpp>
28 class TransportFactory;
33 class ServerAllocator;
34 class ReceiverFactory;
37 Clase que modela los procesos servidores. Cada maquina (ver Host) contiene un numero indeterminado de
38 procesos servidores a los que puede enviar peticiones, bien directamente, o bien a traves del
39 sistema de reparto de carga.
41 Para facilitar el diseo de soluciones HA cada servidor puede tener un numero indeterminado por donde
42 recibe/envia peticiones, es por esto que cada servidor puede tener asociado un numero indeterminado
43 de instancias de la clase RemoteConnection.
45 La instanciacion de procesos servidores se hara mediante la invocacion al metodo Host::createServer.
47 \warning Este metodo no hace que nuestro proceso se convierta en un servidor, sino que conecta
48 nuestra aplicacion a un servidor remoto.
50 @see Host::createServer
53 class Server : public Resource {
55 typedef std::vector <Service*> Services;
56 typedef Services::iterator iterator;
57 typedef Services::const_iterator const_iterator;
65 Devuelve la instancia del Host indicada en el constructor.
66 \return la instancia del Host indicada en el constructor.
68 const Host* getHost() const throw() { return &a_host; }
71 Devuelve la instancia de ClientSocket asociada a este servidor. Puede ser NULL.
72 \return la instancia de ClientSocket asociada a este servidor.
74 const ClientSocket* getClientSocket() const throw() { return a_clientSocket; }
77 Devuelve el puerto remoto donde establece las conexiones este proceso servidor.
78 \return El puerto remoto donde establece las conexiones este proceso servidor.
80 int getRemotePort() const throw() { return a_remotePort; }
83 Devuelve el estado del indicador de recuperacin automatica. En caso de perder la conexin, por defecto,
84 siempre se intentara reconectar con el servidor.
85 \return El estado del indicador de recuperacin automatica.
87 bool autoRecovery() const throw() { return a_autoRecovery; }
90 Configura el estado del indicador de recuperacin automatica. En caso de perder la conexin, por defecto,
91 siempre se intentara reconectar con el servidor.
92 \param autoRecovery Indicador de recuperacin automatica.
94 void setAutoRecovery(bool autoRecovery = true) throw();
97 Devuelve el estado activo o inactivo de este proceso servidor. Un proceso servidor estara
98 activo si ha conseguido establecer el socket con el proceso remoto que representa por alguno
99 de los sockets cliente establecidos.
101 @return \em true si el proceso servidor esta preparado para enviar peticiones o \em false
104 bool isAvailable() const throw(RuntimeException);
107 Devuelve la factoria de transporte indicada en el constructor.
108 \return la factoria de transporte indicada en el constructor.
110 TransportFactory* getTransportFactory() throw() { return a_transportFactory; }
113 Devuelve el numero maximo de milisegundos esperados para obtener conexion al invocar
115 \return el numero maximo de milisegundos esperados para obtener conexion al invocar
118 const Millisecond &getMaxConnectionDelay() const throw() { return a_msMaxConnectionDelay; }
121 Devuelve el numero maximo de milisegundos que queda bloqueado el proceso/thread a la espera
122 de escribir en un socket cuyo buffer de salida esta lleno.
123 \return Devuelve el numero maximo de milisegundos que queda bloqueado el proceso/thread a la espera
124 de escribir en un socket cuyo buffer de salida esta lleno.
126 const Millisecond &getMaxWriteDelay() const throw() { return a_msMaxWriteDelay; }
129 Devuelve la factoria de receptores usada por este servidor.
130 \return la factoria de receptores usada por este servidor.
132 ReceiverFactory* getReceiverFactory() throw() { return a_receiverFactory; }
135 Establece el numero maximo de milisegundos esperados para obtener la conexion al
136 invocar al metodo #connect.
137 \param msMaxConnectionDelay Numero de milisegundos esperados para obtener conexion.
139 void setMaxConnectionDelay(const Millisecond &msMaxConnectionDelay)
141 a_msMaxConnectionDelay = msMaxConnectionDelay;
145 Establece el numero maximo de milisegundos que queda bloqueado el proceso/thread a la espera
146 de escribir en un socket cuyo buffer de salida esta lleno.
148 \param msMaxWriteDelay Numero de milisegundos esperados en caso de que el buffer del socket se llene.
150 void setMaxWriteDelay(const Millisecond &msMaxWriteDelay) throw() { a_msMaxWriteDelay = msMaxWriteDelay; }
153 Establece la factoria de receptores usada por este socket.
154 \param receiverFactory Factoria de receptores desde la que obtener el receptor asociado al
155 comm::ClientSocket usado por este servidor.
157 void setReceiverFactory(ReceiverFactory& receiverFactory) throw();
160 * Devuelve \em true si el indicador que ignora los mensajes entrantes está activo, o \em false en otro caso.
161 * \return \em true si el indicador que ignora los mensajes entrantes está activo, o \em false en otro caso.
163 bool getIgnoreIncomingMessages() const throw() { return a_ignoreIncomingMessages; }
166 * Establece el indicador que provoca ignorar los mensajes entrantes.
167 * \param ignoreIncomingMessages \em true si el indicador que ignora los mensajes entrantes está activo, o \em false en otro caso.
169 void setIgnoreIncomingMessages(const bool ignoreIncomingMessages) throw() { a_ignoreIncomingMessages = ignoreIncomingMessages; }
172 Asocia este servidor con un servicio de reparto.
173 \param service Servicio de reparto al que vamos a relacionar este servicio.
174 \warning se invoca automatica desde
176 void attach(Service* service)
177 throw(RuntimeException) {
178 if(std::find(begin(), end(), service) == end())
179 a_services.push_back(service);
183 Crea una conexion al servidor mediante algunas de las conexiones que deberian estar
184 disponibles en la maquina asociada a este servidor.
186 void connect() throw(RuntimeException);
189 Envia el mensaje recibido como parametro. El bloque de datos recibido se codifica segun las
190 reglas establecidas por el protocolo asociado en el contructor.
192 \param message Mensaje vamos codificar para enviar a la capa de transporte.
194 \return La instancia del ClientSocket usada para enviar el mensaje.
196 ClientSocket* send(Message& message) throw(RuntimeException);
199 Envia el mensaje recibido como parametro. El bloque de datos recibido se codifica segun las
200 reglas establecidas por el protocolo asociado en el contructor.
202 \param message Mensaje vamos codificar para enviar a la capa de transporte.
204 \return La instancia del ClientSocket usada para enviar el mensaje.
206 ClientSocket* send(Message* message) throw(RuntimeException);
209 Libera el RemoteConnection asociado a esta instancia. Se invoca automaticamente
210 cuando el extremo remoto cierra la conexion.
212 void reset() throw(RuntimeException);
215 Devuelve un iterador al comienzo de la lista de RemoteConnections asociados a este proceso servidor.
216 \return Un iterador al comienzo de la lista de RemoteConnections asociados a este proceso servidor.
218 const_iterator begin() const throw() { return a_services.begin(); }
221 Devuelve un iterador al final de la lista de RemoteConnections asociados a este proceso servidor.
222 \return Un iterador al final de la lista de RemoteConnections asociados a este proceso servidor.
224 const_iterator end() const throw() { return a_services.end(); }
227 Devuelve un iterador al comienzo de la lista de RemoteConnections asociados a este proceso servidor.
228 \return Un iterador al comienzo de la lista de RemoteConnections asociados a este proceso servidor.
230 iterator begin() throw() { return a_services.begin(); }
233 Devuelve un iterador al final de la lista de RemoteConnections asociados a este proceso servidor.
234 \return Un iterador al final de la lista de RemoteConnections asociados a este proceso servidor.
236 iterator end() throw() { return a_services.end(); }
239 Devuelve una cadena con la informacion referente a este proceso servidor.
240 @return Una cadena con la informacion referente a este proceso servidor.
242 std::string asString() const throw();
245 Devuelve un nodo XML con la informacion referente a este objeto.
246 \param parent Nodo XML a partir del cual introducir la informacion.
247 \return Un nodo XML con la informacion referente a este objeto.
249 xml::Node* asXML(xml::Node* parent) const throw(RuntimeException);
252 Devuelve la instancia del RemoteConnection sobre el que esta posicionado el iterador recibido
254 \param ii Iterador que debera estar comprendido entre begin y end.
255 \return La instancia del RemoteConnection sobre el que esta posicionado el iterador recibido
257 static Service* service(iterator& ii) throw() { return *ii; }
260 Devuelve la instancia del RemoteConnection sobre el que esta posicionado el iterador recibido
262 \param ii Iterador que debera estar comprendido entre begin y end.
263 \return La instancia del RemoteConnection sobre el que esta posicionado el iterador recibido
265 static const Service* service(const_iterator& ii) throw() { return *ii; }
268 Devuelve el nombre logico de esta clase.
269 \return el nombre logico de esta clase.
271 static const char* className() throw() { return "anna::comm::Server"; }
277 \param name Nombre logico del servidor.
278 \param host Instancia de la maquina sobre la que esta atendiento peticiones.
279 \param remotePort Puerto sobre el que atiende peticiones.
280 \param autoRecovery Indica si en caso de caida se debe intenrar la recuperacion
281 automatica de la conexion.
282 \param transportFactory Factoria de protocolos de transporte usada por los ClientSocket asociados a este
285 Server(const std::string& name, const Host& host, const int remotePort, const bool autoRecovery, TransportFactory* transportFactory);
289 const int a_remotePort;
290 const bool a_autoRecovery;
292 TransportFactory* a_transportFactory;
293 ClientSocket* a_clientSocket;
294 Millisecond a_msMaxConnectionDelay;
295 Millisecond a_msMaxWriteDelay;
296 ReceiverFactory* a_receiverFactory;
297 bool a_ignoreIncomingMessages;
300 virtual ClientSocket* allocateClientSocket(const INetAddress&, TransportFactory*) const throw();
303 friend class ServerAllocator;