private function _gen_get_subinfo_ack()
 {
     $pathname = './sub_info.json';
     if (false === file_exists($pathname)) {
         // missing example file
         return false;
     }
     $content = file_get_contents($pathname);
     $ack = new GetSubInfoAckFrame();
     $ack->status = 0;
     $ack->stripe_name = 'stripe';
     $ack->stripe_id = 1;
     $ack->begin_pos = 1;
     $ack->end_pos = 9527;
     $ack->broker_group = $content;
     $ack->store();
     $data = $ack->buffer();
     $ret_arr = $this->_gen_init_meta_ack();
     $ret_arr['good'] = $data;
     return $ret_arr;
 }
 /**
  * 从meta中获取可订阅的broker group
  * @return sub_info on success or false on failure
  */
 public function get_sub_broker_group($pipe_name, $pipelet_id, $start_point)
 {
     if (false === $this->_inited) {
         BigpipeLog::warning("[%s:%u][%s][call uninited object]", __FILE__, __LINE__, __FUNCTION__);
         return false;
     }
     if (empty($this->meta_name)) {
         // 缺少关键条件
         BigpipeLog::warning("[%s:%u][%s][missing meta name]", __FILE__, __LINE__, __FUNCTION__);
         return false;
     }
     // pack reqestion
     $cmd = new GetSubInfoFrame();
     $cmd->meta_name = $this->meta_name;
     $cmd->pipe_name = $pipe_name;
     $cmd->pipelet_id = $pipelet_id + 1;
     // 用于组成pipelet name
     $cmd->start_point = $start_point;
     // send
     $res_body = $this->_request($cmd);
     if (null === $res_body) {
         BigpipeLog::warning("[%s:%u][%s][fail to get sub info][meta:%s][pipe_name:%s][pipelet_id:%d][start_point:%d]", __FILE__, __LINE__, __FUNCTION__, $this->meta_name, $pipe_name, $pipelet_id, $start_point);
         return false;
     }
     // parse ack
     $ack = new GetSubInfoAckFrame();
     if (!$ack->load($res_body)) {
         BigpipeLog::warning("[%s:%u][%s][error ack]", __FILE__, __LINE__, __FUNCTION__);
         return false;
     }
     $broker_group = json_decode($ack->broker_group);
     $sub_info = array('stripe_name' => $ack->stripe_name, 'stripe_id' => $ack->stripe_id, 'begin_pos' => $ack->begin_pos, 'end_pos' => $ack->end_pos, 'broker_group' => $broker_group);
     return $sub_info;
 }