我有一个用例,当前队列长度低于指定值时,我需要对选定数量的消息进行排队。由于我在Azure中运行,我正在尝试使用RetrieveApproximateMessageCount()
方法来获取当前的消息计数。每当我打电话给我时,我都会得到一个说明StorageClientException: The specified queue does not exist.
的例外情况。以下是对我所做的事情的回顾:
在门户网站中创建了队列,并成功将消息排入其中。
在门户网站中创建了存储帐户,它处于创建/在线状态
按如下方式对查询进行编码(使用http和https选项):
var storageAccount = new CloudStorageAccount(
new StorageCredentialsAccountAndKey(_messagingConfiguration.StorageName.ToLower(),
_messagingConfiguration.StorageKey), false);
var queueClient = storageAccount.CreateCloudQueueClient();
var queue = queueClient.GetQueueReference(queueName.ToLower());
int messageCount;
try
{
messageCount = queue.RetrieveApproximateMessageCount();
}
catch (Exception)
{
//Booom!!!!! in every case
}
// ApproximateMessageCount is always null
messageCount = queue.ApproximateMessageCount == null ? 0 : queue.ApproximateMessageCount.Value;
我已经确认名称是正确的,没有特殊的字符,数字或空格,结果显示queue
Url,好像它是根据API文档正确形成的(例如{ {3}} )
任何人都可以帮助我了解我做错了什么。
修改
我已经确认使用MessageFactory
我可以创建QueueClient
,然后成功排队/取消队列消息。当我使用CloudStorageAccount
时,队列永远不存在,因此计数和GetMessage例程永远不会起作用。我猜这些不是一回事???假设,我是对的,我需要的是测量服务总线队列的长度。这可能吗?
答案 0 :(得分:45)
不推荐使用RetrieveApproximateMessageCount()
如果你想使用ApproximateMessageCount来获得结果,试试这个
CloudQueue q = queueClient.GetQueueReference(QUEUE_NAME);
q.FetchAttributes();
qCnt = q.ApproximateMessageCount;
答案 1 :(得分:0)
不推荐使用CloudQueue方法(与v11 SDK一起使用)。
以下代码段是当前替换代码(来自Azure Docs)
//-----------------------------------------------------
// Get the approximate number of messages in the queue
//-----------------------------------------------------
public void GetQueueLength(string queueName)
{
// Get the connection string from app settings
string connectionString = ConfigurationManager.AppSettings["StorageConnectionString"];
// Instantiate a QueueClient which will be used to manipulate the queue
QueueClient queueClient = new QueueClient(connectionString, queueName);
if (queueClient.Exists())
{
QueueProperties properties = queueClient.GetProperties();
// Retrieve the cached approximate message count.
int cachedMessagesCount = properties.ApproximateMessagesCount;
// Display number of messages.
Console.WriteLine($"Number of messages in queue: {cachedMessagesCount}");
}
}