使用REST代理检查Azure队列是否存在(PHP)

时间:2014-02-03 21:22:03

标签: php azure azure-storage azure-storage-queues

我正在尝试使用REST代理与Azure队列进行交互 Windows Azure SDK for PHP 。虽然有很多代码示例 here ,但我想检查一个队列是否存在,以便在必要时创建它,然后再向其中添加消息

try {
  // setup connection string for accessing queue storage
  $connectionString = 'DefaultEndpointsProtocol=' . PROTOCOL . ';AccountName=' . ACCOUNT_NAME . ';AccountKey=' . ACCOUNT_KEY;

  // create queue REST proxy
  $queueRestProxy = ServicesBuilder::getInstance()->createQueueService($connectionString);

  // create message
  $queueRestProxy->createMessage(QUEUE_NAME, 'Hello World!');

} catch(ServiceException $e){
  // Handle exception based on error codes and messages.
  // Error codes and messages are here: 
  // http://msdn.microsoft.com/en-us/library/windowsazure/dd179446.aspx
  $code = $e->getCode();
  $error_message = $e->getMessage();
  echo $code.": ".$error_message."<br />";
}

创建队列就像这样简单......

$queueRestProxy->createQueue(QUEUE_NAME);

我是否应该在创建消息之前简单地包含队列创建代码,还是在与之交互之前确定队列是否存在更有效的方法?

2 个答案:

答案 0 :(得分:1)

通常在其他Windows Azure SDK中,我见过像createQueueIfNotExists这样的方法,我很惊讶PHP SDK中缺少这种方法。基本上这个函数的工作方式是它尝试创建一个队列。如果存储中存在同名队列,则存储服务会引发Conflict (409)错误。

由于此函数不存在,您可以执行相同的操作,即尝试在其自己的try / catch块中创建队列并检查错误代码。如果错误代码为409,则继续,否则您将重新抛出异常。类似下面的代码:

try {
  // setup connection string for accessing queue storage
  $connectionString = 'DefaultEndpointsProtocol=' . PROTOCOL . ';AccountName=' . ACCOUNT_NAME . ';AccountKey=' . ACCOUNT_KEY;
    // create queue REST proxy
        $queueRestProxy = ServicesBuilder::getInstance()->createQueueService($connectionString);
  try {
    // now try to create the queue.
$queueRestProxy->createQueue(QUEUE_NAME);
  } catch(ServiceException $e){
    $code = $e->getCode();
    //Now check if the $code is 409 - Conflict. If the error code is indeed 409, you continue otherwise throw the error
  }
  // create message
  $queueRestProxy->createMessage(QUEUE_NAME, 'Hello World!');

} catch(ServiceException $e){
  // Handle exception based on error codes and messages.
  // Error codes and messages are here: 
  // http://msdn.microsoft.com/en-us/library/windowsazure/dd179446.aspx
  $code = $e->getCode();
  $error_message = $e->getMessage();
  echo $code.": ".$error_message."<br />";
}

P.S。我没有尝试执行代码,因此可能会抛出错误。这只是为了给你一个想法。

答案 1 :(得分:1)

我在下面发布了一个完整性答案,让人们一眼就能看到答案。

  

我应该在创建之前简单地包含队列创建代码   消息还是有更有效的方法来确定是否   队列在与之交互之前是否存在?

有两种方法可以解决这个问题......

  1. 在创建消息之前包含createQueue语句,但是按照Guarav Mantri's answer的指示将此语句包装在try-catch块中,即忽略409错误,但抛出异常任何其他类型的错误。

    有关信息,请在创建消息之前添加createQueue语句...

    • 如果已存在同名队列 元数据 与现有队列 相关联的 与传递给的队列相同 createQueue语句然后将不会创建队列和 队列REST代理将在内部接收 204 (无内容)状态代码,但是这样 响应代码不可供程序员使用。所以, 基本上,createQueue语句不会导致 在这种情况下会引发错误/异常。

    • 如果已存在同名队列 元数据 与现有队列 相关联的 与传递的队列相同 在createQueue语句中,将不会创建队列 队列REST代理将收到 409 (冲突)状态代码并将引发 允许程序员访问此响应代码和相关QueueAlreadyExists消息的异常。

    来源:Create Queue (REST API) - 请参阅备注部分

  2. 创建一个queueExists函数并调用它来决定是否需要创建队列。以下是实现此类功能的一种方法......

    public function queueExists($queueRestProxy, $queueName) {
      $result = FALSE;
      $listQueuesResult = $queueRestProxy->listQueues();
      $queues = $listQueuesResult->getQueues();
      foreach($queues as $queue) {
        if ($queue->getName() === $queueName) {
          $result = TRUE;
          break;
        }
      }
      return $result;        
    }
    
  3. 希望这有助于某人!