monitorwatcher.js 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. var logger = require('pomelo-logger').getLogger('pomelo', __filename);
  2. var utils = require('../util/utils');
  3. var events = require('../util/events');
  4. var Constants = require('../util/constants');
  5. var util = require('util');
  6. module.exports = function(opts, consoleService) {
  7. return new Module(opts, consoleService);
  8. };
  9. module.exports.moduleId = Constants.KEYWORDS.MONITOR_WATCHER;
  10. var Module = function(opts, consoleService) {
  11. this.app = opts.app;
  12. this.service = consoleService;
  13. this.id = this.app.getServerId();
  14. this.app.event.on(events.START_SERVER, finishStart.bind(null, this));
  15. };
  16. Module.prototype.start = function(cb) {
  17. subscribeRequest(this, this.service.agent, this.id, cb);
  18. };
  19. Module.prototype.monitorHandler = function(agent, msg, cb) {
  20. if(!msg || !msg.action) {
  21. return;
  22. }
  23. var func = monitorMethods[msg.action];
  24. if(!func) {
  25. logger.info('monitorwatcher unknown action: %j', msg.action);
  26. return;
  27. }
  28. func(this, agent, msg, cb);
  29. };
  30. // ----------------- monitor start method -------------------------
  31. var subscribeRequest = function(self, agent, id, cb) {
  32. var msg = {action: 'subscribe', id: id};
  33. agent.request(Constants.KEYWORDS.MASTER_WATCHER, msg, function(err, servers) {
  34. if(err) {
  35. logger.error('subscribeRequest request to master with error: %j', err.stack);
  36. utils.invokeCallback(cb, err);
  37. }
  38. var res = [];
  39. for(var id in servers) {
  40. res.push(servers[id]);
  41. }
  42. addServers(self, res);
  43. utils.invokeCallback(cb);
  44. });
  45. };
  46. // ----------------- monitor request methods -------------------------
  47. var addServer = function(self, agent, msg, cb) {
  48. logger.debug('[%s] receive addServer signal: %j', self.app.serverId, msg);
  49. if(!msg || !msg.server) {
  50. logger.warn('monitorwatcher addServer receive empty message: %j', msg);
  51. utils.invokeCallback(cb, Constants.SIGNAL.FAIL);
  52. return;
  53. }
  54. addServers(self, [msg.server]);
  55. utils.invokeCallback(cb, Constants.SIGNAL.OK);
  56. };
  57. var removeServer = function(self, agent, msg, cb) {
  58. logger.debug('%s receive removeServer signal: %j', self.app.serverId, msg);
  59. if(!msg || !msg.id) {
  60. logger.warn('monitorwatcher removeServer receive empty message: %j', msg);
  61. utils.invokeCallback(cb, Constants.SIGNAL.FAIL);
  62. return;
  63. }
  64. removeServers(self, [msg.id]);
  65. utils.invokeCallback(cb, Constants.SIGNAL.OK);
  66. };
  67. var replaceServer = function(self, agent, msg, cb) {
  68. logger.debug('%s receive replaceServer signal: %j', self.app.serverId, msg);
  69. if(!msg || !msg.servers) {
  70. logger.warn('monitorwatcher replaceServer receive empty message: %j', msg);
  71. utils.invokeCallback(cb, Constants.SIGNAL.FAIL);
  72. return;
  73. }
  74. replaceServers(self, msg.servers);
  75. utils.invokeCallback(cb, Constants.SIGNAL.OK);
  76. };
  77. var startOver = function(self, agent, msg, cb) {
  78. var fun = self.app.lifecycleCbs[Constants.LIFECYCLE.AFTER_STARTALL];
  79. if(!!fun) {
  80. fun.call(null, self.app);
  81. }
  82. self.app.event.emit(events.START_ALL);
  83. utils.invokeCallback(cb, Constants.SIGNAL.OK);
  84. };
  85. // ----------------- common methods -------------------------
  86. var addServers = function(self, servers) {
  87. if(!servers || !servers.length) {
  88. return;
  89. }
  90. self.app.addServers(servers);
  91. };
  92. var removeServers = function(self, ids) {
  93. if(!ids || !ids.length) {
  94. return;
  95. }
  96. self.app.removeServers(ids);
  97. };
  98. var replaceServers = function(self, servers) {
  99. self.app.replaceServers(servers);
  100. };
  101. // ----------------- bind methods -------------------------
  102. var finishStart = function(self, id) {
  103. var msg = {action: 'record', id: id};
  104. self.service.agent.notify(Constants.KEYWORDS.MASTER_WATCHER, msg);
  105. };
  106. var monitorMethods = {
  107. 'addServer': addServer,
  108. 'removeServer': removeServer,
  109. 'replaceServer': replaceServer,
  110. 'startOver': startOver
  111. };