我遵循nodejs示例here来检索发送到死信队列的消息。我以这种方式向Q推死信:
await brokeredMessage.deadLetter({
deadletterReason: 'bad',
deadLetterErrorDescription: 'too bad, so sad.',
});
我确实看到Azure中死信计数为2。无论这些是由于我上面的死信代码而导致的,还是其他一些事故导致的消息都是死信,我在DLQ中有2个。但是我无法检索它们:
const client = ns.createQueueClient(queueName);
const receiver = client.getReceiver();
const sender = client.getSender();
const messages = await receiver.receiveBatch(100);
if (messages.length > 0) {
for (let i = 0; i < messages.length; i += 1) { ... }
} else {
// I ALWAYS GET HERE.
}
我究竟做错了什么?没有错误。为什么我不能读取DLQ并检索那里的2个项目?队列名称是否像对于有害消息一样改变?我在发送,deadlettering和尝试读取DLQ时使用相同的queuename。
我相信你需要将/$DeadLetterQueue
附加到你的队列名称。所以const deadLetterQueueName = queueName + "/$DeadLetterQueue";
请参阅azure-sdk-for-node repo上的this GitHub issue。
尝试使用
const client = ns.CreateQueueClient(QueueClient.FormatDeadLetterPath(queueName));
由于您的所有消息都在死信队列中,因此您可以通过为队列的死信结束创建消息接收器来接收来自死信路径的消息