baselsoftwaredev/azure-service-bus

此项目提供了一个库,使访问微软服务总线(队列和主题)变得容易。

dev-master 2021-08-31 21:01 UTC

This package is auto-updated.

Last update: 2024-09-29 05:56:53 UTC


README

此项目提供了一个库,使访问微软服务总线(队列和主题)变得容易。

大多数代码是从现在存档的azure for php sdk库中提取的。

旧的前非相关代码已被移除

旧库是在PHP 5.6上构建的,因此已升级以支持至少最新的LTS PHP 7.4。

特性

  • 队列:创建、列出和删除队列;发送、接收、解锁和删除消息
  • 主题:创建、列出和删除主题;创建、列出和删除订阅;发送、接收、解锁和删除消息;创建、列出和删除规则

入门指南

下载源代码

要从GitHub获取源代码,请输入

git clone https://github.com/baselsoftwaredev/azure-service-bus.git
cd ./azure-service-bus

通过Composer安装

计划添加Composer包注册表。

用法

入门指南

在使用库之前,您必须执行以下四个基本步骤才能调用任何Microsoft Azure API。

  • 首先,包含自动加载脚本

    require_once "vendor/autoload.php";
  • 包含您将使用的命名空间。

    要创建任何Microsoft Azure服务客户端,您需要使用ServicesBuilder

    use WindowsAzure\Common\ServicesBuilder;

    要处理异常,您需要

    use WindowsAzure\Common\ServiceException;
  • 要实例化服务客户端,您还需要一个有效的连接字符串。要访问服务总线,格式为

    Endpoint=[yourEndpoint];SharedSecretIssuer=[yourWrapAuthenticationName];SharedSecretValue=[yourWrapPassword]
    

    其中端点通常是格式为https://[yourNamespace].servicebus.windows.net

  • 实例化Service Bus "REST代理" - 对给定服务的可用调用的包装器。

    $serviceBusRestProxy = ServicesBuilder::getInstance()->createServiceBusService($connectionString);

创建队列

QueueRestProxy对象允许您使用createQueue方法创建队列。在创建队列时,您可以为队列设置选项,但这不是必需的。

$createQueueOptions = new CreateQueueOptions();
$createQueueOptions->addMetaData("key1", "value1");
$createQueueOptions->addMetaData("key2", "value2");

try {
  // Create queue.
  $queueRestProxy->createQueue("myqueue", $createQueueOptions);
} catch(ServiceException $e){
  $code = $e->getCode();
  $error_message = $e->getMessage();
  echo $code.": ".$error_message."<br />";
}

队列的错误代码和消息

向队列添加消息

要将消息添加到队列,请使用QueueRestProxy->createMessage。该方法接受队列名称、消息文本和消息选项(这些选项是可选的)。为了与其他人兼容,您可能需要将消息进行base64编码。

try {
  // Create message.
  $msg = "Hello World!";
  // optional: $msg = base64_encode($msg);
  $queueRestProxy->createMessage("myqueue", $msg);
} catch(ServiceException $e){
  $code = $e->getCode();
  $error_message = $e->getMessage();
  echo $code.": ".$error_message."<br />";
}

查看下一个消息

您可以通过调用QueueRestProxy->peekMessages查看(或查看多个)队列前端的(或多个)消息,而不将其从队列中删除。

// OPTIONAL: Set peek message options.
$message_options = new PeekMessagesOptions();
$message_options->setNumberOfMessages(1); // Default value is 1.

try {
  $peekMessagesResult = $queueRestProxy->peekMessages("myqueue", $message_options);
} catch(ServiceException $e){
  $code = $e->getCode();
  $error_message = $e->getMessage();
  echo $code.": ".$error_message."<br />";
}

$messages = $peekMessagesResult->getQueueMessages();

// View messages.
$messageCount = count($messages);
if($messageCount <= 0){
  echo "There are no messages.<br />";
}
else{
  foreach($messages as $message)  {
    echo "Peeked message:<br />";
    echo "Message Id: ".$message->getMessageId()."<br />";
    echo "Date: ".date_format($message->getInsertionDate(), 'Y-m-d')."<br />";
    echo "Message text: ".$message->getMessageText()."<br /><br />";
  }
}

删除下一个消息

您的代码通过两个步骤从队列中删除消息。首先,您调用QueueRestProxy->listMessages,这使得消息对从队列中读取的其他代码不可见。默认情况下,此消息将保持不可见30秒(如果在此时段内未删除该消息,则它将再次成为队列上的可见消息)。要完成从队列中删除消息,您必须调用QueueRestProxy->deleteMessage

// Get message.
$listMessagesResult = $queueRestProxy->listMessages("myqueue");
$messages = $listMessagesResult->getQueueMessages();
$message = $messages[0];

// Process message

// Get message Id and pop receipt.
$messageId = $message->getMessageId();
$popReceipt = $message->getPopReceipt();

try {
  // Delete message.
  $queueRestProxy->deleteMessage("myqueue", $messageId, $popReceipt);
} catch(ServiceException $e){
  $code = $e->getCode();
  $error_message = $e->getMessage();
  echo $code.": ".$error_message."<br />";
}

服务总线队列

当前的PHP服务总线API仅支持ACS连接字符串。您目前需要使用PowerShell创建新的ACS服务总线命名空间。首先,确保您已安装Azure PowerShell,然后在PowerShell命令提示符中运行

Add-AzureAccount # this will sign you in
New-AzureSBNamespace -CreateACSNamespace $true -Name 'mytestbusname' -Location 'West US' -NamespaceType 'Messaging'

如果成功,您将在PowerShell输出中获得连接字符串。如果您使用它时出现连接错误,并且连接字符串看起来像Endpoint=sb://...,请将其更改为Endpoint=https://...

创建队列

try {
  $queueInfo = new QueueInfo("myqueue");

  // Create queue.
  $serviceBusRestProxy->createQueue($queueInfo);
} catch(ServiceException $e){
  $code = $e->getCode();
  $error_message = $e->getMessage();
  echo $code.": ".$error_message."<br />";
}

错误代码和消息

发送消息

要将消息发送到服务总线队列,您的应用程序将调用ServiceBusRestProxy->sendQueueMessage方法。发送到(和从)服务总线队列的消息是BrokeredMessage类的实例。

try {
  // Create message.
  $message = new BrokeredMessage();
  $message->setBody("my message");

  // Send message.
  $serviceBusRestProxy->sendQueueMessage("myqueue", $message);
} catch(ServiceException $e){
  $code = $e->getCode();
  $error_message = $e->getMessage();
  echo $code.": ".$error_message."<br />";
}

接收消息

从队列接收消息的主要方法是使用 ServiceBusRestProxy->receiveQueueMessage 方法。消息可以以两种不同的模式接收:ReceiveAndDelete(在读取时标记消息为已消费)和 PeekLock(锁定消息一段时间,但不删除)。

以下示例演示了如何使用 PeekLock 模式(非默认模式)接收和处理消息。

try {
  // Set the receive mode to PeekLock (default is ReceiveAndDelete).
  $options = new ReceiveMessageOptions();
  $options->setPeekLock(true);

  // Receive message.
  $message = $serviceBusRestProxy->receiveQueueMessage("myqueue", $options);
  echo "Body: ".$message->getBody()."<br />";
  echo "MessageID: ".$message->getMessageId()."<br />";

  // *** Process message here ***

  // Delete message.
  $serviceBusRestProxy->deleteMessage($message);
} catch(ServiceException $e){
  $code = $e->getCode();
  $error_message = $e->getMessage();
  echo $code.": ".$error_message."<br />";
}

服务总线主题

创建一个主题

try {
  // Create topic.
  $topicInfo = new TopicInfo("mytopic");
  $serviceBusRestProxy->createTopic($topicInfo);
} catch(ServiceException $e){
  $code = $e->getCode();
  $error_message = $e->getMessage();
  echo $code.": ".$error_message."<br />";
}

使用默认(MatchAll)过滤器创建订阅

try {
  // Create subscription.
  $subscriptionInfo = new SubscriptionInfo("mysubscription");
  $serviceBusRestProxy->createSubscription("mytopic", $subscriptionInfo);
} catch(ServiceException $e){
  $code = $e->getCode();
  $error_message = $e->getMessage();
  echo $code.": ".$error_message."<br />";
}

向主题发送消息

发送到服务总线主题的消息是 BrokeredMessage 类的实例。

try {
  // Create message.
  $message = new BrokeredMessage();
  $message->setBody("my message");

  // Send message.
  $serviceBusRestProxy->sendTopicMessage("mytopic", $message);
} catch(ServiceException $e){
  $code = $e->getCode();
  $error_message = $e->getMessage();
  echo $code.": ".$error_message."<br />";
}

从主题接收消息

从订阅接收消息的主要方法是使用 ServiceBusRestProxy->receiveSubscriptionMessage 方法。接收到的消息可以在两种不同的模式下工作:ReceiveAndDelete(默认模式)和与服务总线队列类似的 PeekLock

以下示例演示了如何使用 ReceiveAndDelete 模式(默认模式)接收和处理消息。

try {
  // Set receive mode to PeekLock (default is ReceiveAndDelete)
  $options = new ReceiveMessageOptions();
  $options->setReceiveAndDelete();

  // Get message.
  $message = $serviceBusRestProxy->receiveSubscriptionMessage("mytopic",
                                "mysubscription",
                                $options);
  echo "Body: ".$message->getBody()."<br />";
  echo "MessageID: ".$message->getMessageId()."<br />";
} catch(ServiceException $e){
  $code = $e->getCode();
  $error_message = $e->getMessage();
  echo $code.": ".$error_message."<br />";
}

需要帮助?

提出问题。

贡献代码或提供反馈

有关设置开发的说明信息,请参阅 develop.md

如果您在库中遇到任何错误,请在该项目的 问题 部分提出问题。

了解更多

Microsoft Azure 服务总线