/** * @brief: 向primary broker 发送一条消息 * @param BigpipeMessagePackage $msg * @return: BigpipePubResult on success or false on failure */ public function send($msg_package) { if (false === $this->_inited) { BigpipeLog::fatal("[%s:%u][%s][publisher is not inited]", __FILE__, __LINE__, __FUNCTION__); return false; } $pipelet_id = $this->_partitioner->get_pipelet_id($msg_package, $this->_num_piplet); if ($pipelet_id >= $this->_num_piplet || $pipelet_id < 0) { BigpipeLog::fatal("[%s:%u][%s][invalid pipelet][pipelet_id:%u][max_pipelet_id:%u]", __FILE__, __LINE__, __FUNCTION__, $pipelet_id, $this->_num_piplet - 1); return false; } $pub = null; if (!isset($this->_pub_list[$pipelet_id])) { $pub = new BigpipePublishTask($this->_pipe_name, $pipelet_id, $this->_session, $this->_conf, $this->_meta_adapter); // 在pub_list中, 保存pub的引用 $this->_pub_list[$pipelet_id] =& $pub; } else { $pub =& $this->_pub_list[$pipelet_id]; } $pub_result = $pub->start(); if (!$pub_result) { BigpipeLog::warning("[%s:%u][%s][fail to start publish task][pipe_name:%u][pipelet_id:%u]", __FILE__, __LINE__, __FUNCTION__, $this->_pipe_name, $pipelet_id); } else { $pub_result = $pub->send($msg_package); } if (false === $pub_result) { $pub->stop(); // 发送出现错误,停止task(等待下次重启) } unset($pub); // 主动释放$pub与pub task的联系,否则可能会影响到_pub_list中被引用的元素。 return $pub_result; }