Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/azure/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何访问Azure订阅上的死信子队列?_Azure_Azure Servicebus Queues - Fatal编程技术网

如何访问Azure订阅上的死信子队列?

如何访问Azure订阅上的死信子队列?,azure,azure-servicebus-queues,Azure,Azure Servicebus Queues,当我使用以下命令时: var deadLetterPath=SubscriptionClient.FormatDeadLetterPath(topicPath,subName); var client=SubscriptionClient.CreateFromConnectionString(connectionString,deadLetterPath,subName); 我有一个病残手术例外 无法在子队列上直接创建客户端。在服务器上创建客户端 主队列,并使用该队列在相应的 子队列 azur

当我使用以下命令时:

var deadLetterPath=SubscriptionClient.FormatDeadLetterPath(topicPath,subName);
var client=SubscriptionClient.CreateFromConnectionString(connectionString,deadLetterPath,subName);
我有一个病残手术例外

无法在子队列上直接创建客户端。在服务器上创建客户端 主队列,并使用该队列在相应的 子队列


azure文档的某些部分表示使用SubscriptionClient.CreateReceiver访问子队列,但该方法不存在

这种方法对你有效吗

MessagingFactory工厂=MessagingFactory.CreateFromConnectionString(cnxString);
var deadLetterPath=SubscriptionClient.FormatDeadLetterPath(topicPath,subName);
var dlqReceiver=factory.CreateMessageReceiver(死信路径,ReceiveMode.ReceiveAndDelete);
我没有在这里(在会议上)测试它,但是试一下


干杯

使用Azure服务总线为死信队列命名有一个约定:

  • 对于服务总线队列:queuePath/$DeadLetterQueue
  • 服务总线订阅:topicPath/subscriptionName/$DeadLetterQueue
因此,您可以像访问队列一样访问死信队列

从@SamVanhoutte answer可以看出,ServiceBus框架提供了格式化死信队列名称的方法:

  • 对于服务总线队列:
    QueueClient.FormatDeadLetterPath(queuePath)

  • 对于服务总线订阅:
    SubscriptionClient.FormatDeadLetterPath(topicPath,subscriptionName)

我编写了两个小方法来创建队列和订阅的消息接收器,您可以在其中设置是否需要交易信队列:

//
///使用指定的服务总线队列路径创建新对象。
/// 
///用于访问所需服务命名空间的连接字符串。
///服务总线队列路径。
///如果所需路径是死信队列,则为True。
公共静态MessageReceiver CreateMessageReceiver(字符串连接字符串、字符串队列路径、,
bool isDeadLetter=false)
{
返回MessagingFactory.CreateFromConnectionString(connectionString)
.CreateMessageReceiver(isDeadLetter
?QueueClient.FormatDeadLetterPath(queuePath)
:队列路径);
}
/// 
///使用指定的服务总线主题订阅路径创建新对象。
/// 
///用于访问所需服务命名空间的连接字符串。
///服务总线主题路径。
///服务总线主题订阅名称。
///如果所需路径是死信子队列,则为True。
公共静态MessageReceiver CreateMessageReceiver(字符串连接字符串、字符串主题路径、,
字符串subscriptionName,bool isDeadLetter=false)
{
返回MessagingFactory.CreateFromConnectionString(connectionString)
.CreateMessageReceiver(isDeadLetter
?SubscriptionClient.FormatDeadLetterPath(主题路径,subscriptionName)
:SubscriptionClient.FormatSubscriptionPath(topicPath,subscriptionName));
}

如果您使用的是
Microsoft.Azure.ServiceBus
而不是
Microsoft.ServiceBus
,则略有不同

var deadQueuePath = EntityNameHelper.FormatDeadLetterPath(your_queue_name);
var deadQueueReceiver = new MessageReceiver(connectionString, deadQueuePath);
根据
Microsoft.Azure.ServiceBus
命名空间中的
EntityNameHelper
类,对于主题,请使用订阅路径而不是您的队列名称

队列的名称或订阅的路径

//
///格式化队列或订阅的死信路径。
/// 
///队列的名称或订阅的路径。
///作为死信实体字符串的路径。
公共静态字符串格式DeadLetterPath(字符串entityPath)
{
返回EntityNameHelper.FormatSubQueuePath(entityPath,EntityNameHelper.DeadLetterQueueName);
}

那些想用python实现的人

从死信队列接收消息:

from azure.servicebus import ServiceBusClient
import json
connectionString = "Your Connection String to Service Bus"
serviceBusClient = ServiceBusClient.from_connection_string(connectionString)
queueName = "Your Queue Name created in the Service Bus"
queueClient = serviceBusClient.get_queue(queueName)
with queueClient.get_deadletter_receiver(prefetch=5) as queueReceiver:
    messages = queueReceiver.fetch_next(timeout=100)
    for message in messages:
        # message.body is a generator object. Use next() to get the body.
        body = next(message.body)
        message.complete()

希望它对某人有所帮助。

使用最新的Service Bus客户端库,您可以像这样访问死信队列。请注意,在创建接收方时,在指定死信队列时,跨语言的一致性:

const{ServiceBusClient}=require(@azure/servicebus”);
const client=new ServiceBusClient(“”);
const deadletterReceiver=client.createReceiver(“queueName”,{subQueueType:“deadLetter”});
const messages=等待死信接收者。receiveMessages(1);
如果(messages.length>0){
console.log(“接收到来自DLQ-”的消息,消息[0].body);
//将消息标记为完成,即从DLQ中删除
等待deadletterReceiver.completeMessage(消息[0]);
}否则{
log(“错误:没有收到来自DLQ的消息。”);
}
等待deadletterReceiver.close();
导入com.azure.messaging.servicebus.*;
导入com.azure.messaging.servicebus.models.SubQueue;
ServiceBusReceiver客户端死信接收器=新ServiceBusClientBuilder()
.connectionString(“”)
.receiver()//将其用于会话或未启用会话的队列或主题/订阅
.queueName(“queueName”)
.子队列(子队列.死信队列)
.buildClient();
IterableStream messages=接收方接收消息(10);
messages.forEach(message->{
System.out.printf(“Id:%s.内容:%s%n”,message.getMessageId(),
message.getBody().toString());
//从DLQ中删除消息
deadletterReceiver.完成(消息);
});
deadletterReceiver.close();
导入异步IO
从azure.servicebus导入ServiceBusMessage,ServiceBusSubQueue
从azure.servicebus.aio导入ServiceBusClient
servicebus\u client=ServiceBusClient.from\u connection\u字符串(conn\u str=”“)
dlq\u receiver=servicebus\u client.get\u queue\u receiver(queue\u name=“queuename”,
子队列=服务总线子队列。死信)
与dlq_接收器异步:
from azure.servicebus import ServiceBusClient
import json
connectionString = "Your Connection String to Service Bus"
serviceBusClient = ServiceBusClient.from_connection_string(connectionString)
queueName = "Your Queue Name created in the Service Bus"
queueClient = serviceBusClient.get_queue(queueName)
with queueClient.get_deadletter_receiver(prefetch=5) as queueReceiver:
    messages = queueReceiver.fetch_next(timeout=100)
    for message in messages:
        # message.body is a generator object. Use next() to get the body.
        body = next(message.body)
        message.complete()