2014-02-03 1 views
2

Я пытаюсь взаимодействовать с Azure Queue с использованием REST прокси любезность Windows Azure SDK for PHP. Хотя есть много примеров кода here, Я хочу проверить, существует ли очередь, чтобы я мог создать ее, если необходимо, перед добавлением к ней сообщения.Проверьте Azure Queue существует с использованием REST прокси (PHP)

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); 

Должен ли я просто включить код создания очереди до создания сообщения или есть более эффективный способ определить, является ли очереди существует, прежде чем взаимодействовать с ним?

ответ

1

Я опубликовал ответ ниже для полноты и облегчил людям возможность увидеть ответ с первого взгляда.

Должен ли я просто включить код создания очереди до создания сообщения или есть более эффективный способ выяснить, существует ли очереди до взаимодействия с ним?

Есть два способа подойти к этому ...

  1. Включите createQueue заявление Перед созданием сообщения, но обернуть это утверждение в try-catch блоке по указанию Guarav Mantri's answer т.е. игнорировать 409 ошибок, но генерирует исключение для любых других типов ошибок.

    Для получения дополнительной информации, когда вы включаете createQueue заявления перед созданием сообщения ...

    • , если очередь с тем же именем уже существует и метаданных , связанных с существующей очередью : то же самое, что и инструкция createQueue, тогда очередь не будет создана, а Queue REST Pro xy внутренне получит код состояния (без содержимого), но этот код ответа не предоставляется программисту.Таким образом, по существу, оператор createQueue не вызывает ошибки/исключения , которые должны быть подняты в этом сценарии.

    • , если очередь с тем же именем уже существует и метаданные , связанные с существующей очереди не то же самое, что прошло к createQueue заявления, то очередь не будет и Прокси-сервер Очереди REST получит код состояния (Conflict) и поднимет исключение , которое позволяет программисту получить доступ к этому коду ответа и связанному с ним сообщению 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;   
    } 
    

Надеется, что это помогает кто-то!

1

Обычно в других SDK для Windows Azure я видел такие методы, как 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. Я не пытался выполнить код, поэтому он может вызывать ошибки. Это просто для того, чтобы дать вам представление.

+0

@Guarav - спасибо за ваш ответ. После некоторого тестирования кажется, что несколько последовательных вызовов createQueue (QUEUE_NAME) не вызывают выброса ServiceException, поэтому кажется, что внутренние интерфейсы Azure обрабатывают это молча. Возможно, поэтому они не публикуют методы createQueueIfNotExists или queueExists в SDK. – w5m

+0

Я так не думаю. Кроме того, все остальные SDK имеют эту функцию. См. Здесь .Net: http://msdn.microsoft.com/en-us/library/windowsazure/microsoft.windowsazure.storage.queue.cloudqueue.createifnotexists.aspx. Все SDK являются оберткой над REST API, поэтому я не думаю, что это причина. –

+0

По общему признанию, мое наблюдение не согласуется с разделом «Замечания» на странице «Создать интерфейс REST API» (http://msdn.microsoft.com/en-us/library/windowsazure/dd179342.aspx), который соответствует ваш ответ, т. е. возвращается 409, если очередь существует с несогласованными метаданными, возвращается 204, если существует очередь с соответствующими метаданными. Тем не менее, я не вижу реальности этих кодов ответов, поскольку исключение не выбрасывается. – w5m

Смежные вопросы