acl  3.5.3.0
connect_monitor.hpp
浏览该文件的文档.
1 #pragma once
2 #include "../acl_cpp_define.hpp"
3 #include "../stdlib/thread.hpp"
4 #include "../stream/aio_handle.hpp"
5 #include <vector>
6 
7 namespace acl
8 {
9 
10 class aio_handle;
11 class check_client;
12 class connect_manager;
13 class rpc_service;
14 class socket_stream;
15 class aio_socket_stream;
16 
18 {
19 public:
20  /**
21  * 构造函数
22  * @param manager {connect_manager&}
23  */
25 
26  virtual ~connect_monitor();
27 
28  /**
29  * 当希望采用阻塞式检测服务端连接时,需要先调用本函数打开
30  * acl::rpc_service 阻塞接口处理服务;如果在初始化时不调用本函数,
31  * 则采用非阻塞方式进行 IO 检测
32  * @param max_threads {int} rpc_service 服务线程池中运行的最大线程数
33  * @param addr {const char*} 希望 rpc_service 服务监听的本机地址,可以
34  * 为本机的回地址或在 UNIX 平台下使用域套接口地址
35  * @return {connect_monitor&}
36  */
37  connect_monitor& open_rpc_service(int max_threads,
38  const char* addr = NULL);
39 
40  /**
41  * 设置检测定时器启动的时间间隔
42  * @param n {int} 时间间隔(秒)
43  * @return {connect_mointor&}
44  */
45  connect_monitor& set_check_inter(int n);
46 
47  /**
48  * 设置连接被检测服务器的超时时间
49  * @param n {int} 超时时间(秒)
50  * @return {connect_monitor&}
51  */
52  connect_monitor& set_conn_timeout(int n);
53 
54  /**
55  * 停止检测线程
56  * @param graceful {bool} 是否文明地关闭检测过程,如果为 true
57  * 则会等所有的检测连接关闭后检测线程才返回;否则,则直接检测线程
58  * 直接返回,可能会造成一些正在检测的连接未被释放。正因如此,如果
59  * 连接池集群管理对象是进程内全局的,可以将此参数设为 false,如果
60  * 连接池集群管理对象在运行过程中需要被多次创建与释放,则应该设为 true
61  */
62  void stop(bool graceful);
63 
64  /**
65  * 获得 connect_manager 引用对象
66  * @return {connect_manager&}
67  */
69  {
70  return manager_;
71  }
72 
73  /**
74  * 虚函数,子类可以重载本函数用来进一步判断该连接是否是存活的,该回调
75  * 函数的运行空间为当前非阻塞检测线程的运行空间,因此在该回调函数中不
76  * 得有阻塞过程,否则将会阻塞整个非阻塞检测线程
77  * @param checker {check_client&} 服务端连接的检查对象,可以通过
78  * check_client 类中的方法如下:
79  * 1) get_conn 获得非阻塞连接句柄
80  * 2) get_addr 获得服务端地址
81  * 3) set_alive 设置连接是否存活
82  * 4) close 关闭连接
83  */
84  virtual void nio_check(check_client& checker, aio_socket_stream& conn);
85 
86  /**
87  * 同步 IO 检测虚函数,该函数在线程池的某个子线程空间中运行,子类可以
88  * 重载本函数以检测实际应用的网络连接存活状态,可以在本函数内有阻塞
89  * IO 过程
90  * @param checker {check_client&} 服务端连接的检查对象
91  * check_client 类中允许调用的方法如下:
92  * 1) get_addr 获得服务端地址
93  * 2) set_alive 设置连接是否存活
94  * check_client 类中禁止调用的方法如下:
95  * 1) get_conn 获得非阻塞连接句柄
96  * 2) close 关闭连接
97  */
98  virtual void sio_check(check_client& checker, socket_stream& conn);
99 
100  /**
101  * 当连接成功时的回调方法,子类可以实现本方法
102  * @param cost {double} 从发起连接请求到超时的时间间隔(秒)
103  */
104  virtual void on_connected(const check_client&, double cost)
105  {
106  (void) cost;
107  }
108 
109  /**
110  * 当连接超时时的回调方法,子类可以实现本方法
111  * @param addr {const char*} 被检测的服务器地址,格式: ip:port
112  * @param cost {double} 从发起连接请求到超时的时间间隔(秒)
113  */
114  virtual void on_timeout(const char* addr, double cost)
115  {
116  (void) addr;
117  (void) cost;
118  }
119 
120  /**
121  * 当连接服务器时被拒绝时的回调方法,子类可实现本方法
122  * @param addr {const char*} 被检测的服务器地址,格式: ip:port
123  * @param cost {double} 从发起连接请求到被断开的时间间隔(秒)
124  */
125  virtual void on_refused(const char* addr, double cost)
126  {
127  (void) addr;
128  (void) cost;
129  }
130 
131 public:
132  // 虽然下面的函数是 public 的,但只供内部使用
133  /**
134  * 当与服务端建立连接后调用此函数
135  * @param checker {check_client&}
136  */
137  void on_open(check_client& checker);
138 
139 protected:
140  // 基类纯虚函数
141  virtual void* run();
142 
143 private:
144  bool stop_;
145  bool stop_graceful_;
146  aio_handle handle_; // 后台检测线程的非阻塞句柄
147  connect_manager& manager_; // 连接池集合管理对象
148  int check_inter_; // 检测连接池状态的时间间隔(秒)
149  int conn_timeout_; // 连接服务器的超时时间
150  rpc_service* rpc_service_; // 异步 RPC 通信服务句柄
151 };
152 
153 } // namespace acl
connect_manager & get_manager() const
virtual void on_refused(const char *addr, double cost)
virtual void on_connected(const check_client &, double cost)
virtual void on_timeout(const char *addr, double cost)
#define ACL_CPP_API