00001 #ifndef QPID_CLIENT_FAILOVERMANAGER_H
00002 #define QPID_CLIENT_FAILOVERMANAGER_H
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 #include "Connection.h"
00026 #include "ConnectionSettings.h"
00027 #include "qpid/Exception.h"
00028 #include "qpid/client/AsyncSession.h"
00029 #include "qpid/sys/Monitor.h"
00030 #include <vector>
00031
00032 namespace qpid {
00033 namespace client {
00034
00035 struct CannotConnectException : qpid::Exception
00036 {
00037 CannotConnectException(const std::string& m) : qpid::Exception(m) {}
00038 };
00039
00043 class FailoverManager
00044 {
00045 public:
00050 struct Command
00051 {
00062 virtual void execute(AsyncSession& session, bool isRetry) = 0;
00063 virtual ~Command() {}
00064 };
00065
00066 struct ReconnectionStrategy
00067 {
00075 virtual void editUrlList(std::vector<Url>& urls) = 0;
00076 virtual ~ReconnectionStrategy() {}
00077 };
00078
00087 FailoverManager(const ConnectionSettings& settings, ReconnectionStrategy* strategy = 0);
00098 Connection& connect(std::vector<Url> brokers = std::vector<Url>());
00102 Connection& getConnection();
00106 void close();
00119 void execute(Command&);
00120 private:
00121 enum State {IDLE, CONNECTING, CANT_CONNECT};
00122
00123 qpid::sys::Monitor lock;
00124 Connection connection;
00125 ConnectionSettings settings;
00126 ReconnectionStrategy* strategy;
00127 State state;
00128
00129 void attempt(Connection&, ConnectionSettings settings, std::vector<Url> urls);
00130 void attempt(Connection&, ConnectionSettings settings);
00131 };
00132 }}
00133
00134 #endif