/** * 测试peek和_peek接口 */ public function testPeek() { $subject = new BigpipeQueueClient(); $timeo_ms = 10; // 测试1 uninit下调用接口 $this->assertEquals(BigpipeErrorCode::UNINITED, $subject->peek($timeo_ms)); $this->assertTrue(TestUtilities::set_private_var($subject, '_inited', true)); // 改变meta行为 $this->stub_meta->expects($this->any())->method('update')->will($this->onConsecutiveCalls(false, true)); $this->assertTrue(TestUtilities::set_private_var($subject, '_meta', $this->stub_meta)); // 测试2 未订阅情况下调用init, 且refresh失败 $this->assertEquals(BigpipeErrorCode::ERROR_SUBSCRIBE, $subject->peek($timeo_ms)); $this->assertTrue(TestUtilities::set_private_var($subject, '_subscribed', true)); // 测试3 测试 _peek // 定义connection行为 $this->stub_conn->expects($this->any())->method('is_readable')->will($this->onConsecutiveCalls(BigpipeErrorCode::PEEK_ERROR, BigpipeErrorCode::TIMEOUT, BigpipeErrorCode::TIMEOUT, BigpipeErrorCode::READABLE)); $this->assertTrue(TestUtilities::set_private_var($subject, '_connection', $this->stub_conn)); // 测试3.1 peek error情况 $this->assertEquals(BigpipeErrorCode::PEEK_ERROR, $subject->peek($timeo_ms)); // 测试3.2 unreadable情况 $this->assertTrue(TestUtilities::set_private_var($subject, '_peek_timeo', 15)); $this->assertEquals(BigpipeErrorCode::UNREADABLE, $subject->peek($timeo_ms)); // 测试3.3 timeout情况 $this->assertEquals(BigpipeErrorCode::PEEK_TIMEOUT, $subject->peek($timeo_ms)); // 测试3.4 readable情况 $this->assertEquals(BigpipeErrorCode::READABLE, $subject->peek($timeo_ms)); }
$token = 'token'; $peek_time_ms = 100; // 每次peek最多等待100ms $file = fopen('./queue-client.txt', 'w+'); $cli = new BigpipeQueueClient(); // 测试中,我们希望能取完所有窗口的数据 $max_count = 50000; if ($cli->init($queue_name, $token, $conf)) { echo "[Success][init queue server client]\n"; $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 {