我知道有一种方法可以确定Azure队列(存储帐户)中的邮件数量(或近似数量); 但有没有办法查询Azure Service Bus队列中的待处理消息数?
我一直在研究Azure服务总线队列(非 Azure存储队列).我读过的所有细节都表明它支持FIFO语义,但仅限于"消息传递会话"的上下文.问题是我似乎无法找到有关Azure上下文中究竟是什么的任何信息.这是一个WCF构造,还是特定于Azure Service Bus的东西?我认为它与本地交易无关,但我并非百分之百确定.
任何指针都会非常有用.谢谢!
我有这个Queue Trigger
。预期是当我在 中插入一条消息时Queue
,触发器必须触发并处理出队的消息。
[FunctionName("NewPayrollQueueTrigger")]
public async static void Run([QueueTrigger("myqueue", Connection =
"AzureWebJobsStorage")]string myQueueItem,
[DurableClient] IDurableOrchestrationClient starter,
ILogger log)
{
log.LogInformation($"C# Queue trigger function processed: {myQueueItem}");
await starter.StartNewAsync("NewPayrollOrchestrator", input: myQueueItem);
}
Run Code Online (Sandbox Code Playgroud)
触发器正在正常激活,但这种奇怪的行为正在发生。该函数显然希望message
以Base-64
.
异常绑定参数 'myQueueItem' <--- 输入不是有效的 Base-64 字符串,因为它包含非 base-64 字符、两个以上的填充字符或填充字符中的非法字符。
I'm sending messages to the queue using this method from the Azure Queue
library v.12 from Azure.Storage.Queues
and found no overloads that encodes the message to Base-64
.
Note that _queue
is a …
我是否理解正确,在 Windows Azure 队列存储中,一条消息最多可以保留 7 天?
7 天后消息会怎样?
如果您在 7 天内阅读了一次邮件并且没有删除它,会发生什么情况?我的意思是您从队列中读取消息并将可见性超时设置为 1 分钟。在您阅读消息(未删除)并且 1 分钟超时可见性到期后会发生什么?我知道它又回来了并且可以在队列中使用,但是该消息的 7 天 TTL 会发生什么,是从该点更新到 7 天,还是从消息创建后整整 7 天?
我无法将我的请求编码为 base64,根据文档,我不应该这样做,但我无法弄清楚。
如果我 Base64 编码它工作正常:
<QueueMessage>
<MessageText>PHNhbXBsZT5zYW1wbGUgbWVzc2FnZTwvc2FtcGxlPg==</MessageText>
</QueueMessage>
Run Code Online (Sandbox Code Playgroud)
将解码后的消息添加到队列中:
<sample>sample message</sample>
Run Code Online (Sandbox Code Playgroud)
根据文档(https://msdn.microsoft.com/sv-se/library/azure/dd179346.aspx)
消息的格式必须可以包含在使用 UTF-8 编码的 XML 请求中。要在消息中包含标记,消息的内容必须是 XML 转义的或 Base64 编码的。在将消息添加到队列之前,将删除消息中未转义或编码的任何 XML 标记。
尝试添加(而不是 PHNhbXBsZT5zYW1wbGUgbWVzc2FnZTwvc2FtcGxlPg==):
<sample>sample message</sample>
Run Code Online (Sandbox Code Playgroud)
成功,但当尝试查看队列中的消息时,它只响应:
输入不是有效的 Base-64 字符串,因为它包含非 Base-64 字符、两个以上的填充字符或填充字符中的非法字符。
有人知道如何将正确的原始 xml 转义请求消息发送到存储队列吗?
完整请求(无键和名称):
POST https://xxxxxxx.queue.core.windows.net/testqueue/messages?sv=2015-04-05&ss=q&srt=sco&sp=a&se=2026-11-11T20:24:03Z&st=2016-11-11T12:24:03Z&spr=https&sig=xxxxxxxxxxxxxxxxx%3D HTTP/1.1
User-Agent: Fiddler
Host: XXXXX.queue.core.windows.net
Content-Type: text/plain
Content-Length: 64
<QueueMessage>
<MessageText><sample>sample message</sample></MessageText>
</QueueMessage>
Run Code Online (Sandbox Code Playgroud) 我有一个简单的存储队列设置,我也在添加消息。
这些消息由 Azure 函数接收,但处理失败。
Showing 0 of 3 messages in queue
Run Code Online (Sandbox Code Playgroud)
为什么我在存储资源管理器中看不到“失败”消息?
我第一次使用 JMS 和队列(Azure 队列)。我需要创建一个队列,Rubi 服务器将在其中写入一些数据,Java 将从队列中读取它并进行进一步的执行。这个过程在我的机器上本地运行良好。我创建了一个 REST 端点,它在队列中写入数据,一旦数据写入队列,侦听器将接管并读取数据并执行。当我们将它部署到 Azure 时,我在日志中看到的错误是不让队列启动
Setup of JMS message listener invoker failed for destination 'queue' - trying to recover. Cause: Identifier contains invalid JMS identifier character '-': 'x-request-id'
Run Code Online (Sandbox Code Playgroud)
Zipkin 也作为分布式跟踪系统出现在 Azure 服务器上,我猜这x-request-id
与产生问题的 Zipkin 有关。我在谷歌上搜索过这个问题,但不明白为什么会发生。
以下是详细的错误信息:
[36mc.m.s.l.NextGenRequestLoggingFilter [0;39m [2m:[0;39m
Before request [uri=/services/deal-service/api/v2/deals/ack;headers=
[x-request-id:"2d8d86d7-4fbf-9db6-8e95-28813f21a85c",
x-envoy-internal:"true", x-b3-parentspanid:"a209cdc649b0b890", content-
length:"575", x-forwarded-proto:"http", postman-token:"ad074595-
76a5-474b-9711-7e071b12b3b0", x-b3-sampled:"1", x-forwarded-
for:"10.244.2.1", accept:"*/*",
authorization: "some-token-YJc4tg--34jPRziJNSACqNQ", x-b3-
traceid:"6b40ff22781be67ba209cdc649b0b890", x-b3-
spanid:"702684ddb62cfe6b",
host:"portal-gateway.52.228.65.225.nip.io",
cache-control:"no-cache", accept-encoding:"gzip, deflate, br",
user-agent:"PostmanRuntime/7.22.0",
Content-Type:"application/xml;charset=UTF-8"]]
2020-02-18T15:19:34.197666458Z [2m2020-02-18 15:19:34.197[0;39m .
[32mDEBUG
[,6b40ff22781be67ba209cdc649b0b890,702684ddb62cfe6b,true][0;39m . …
Run Code Online (Sandbox Code Playgroud) 好的,所以我对消息排队感兴趣.我已经对这个问题进行了大量的研究.我读了'编程windows azure'(关于Azure Queues),我阅读了大量有关Azure服务总线的教程和信息,我观看了关于消息模式的9频道视频等.
但我不明白的是:如何在现实场景中使用它?所有示例只是将一个字符串或一个包含一些数据的对象放入队列中,并从"另一侧"的队列中读取它.但是,您如何知道如何处理这些数据?例如:我可以尝试将Customer,Order和Address保存到数据库中,因此我将这3个对象放在队列中以便在另一侧读取它们将它们放入我的数据库中.我怎么知道如何处理这些物体?
我只有一些问题:
我认为这是我头脑中嗡嗡作响的大部分问题.我希望有人能为我解决这个问题.
我有一个用例,当前队列长度低于指定值时,我需要对选定数量的消息进行排队.由于我在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;
Run Code Online (Sandbox Code Playgroud)我已经确认名称是正确的,没有特殊字符,数字或空格,并且生成的queue
Url看起来好像是基于API文档正确形成的(例如http://myaccount.queue.core.windows.net/myqueue)
任何人都可以帮助阐明我做错了什么.
编辑
我已经确认使用MessageFactory
我可以创建一个QueueClient
然后成功排队/出列消息.当我使用CloudStorageAccount
队列时从不存在,因此计数和GetMessage例程永远不会工作.我猜这些不是一回事??? 假设,我是对的,我需要的是测量服务总线队列的长度.那可能吗?
我需要一些帮助来理解azure CloudBlobClient,CloudQueueClient和CloudBlob类中的线程安全性.
我正在开发一个包含多个独立作业处理器的辅助角色,其中每个作业处理器从特定队列中读取并写入/更新到可能相同的某些blob容器.
我想确保这些工作处理器没有踩到彼此的脚趾.
1>如何在不使用任何锁的情况下确保是这种情况?如果我将单独的CloudBlobClient和CloudQueueClient分配给我的每个作业处理器(所有处理器都在同一个进程中),是否足以说它们彼此独立并且因为每个作业处理器使用单独的客户端实例,它们将无法运行互相进入?
2>在同一个作业处理器中,如果我尝试在CloudBlobClient上使用Parallel.ForEach并行调用GetBlobReference或UploadText并行,我是否需要合并某种同步或者这些方法是否安全?Azure文档说它们不是,但我在网上看到的大多数示例似乎都没有对这些方法应用任何类型的同步机制.实现这一目标的最佳方法是什么?我的意思是使用一个CloudBlobClient并在并行调用GetBlobReference或UploadText的最佳方法?