如何使用Java将错误消息移动到Azure死信队列(主题-订阅)?
我需要将我的邮件从azure主题订阅发送到死信队列,以防在读取和处理来自主题的邮件时出错。所以我试着直接将消息推送到DLQ 我的示例代码如下如何使用Java将错误消息移动到Azure死信队列(主题-订阅)?,java,azure,servicebus,azure-servicebus-topics,dead-letter,Java,Azure,Servicebus,Azure Servicebus Topics,Dead Letter,我需要将我的邮件从azure主题订阅发送到死信队列,以防在读取和处理来自主题的邮件时出错。所以我试着直接将消息推送到DLQ 我的示例代码如下 static void sendMessage() { // create a Service Bus Sender client for the queue ServiceBusSenderClient senderClient = new ServiceBusClientBuilder() .connectio
static void sendMessage()
{
// create a Service Bus Sender client for the queue
ServiceBusSenderClient senderClient = new ServiceBusClientBuilder()
.connectionString(connectionString)
.sender()
.topicName(topicName)
.buildClient();
// send one message to the topic
senderClient.sendMessage(new ServiceBusMessage("Hello, World!"));
}
static void resceiveAsync() {
ServiceBusReceiverAsyncClient receiver = new ServiceBusClientBuilder()
.connectionString(connectionString)
.receiver()
.topicName(topicName)
.subscriptionName(subName)
.buildAsyncClient();
// receive() operation continuously fetches messages until the subscription is disposed.
// The stream is infinite, and completes when the subscription or receiver is closed.
Disposable subscription = receiver.receiveMessages().subscribe(message -> {
System.out.printf("Id: %s%n", message.getMessageId());
System.out.printf("Contents: %s%n", message.getBody().toString());
}, error -> {
System.err.println("Error occurred while receiving messages: " + error);
}, () -> {
System.out.println("Finished receiving messages.");
});
// Continue application processing. When you are finished receiving messages, dispose of the subscription.
subscription.dispose();
// When you are done using the receiver, dispose of it.
receiver.close();
}
我尝试获取死信队列路径
String dlq = EntityNameHelper.formatDeadLetterPath(topicName);
我得到了死信队列的路径,如=“mytopic/$deadletterqueue”
但它在将路径作为主题名传递时不起作用。它引发实体主题未找到异常
有谁能告诉我这件事吗
参考:
您可能知道,如果在处理过程中抛出异常,并且超过了最大deliever计数,则消息将自动移动到死信队列。如果要显式地将消息移动到DLQ,也可以这样做。一种常见的情况是,如果您知道消息由于其内容而永远不会成功 您不能直接向DLQ发送新的消息,因为这样系统中会有两条消息。您需要对父实体调用特殊操作。另外,
/$deadletterqueue
不起作用,因为这将是所有订阅的DLQ。正确的实体路径如下所示:
<queue path>/$deadletterqueue
<topic path>/Subscriptions/<subscription path>/$deadletterqueue
/$deadletterqueue
/订阅/$deadletterqueue
此示例代码适用于队列,但您应该能够非常轻松地将其适应主题:
//注册RegisterMessageHandler回调
receiver.registerMessageHandler(
新的IMessageHandler(){
//当消息处理程序循环获得消息时调用回调
公共CompletableFuture onMessageAsync(IMessage消息){
//接收传递给回调函数的消息
如果(message.getLabel()!=null&&
message.getContentType()!=null&&
message.getLabel().contentEquals(“科学家”)&&
message.getContentType().contentEquals(“应用程序/json”)){
// ...
}否则{
返回receiver.deadLetterAsync(message.getLockToken());
}
返回receiver.completeAsync(message.getLockToken());
}
//当消息处理程序有异常要报告时调用回调
公共无效notifyException(可丢弃可丢弃,ExceptionPhase ExceptionPhase){
System.out.printf(exceptionPhase+“-”+throwable.getMessage());
}
},
//1个并发呼叫,消息自动完成,自动续订持续时间
新MessageHandlerOptions(1,false,持续时间为分钟(1)),
执行人服务);