本文介绍如何使用PHP SDK创建主题、创建队列、创建订阅和发布消息等操作。
步骤一:准备工作
- 下载文件CreateTopicAndPushMessageToQueue。
- 打开CreateTopicAndPushMessageToQueue.php文件,在文件中最下方配置以下内容:
- AccessKey ID、AccessKey Secret
- 访问阿里云API的密钥对。
- 如果使用阿里云账号访问,请登录AccessKey管理页面创建和查看。
- 如果使用RAM用户访问,请登录阿里云访问控制控制台查看。
- Endpoint
- AccessKey ID、AccessKey Secret
- 修改SDK设置。
CreateTopicAndPushMessageToQueue的代码顶部有一些设置,在使用SDK的时候需要做同样的设置。
//require SDK里自带的一个autoload文件。 require __DIR__ . '/vendor/autoload.php'; //代码里需要用的一些PHP class。 use AliyunMNS\Client; use AliyunMNS\Exception\MessageNotExistException; use AliyunMNS\Model\SubscriptionAttributes; use AliyunMNS\Requests\PublishMessageRequest; use AliyunMNS\Requests\CreateTopicRequest; use AliyunMNS\Requests\CreateQueueRequest; use AliyunMNS\Exception\MnsException;
步骤二:创建主题
如果之前未创建过主题,那么首先需要创建主题。默认创建的主题名称是CreateTopicAndPushMessageToQueueExample,创建的队列名是 CreateTopicAndPushMessageToQueueExample,也可以修改代码指定的主题、队列名称。
// 生成一个CreateTopicRequest实例,参数传入topicName。这里可以同时传入TopicAttributes,以便在CreateTopic时同时设置自定义的Topic属性。
$request = new CreateTopicRequest($topicName);
try {
$res = $this->client->createTopic($request);
echo "TopicCreated! \n";
} catch (MnsException $e) {
// 可能因为网络错误,或者Topic已经存在等原因导致CreateTopic失败,这里CatchException并做对应的处理。
echo "CreateTopicFailed: " . $e;
return;
}
步骤三:创建队列
如果之前未创建队列,那么首先需要创建队列。默认创建的队列名称是CreateTopicAndPushMessageToQueueExample,也可以修改代码指定队列名称。
// 生成一个CreateQueueRequest对象。CreateQueueRequest还可以接受一个QueueAttributes参数,用来初始化生成的queue的属性。
// 对于queue的属性,请参见Queue。
$request = new CreateQueueRequest($queueName);
try {
$res = $this->client->createQueue($request);
echo "QueueCreated! \n";
} catch (MnsException $e) {
// 可能因为网络错误,或者Queue已经存在等原因导致CreateQueue失败,这里CatchException并做对应的处理。
echo "CreateQueueFailed: " . $e;
return;
}
步骤四:创建订阅
对已创建的主题进行订阅。
$subscriptionName = "SubscriptionExample";
$attributes = new SubscriptionAttributes($subscriptionName, $topic->generateQueueEndpoint($queueName), 'BACKOFF_RETRY', 'SIMPLIFIED');
try {
$topic->subscribe($attributes);
echo "Subscribed! \n";
} catch (MnsException $e) {
// 可能因为网络错误,或者同名的Subscription已存在等原因导致订阅出错,这里CatchException并做对应的处理。
echo "SubscribeFailed: " . $e;
return;
}
步骤五:发布消息
发布消息到主题中。
$messageBody = "test";
$request = new PublishMessageRequest(base64_encode($messageBody));
try {
$res = $topic->publishMessage($request);
echo "MessagePublished! \n";
} catch (MnsException $e) {
// 可能因为网络错误等原因导致PublishMessage失败,这里CatchException并做对应处理。
echo "PublishMessage Failed: " . $e;
return;
}
步骤六:从队列接收和删除消息
消息从主题推送到队列后,从队列中取出并删除该条消息。
try {
// 调用receiveMessage函数进行消息的拉取。
// waitSeconds非0表示这次receiveMessage是一次http long polling,如果queue内没有message,那么这次request会在server端等到queue内有消息才返回。最长等待时间为waitSeconds的值,最大为30。
$res = $queue->receiveMessage(3);
echo "Receive Message success, MessageBody: " . $res->getMessageBody() . "\n";
// 这里是您处理消息的逻辑。Sample里就直接略过这一步。
// 如果这里发生了程序崩溃或卡住等异常情况,对应的Message会在VisibilityTimeout之后重新可见,从而可以被其他进程处理,避免消息丢失。
// 获取ReceiptHandle,这是一个有时效性的Handle,可以用来设置Message的各种属性和删除Message。更多信息,请参见QueueMessage。
$receiptHandle = $res->getReceiptHandle();
// 消息已经处理完成,从队列里删除这条消息。
$queue->deleteMessage($receiptHandle);
echo "DeleteMessage Succeed! \n";
break;
} catch (MessageNotExistException $e) {
echo "No New Message";
} catch (MnsException $e) {
echo "Process Failed: " . $e;
}
步骤七:删除订阅
删除测试用的订阅。
try {
$topic->unsubscribe($subscriptionName);
echo "Unsubscribe Succeed! \n";
} catch (MnsException $e) {
echo "Unsubscribe Failed: " . $e;
return;
}
步骤八:删除主题
删除测试用的主题。
try {
$this->client->deleteTopic($topicName);
echo "DeleteTopic Succeed! \n";
} catch (MnsException $e) {
echo "DeleteTopic Failed: " . $e;
return;
}
步骤九:删除队列
删除测试用的队列。
try {
$this->client->deleteQueue($queueName);
echo "DeleteQueue Succeed! \n";
} catch (MnsException $e) {
echo "DeleteQueue Failed: " . $e;
return;
}