Exemple #1
0
///配置运行环境信息
int CwxEchoApp::initRunEnv(){
    ///设置系统的时钟间隔,最小刻度为1ms,此为1s。
    this->setClick(1000);//1s
    ///设置工作目录
    this->setWorkDir(this->m_config.m_strWorkDir.c_str());
    ///设置循环运行日志的数量
    this->setLogFileNum(LOG_FILE_NUM);
    ///设置每个日志文件的大小
    this->setLogFileSize(LOG_FILE_SIZE*1024*1024);
    ///调用架构的initRunEnv,使以上设置的参数生效
    if (CwxAppFramework::initRunEnv() == -1 ) return -1;
    blockSignal(SIGPIPE);
    //set version
    this->setAppVersion(ECHO_APP_VERSION);
    //set last modify date
    this->setLastModifyDatetime(ECHO_MODIFY_DATE);
    //set compile date
    this->setLastCompileDatetime(CWX_COMPILE_DATE(_BUILD_DATE));

    ///将加载的配置文件信息输出到日志文件中,以供查看检查
    string strConfOut;
    m_config.outputConfig(strConfOut);
    CWX_INFO((strConfOut.c_str()));

    ///注册echo请求的处理handle,echo请求的svr-id为SVR_TYPE_ECHO
    m_eventHandler = new CwxEchoEventHandler(this);         
    this->getCommander().regHandle(SVR_TYPE_ECHO, m_eventHandler);

    ///监听TCP连接,其建立的连接的svr-id都为SVR_TYPE_ECHO,接收的消息的svr-id都为SVR_TYPE_ECHO。
    ///全部由m_eventHandler对象来处理
    if (0 > this->noticeTcpListen(SVR_TYPE_ECHO, 
        this->m_config.m_listen.getHostName().c_str(),
        this->m_config.m_listen.getPort(),
        false,
        CWX_APP_MSG_MODE,
        CwxEchoApp::setSockAttr,
        this))
    {
        CWX_ERROR(("Can't register the echo acceptor port: addr=%s, port=%d",
            this->m_config.m_listen.getHostName().c_str(),
            this->m_config.m_listen.getPort()));
        return -1;
    }
    ///监听UNIX DOMAIN连接,其建立的连接的svr-id都为SVR_TYPE_ECHO,接收的消息的svr-id都为SVR_TYPE_ECHO。
    ///全部由m_eventHandler对象来处理
    if (0 > this->noticeLsockListen(SVR_TYPE_ECHO, 
        this->m_config.m_strUnixPathFile.c_str()))
    {
        CWX_ERROR(("Can't register the echo unix acceptor port: path=%s",
            m_config.m_strUnixPathFile.c_str()));
        return -1;
    }
    ///创建线程池对象,此线程池中线程的group-id为2,线程池的线程数量为m_config.m_unThreadNum。
    m_threadPool = new CwxThreadPool(m_config.m_unThreadNum,
        &getCommander());
    ///启动线程,线程池中线程的线程栈大小为1M。
    if ( 0 != m_threadPool->start(NULL)){
        CWX_ERROR(("Failure to start thread pool"));
        return -1;
    }
    return 0;

}
///配置运行环境信息
int CwxProProxyApp::initRunEnv() {
  ///设置系统的时间间隔,最小时刻为1ms,此时为0.1s
  this->setClick(1000); ///1s
  ///设置工作目录
  this->setWorkDir(m_config.getCmmon().m_strWorkDir.c_str());
  ///设置循环运行的日志数量
  this->setLogFileNum(LOG_FILE_NUM);
  ///设置每个日志文件的大小
  this->setLogFileSize(LOG_FILE_SIZE * 1024 * 1024);
  ///调用架构的initRunEnv,是以上参数生效
  if (CwxAppFramework::initRunEnv() == -1) return -1;
  ///将加载的配置文件信息输出到日志文件
  m_config.outputConfig();
  ///block各种signal
  this->blockSignal(SIGTERM);
  this->blockSignal(SIGUSR1);
  this->blockSignal(SIGUSR2);
  this->blockSignal(SIGCHLD);
  this->blockSignal(SIGCLD);
  this->blockSignal(SIGHUP);
  this->blockSignal(SIGPIPE);
  this->blockSignal(SIGALRM);
  this->blockSignal(SIGCONT);
  this->blockSignal(SIGSTOP);
  this->blockSignal(SIGTSTP);
  this->blockSignal(SIGTTOU);

  //set version
  this->setAppVersion(CWX_PRODUCT_PROXY_VERSION);
  //set last modify date
  this->setLastModifyDatetime(CWX_PRODUCT_PROXY_MODIFY);
  //set compile date
  this->setLastCompileDatetime(CWX_COMPILE_DATE(_BUILD_DATE));
  ///设置启动时间
  CwxDate::getDateY4MDHMS2(time(NULL), m_strStartTime);

  ///创建mq的消息的处理handle
  m_mqHandler = new CwxProProxyMqHandler(this);
  ///注册handele
  getCommander().regHandle(SVR_PRO_TYPE_MQ, m_mqHandler);
  ///创建代理消息的处理handle
  m_recvHandler = new CwxProProxyRecvHandler(this);
  getCommander().regHandle(SVR_PRO_TYPE_RECV, m_recvHandler);
  ///创建消息处理线程池
  m_mqThreadPool = new CwxThreadPool(1,
      &getCommander());
  ///创建线程的tss对象
  CwxTss** pTss = new CwxTss*[1];
  pTss[0] = new CwxMqTss();
  ((CwxMqTss*)pTss[0])->init();
  ///启动线程
  if (0 != m_mqThreadPool->start(pTss)) {
    CWX_ERROR(("Failure to start mq thread pool."));
    return -1;
  }

  ///启动zk线程池
  m_zkThreadPool = new CwxThreadPool(1,
      &getCommander(),
      CwxProProxyApp::zkThreadMain,
      this);
  pTss = new CwxTss*[1];
  pTss[0] = new CwxMqTss();
  ((CwxMqTss*)pTss[0])->init();
  if (0 != m_zkThreadPool->start(pTss)) {
    CWX_ERROR(("Failure to start zookeeper thread pool."));
    return -1;
  }
  ///创建zk的handler
  m_zkHandler = new CwxProProxyZkHandler(this,
      m_config.getZk().m_strRootPath,
      m_config.getZk().m_strZkServer
      );
  if (0 != m_zkHandler->init()) {
    CWX_ERROR(("Failure to init zk handler."));
    return -1;
  }
  ///打开监听端口
  if(0 > this->noticeTcpListen(SVR_PRO_TYPE_RECV,
      m_config.getCmmon().m_listen.getHostName().c_str(),
      m_config.getCmmon().m_listen.getPort(),
      false,
      CWX_APP_MSG_MODE,
      CwxProProxyApp::setRecvSockAttr,
      this)) {
    CWX_ERROR(("Failure to open listen host:%s port:%d",
        m_config.getCmmon().m_listen.getHostName().c_str(),
        m_config.getCmmon().m_listen.getPort()));
    return -1;
  }
  return 0;
}
Exemple #3
0
///配置运行环境信息
int CwxMqApp::initRunEnv() {
  ///设置系统的时钟间隔,最小刻度为1ms,此为0.1s。
  this->setClick(100); //0.1s
  ///设置工作目录
  this->setWorkDir(m_config.getCommon().m_strWorkDir.c_str());
  ///设置循环运行日志的数量
  this->setLogFileNum(LOG_FILE_NUM);
  ///设置每个日志文件的大小
  this->setLogFileSize(LOG_FILE_SIZE * 1024 * 1024);
  ///调用架构的initRunEnv,使以上设置的参数生效
  if (CwxAppFramework::initRunEnv() == -1) return -1;
  ///将加载的配置文件信息输出到日志文件中,以供查看检查
  m_config.outputConfig();
  ///block各种signal
  this->blockSignal(SIGTERM);
  this->blockSignal(SIGUSR1);
  this->blockSignal(SIGUSR2);
  this->blockSignal(SIGCHLD);
  this->blockSignal(SIGCLD);
  this->blockSignal(SIGHUP);
  this->blockSignal(SIGPIPE);
  this->blockSignal(SIGALRM);
  this->blockSignal(SIGCONT);
  this->blockSignal(SIGSTOP);
  this->blockSignal(SIGTSTP);
  this->blockSignal(SIGTTOU);

  //set version
  this->setAppVersion(CWX_MQ_VERSION);
  //set last modify date
  this->setLastModifyDatetime(CWX_MQ_MODIFY_DATE);
  //set compile date
  this->setLastCompileDatetime(CWX_COMPILE_DATE(_BUILD_DATE));
  ///设置启动时间
  CwxDate::getDateY4MDHMS2(time(NULL), m_strStartTime);

  //启动binlog管理器
  if (0 != startBinLogMgr()) return -1;
  if (m_config.getCommon().m_bMaster) {
    ///注册数据接收handler
    if (m_config.getRecv().m_recv.getHostName().length()) {
      m_recvHandler = new CwxMqRecvHandler(this);
      getCommander().regHandle(SVR_TYPE_RECV, m_recvHandler);
    }
  } else {
    ///注册slave的master数据接收handler
    m_masterHandler = new CwxMqMasterHandler(this);
    getCommander().regHandle(SVR_TYPE_MASTER, m_masterHandler);
  }

  ///启动网络连接与监听
  if (0 != startNetwork()) return -1;
  ///创建recv线程池对象,此线程池中线程的group-id为THREAD_GROUP_USER_START,
  ///线程池的线程数量为1。
  m_recvThreadPool = new CwxThreadPool(1, &getCommander());
  ///创建线程的tss对象
  CwxTss** pTss = new CwxTss*[1];
  pTss[0] = new CwxMqTss();
  ((CwxMqTss*) pTss[0])->init();
  ///启动线程
  if (0 != m_recvThreadPool->start(pTss)) {
    CWX_ERROR(("Failure to start recv thread pool"));
    return -1;
  }
  //创建分发线程池
  if (m_config.getDispatch().m_async.getHostName().length()) {
    m_dispChannel = new CwxAppChannel();
    m_dispThreadPool = new CwxThreadPool(1,
      &getCommander(),
      CwxMqApp::dispatchThreadMain,
      this);
    ///启动线程
    pTss = new CwxTss*[1];
    pTss[0] = new CwxMqTss();
    ((CwxMqTss*) pTss[0])->init();
    if (0 != m_dispThreadPool->start(pTss)) {
      CWX_ERROR(("Failure to start dispatch thread pool"));
      return -1;
    }
  }
  //创建mq线程池
  if (m_config.getMq().m_mq.getHostName().length()
    || m_config.getMq().m_mq.getUnixDomain().length())
  {
    m_mqChannel = new CwxAppChannel();
    m_mqThreadPool = new CwxThreadPool(1,
      &getCommander(),
      CwxMqApp::mqFetchThreadMain,
      this);
    ///启动线程
    pTss = new CwxTss*[1];
    pTss[0] = new CwxMqTss();
    ((CwxMqTss*) pTss[0])->init();
    if (0 != m_mqThreadPool->start(pTss)) {
      CWX_ERROR(("Failure to start mq thread pool"));
      return -1;
    }
  }
  return 0;
}