我正在尝试使用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);
我是否应该在创建消息之前简单地包含队列创建代码,还是在与之交互之前确定队列是否存在更有效的方法?
答案 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)
我在下面发布了一个完整性答案,让人们一眼就能看到答案。
我应该在创建之前简单地包含队列创建代码 消息还是有更有效的方法来确定是否 队列在与之交互之前是否存在?
有两种方法可以解决这个问题......
在创建消息之前包含createQueue
语句,但是按照Guarav Mantri's answer的指示将此语句包装在try-catch
块中,即忽略409错误,但抛出异常任何其他类型的错误。
有关信息,请在创建消息之前添加createQueue
语句...
如果已存在同名队列 且 元数据
与现有队列 相关联的 与传递给的队列相同
createQueue
语句然后将不会创建队列和
队列REST代理将在内部接收 204 (无内容)状态代码,但是这样
响应代码不可供程序员使用。所以,
基本上,createQueue
语句不会导致
在这种情况下会引发错误/异常。
如果已存在同名队列 且 元数据
与现有队列 相关联的 与传递的队列相同
在createQueue
语句中,将不会创建队列
队列REST代理将收到 409 (冲突)状态代码并将引发
允许程序员访问此响应代码和相关QueueAlreadyExists
消息的异常。
来源:Create Queue (REST API) - 请参阅备注部分
创建一个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;
}
希望这有助于某人!