00001 #ifndef _Broker_
00002 #define _Broker_
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 #include "ConnectionFactory.h"
00026 #include "ConnectionToken.h"
00027 #include "DirectExchange.h"
00028 #include "DtxManager.h"
00029 #include "ExchangeRegistry.h"
00030 #include "MessageStore.h"
00031 #include "QueueRegistry.h"
00032 #include "LinkRegistry.h"
00033 #include "SessionManager.h"
00034 #include "Vhost.h"
00035 #include "System.h"
00036 #include "qpid/management/Manageable.h"
00037 #include "qpid/management/ManagementBroker.h"
00038 #include "qpid/management/Broker.h"
00039 #include "qpid/management/ArgsBrokerConnect.h"
00040 #include "qpid/Options.h"
00041 #include "qpid/Plugin.h"
00042 #include "qpid/DataDir.h"
00043 #include "qpid/framing/FrameHandler.h"
00044 #include "qpid/framing/OutputHandler.h"
00045 #include "qpid/framing/ProtocolInitiation.h"
00046 #include "qpid/sys/Runnable.h"
00047 #include "qpid/RefCounted.h"
00048 #include "AclModule.h"
00049
00050 #include <boost/intrusive_ptr.hpp>
00051 #include <vector>
00052
00053 namespace qpid {
00054
00055 namespace sys {
00056 class ProtocolFactory;
00057 class Poller;
00058 }
00059
00060 class Url;
00061
00062 namespace broker {
00063
00064 static const uint16_t DEFAULT_PORT=5672;
00065
00069 class Broker : public sys::Runnable, public Plugin::Target,
00070 public management::Manageable, public RefCounted
00071 {
00072 public:
00073
00074 struct Options : public qpid::Options {
00075 Options(const std::string& name="Broker Options");
00076
00077 bool noDataDir;
00078 std::string dataDir;
00079 uint16_t port;
00080 int workerThreads;
00081 int maxConnections;
00082 int connectionBacklog;
00083 uint64_t stagingThreshold;
00084 bool enableMgmt;
00085 uint16_t mgmtPubInterval;
00086 bool auth;
00087 std::string realm;
00088 size_t replayFlushLimit;
00089 size_t replayHardLimit;
00090 uint queueLimit;
00091 bool tcpNoDelay;
00092 };
00093
00094 private:
00095 boost::shared_ptr<sys::Poller> poller;
00096 Options config;
00097 management::ManagementAgent::Singleton managementAgentSingleton;
00098 std::vector< boost::shared_ptr<sys::ProtocolFactory> > protocolFactories;
00099 MessageStore* store;
00100 AclModule* acl;
00101 DataDir dataDir;
00102
00103 QueueRegistry queues;
00104 ExchangeRegistry exchanges;
00105 LinkRegistry links;
00106 boost::shared_ptr<sys::ConnectionCodec::Factory> factory;
00107 DtxManager dtxManager;
00108 SessionManager sessionManager;
00109 management::ManagementAgent* managementAgent;
00110 management::Broker* mgmtObject;
00111 Vhost::shared_ptr vhostObject;
00112 System::shared_ptr systemObject;
00113
00114 void declareStandardExchange(const std::string& name, const std::string& type);
00115
00116
00117 public:
00118
00119
00120 virtual ~Broker();
00121
00122 Broker(const Options& configuration);
00123 static boost::intrusive_ptr<Broker> create(const Options& configuration);
00124 static boost::intrusive_ptr<Broker> create(int16_t port = DEFAULT_PORT);
00125
00132 virtual uint16_t getPort() const;
00133
00138 virtual void run();
00139
00141 virtual void shutdown();
00142
00143 void setStore (MessageStore*);
00144 MessageStore& getStore() { return *store; }
00145 void setAcl (AclModule* _acl) {acl = _acl;}
00146 AclModule* getAcl() { return acl; }
00147 QueueRegistry& getQueues() { return queues; }
00148 ExchangeRegistry& getExchanges() { return exchanges; }
00149 LinkRegistry& getLinks() { return links; }
00150 uint64_t getStagingThreshold() { return config.stagingThreshold; }
00151 DtxManager& getDtxManager() { return dtxManager; }
00152 DataDir& getDataDir() { return dataDir; }
00153 Options& getOptions() { return config; }
00154
00155 SessionManager& getSessionManager() { return sessionManager; }
00156
00157 management::ManagementObject* GetManagementObject (void) const;
00158 management::Manageable* GetVhostObject (void) const;
00159 management::Manageable::status_t ManagementMethod (uint32_t methodId, management::Args& args);
00160
00162 void registerProtocolFactory(boost::shared_ptr<sys::ProtocolFactory>);
00163
00165 void accept();
00166
00168 void connect(const std::string& host, uint16_t port, bool useSsl,
00169 boost::function2<void, int, std::string> failed,
00170 sys::ConnectionCodec::Factory* =0);
00172 void connect(const Url& url,
00173 boost::function2<void, int, std::string> failed,
00174 sys::ConnectionCodec::Factory* =0);
00175
00176
00177
00178 boost::shared_ptr<sys::ProtocolFactory> getProtocolFactory() const;
00179
00181 boost::shared_ptr<sys::Poller> getPoller();
00182
00183 boost::shared_ptr<sys::ConnectionCodec::Factory> getConnectionFactory() { return factory; }
00184 void setConnectionFactory(boost::shared_ptr<sys::ConnectionCodec::Factory> f) { factory = f; }
00185 };
00186
00187 }}
00188
00189
00190
00191 #endif