Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/373.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
如何使用Java将错误消息移动到Azure死信队列(主题-订阅)?_Java_Azure_Servicebus_Azure Servicebus Topics_Dead Letter - Fatal编程技术网

如何使用Java将错误消息移动到Azure死信队列(主题-订阅)?

如何使用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

我需要将我的邮件从azure主题订阅发送到死信队列,以防在读取和处理来自主题的邮件时出错。所以我试着直接将消息推送到DLQ

我的示例代码如下

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)),
执行人服务);