コード例 #1
0
 public function testAck()
 {
     $subject = new BigpipeQueueClient();
     // 测试1 uninit下调用接口
     $this->assertFalse($subject->ack(null));
     $this->assertTrue(TestUtilities::set_private_var($subject, '_inited', true));
     // 测试2 参数检查失败
     $ack_msg = new BigpipeQueueMessage();
     $this->assertFalse($subject->ack($ack_msg));
     $ack_msg->pipe_name = 'pipe';
     // 定义connection的行为
     $this->stub_conn->expects($this->once())->method('send')->will($this->returnValue(true));
     $this->assertTrue(TestUtilities::set_private_var($subject, '_connection', $this->stub_conn));
     // 定义meta的行为
     // todo 无法控制只抛出一次异常,异常接收分支会被跳过
     $e = new ErrorException('php unit test');
     $this->stub_meta->expects($this->any())->method('queue_name')->will($this->returnValue($this->que_name));
     $this->assertTrue(TestUtilities::set_private_var($subject, '_meta', $this->stub_meta));
     $this->assertTrue($subject->ack($ack_msg));
 }
コード例 #2
0
 $count = 0;
 $success = 0;
 $failure = 0;
 $peek = 0;
 $ack = 0;
 while ($count < $max_count) {
     $pret = $cli->peek($peek_time_ms);
     if (BigpipeErrorCode::READABLE == $pret) {
         $msg = $cli->receive();
         if (false === $msg) {
             echo sprintf("[Failure][receive msg][cnt:%u]\n", $count);
             $failure++;
         } else {
             // 回复ack
             //if (false === $cli->ack($msg,true))  慢速客户端请调用此接口!!!同时设置滑动窗口为1
             if (false === $cli->ack($msg)) {
                 // ack失败常由于msg处理超时引起,这时queuesvr中waiting队列中对应msg会被归还send队列。
                 // 用户不应该继续使用这条message。
                 // 这时多次重试ack也没有必要,因为一旦超时,socket就会被queuesvr主动关闭。
                 echo sprintf("[Failure][ack][cnt:%u]\n", $count);
                 $msg = false;
             } else {
                 // 我们以成功发送ack作为数据订阅成功的标志
                 // 如果ack发送失败, queue server会将数据重新放回发布队列,
                 // 因此我们必须在ack成功后才将数据落地.
                 // 否则会导致数据被重复订阅.
                 $success++;
                 $msg_str = sprintf("[Success][begin msg]\n[pipe:%s]\n[pipelet:%u]\n[id:%u]\n[seq:%u]\n[msg][%s]\n[Success][end msg]===\n", $msg->pipe_name, $msg->pipelet_id, $msg->pipelet_msg_id, $msg->seq_id, $msg->message_body);
                 fwrite($file, $msg_str);
                 $ack++;
             }