linux版本中间件

EslMgr.cpp 3.8KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. #include "EslMgr.h"
  2. #include "EslGateway.h"
  3. #include <sstream>
  4. #include "Log.h"
  5. EslMgr EslMgr::instance;
  6. bool EslMgr::AddEslGateway(const std::string & strIP, const std::int16_t & nPort, const std::string & strPwd, const std::int32_t & nTrunkCount)
  7. {
  8. std::unique_lock<std::shared_timed_mutex>lock(mut);
  9. auto it = std::find_if(m_lstEslGateway.begin(), m_lstEslGateway.end(),
  10. [=](const std::shared_ptr<EslGateway>&esl) {
  11. return esl->IsEslGateway(strIP, nPort, strPwd);
  12. });
  13. if (it == m_lstEslGateway.end()) { // 不存在,添加
  14. auto pEsl = std::make_shared<EslGateway>(nTrunkCount);
  15. bool ret = pEsl->init(strIP, nPort, strPwd);
  16. if (ret) {
  17. m_lstEslGateway.emplace_back(pEsl);
  18. return true;
  19. }
  20. }
  21. return false;
  22. }
  23. bool EslMgr::DelEslGateway(const std::string & strIP, const std::int16_t & nPort, const std::string & strPwd)
  24. {
  25. std::unique_lock<std::shared_timed_mutex>lock(mut);
  26. for (auto it = m_lstEslGateway.begin(); it != m_lstEslGateway.end(); ++it) {
  27. if ((*it)->IsEslGateway(strIP, nPort, strPwd)) {
  28. m_lstEslGateway.erase(it);
  29. return true;
  30. }
  31. }
  32. return false;
  33. }
  34. std::int32_t EslMgr::GetUsableTotal()
  35. {
  36. std::int32_t nUsable = 0;
  37. std::shared_lock<std::shared_timed_mutex>lock(mut);
  38. for (const auto esl : m_lstEslGateway) {
  39. nUsable += esl->GetUsableCount();
  40. }
  41. return nUsable;
  42. }
  43. void EslMgr::ExecTask(const TASK_TYPE&emType, const std::list<std::shared_ptr<TaskData>>& lstTaskData)
  44. {
  45. switch (emType)
  46. {
  47. case TASK_TYPE_LOOP:
  48. strategyLoop(lstTaskData);
  49. break;
  50. case TASK_TYPE_CFG_PRIORITY:
  51. strategyCfgPriority(lstTaskData);
  52. break;
  53. default:
  54. strategyLoop(lstTaskData);
  55. break;
  56. }
  57. }
  58. void EslMgr::ExecTask(const TASK_TYPE & emType, const std::shared_ptr<TaskData>& pTaskData)
  59. {
  60. std::shared_lock<std::shared_timed_mutex>lock(mut);
  61. for (auto esl : m_lstEslGateway) {
  62. if (esl->IsConn()) {
  63. execTaskCall(esl, pTaskData);
  64. break;
  65. }
  66. }
  67. }
  68. void EslMgr::ExecTask(const std::list<std::shared_ptr<TaskData>>& lstTaskData)
  69. {
  70. std::shared_lock<std::shared_timed_mutex>lock(mut);
  71. auto it = m_lstEslGateway.begin();
  72. for (auto task : lstTaskData) {
  73. if (it == m_lstEslGateway.end()) {
  74. break;
  75. }
  76. else {
  77. const auto esl = *it;
  78. if (esl->GetUsableCount() > 0 && esl->IsConn())
  79. execTaskCall(esl, task);
  80. ++it;
  81. }
  82. }
  83. }
  84. bool EslMgr::isExists(const std::string & strIP, const std::int16_t & nPort, const std::string & strPwd)
  85. {
  86. std::shared_lock<std::shared_timed_mutex>lock(mut);
  87. for (const auto esl : m_lstEslGateway) {
  88. if (esl->IsEslGateway(strIP, nPort, strPwd))
  89. return true;
  90. }
  91. return false;
  92. }
  93. void EslMgr::strategyLoop(const std::list<std::shared_ptr<TaskData>>& lstTaskData)
  94. {
  95. std::shared_lock<std::shared_timed_mutex>lock(mut);
  96. auto it = m_lstEslGateway.begin();
  97. for (auto task : lstTaskData) {
  98. if (it == m_lstEslGateway.end()) {
  99. break;
  100. }
  101. else {
  102. const auto esl = *it;
  103. if (esl->GetUsableCount() > 0 && esl->IsConn())
  104. execTaskCall(esl, task);
  105. ++it;
  106. }
  107. }
  108. }
  109. void EslMgr::strategyCfgPriority(const std::list<std::shared_ptr<TaskData>>& lstTaskData)
  110. {
  111. auto lstData = lstTaskData;
  112. std::shared_lock<std::shared_timed_mutex>lock(mut);
  113. for (auto it = m_lstEslGateway.begin(); it != m_lstEslGateway.end(); it++) {
  114. const auto esl = *it;
  115. auto n = esl->GetUsableCount();
  116. for (auto i = 0; i < n && esl->IsConn(); ++i) {
  117. auto task = lstData.front();
  118. execTaskCall(esl, task);
  119. lstData.pop_front();
  120. }
  121. }
  122. }
  123. bool EslMgr::execTaskCall(const std::shared_ptr<EslGateway>& pEsl, const std::shared_ptr<TaskData>& pTask)
  124. {
  125. if (pEsl) {
  126. std::stringstream ss;
  127. ss << "bgapi lua CallOut.lua ";
  128. ss << pTask->llID <<" " <<pTask->lltaskID;
  129. ss << " ";
  130. ss << pTask->strFix << pTask->strPhone;
  131. ss << " "<<pTask->llUID;
  132. ss << " " << pTask->strTaskItemIDS;
  133. LOG_DEBUG("lua执行 %s",ss.str().c_str());
  134. return pEsl->sendCmd(ss.str());
  135. }
  136. return false;
  137. }