簡體   English   中英

azure 服務總線方法中的 Abandon() 將特定消息發送到死信隊列

[英]Abandon() in azure service bus method makes a specific message to dead letter queue

我是 azure 服務總線的新手,我正在使用 java sdk 開發一個示例發布/訂閱應用程序。 在本練習中,我想要實現的是將 50 條消息 (json) 發布到隊列中,這些消息的格式如下。

[{'lastname'='test0','firstName'='success0'}...'lastname'='test49','firstName'='success49'}]

在第 25 條消息的接收方應用程序中,我希望放棄此消息,因此第 25 條消息將在隊列中可用。 但是當我運行應用程序時,所有 49 條消息都完成了,並且一條消息進入了死信隊列。 我得到了以下異常。

Either receive link to 'asb.java.pub' closed with a transient error and reopened or the delivery was already settled by complete/abandon/defer/deadletter.
2019-05-09 06:17:19 ERROR MessageAndSessionPump:241 - Completing message with sequence number '5002' failed
java.lang.IllegalArgumentException: Delivery not found on the receive link.
    at com.geico.messaging.servicebus.primitives.CoreMessageReceiver.generateDeliveryNotFoundException(CoreMessageReceiver.java:1319)
    at com.geico.messaging.servicebus.primitives.CoreMessageReceiver.updateMessageStateAsync(CoreMessageReceiver.java:1161)
    at com.geico.messaging.servicebus.primitives.CoreMessageReceiver.completeMessageAsync(CoreMessageReceiver.java:1046)
    at com.geico.messaging.servicebus.MessageReceiver.lambda$3(MessageReceiver.java:267)
    at java.util.concurrent.CompletableFuture.uniComposeStage(Unknown Source)
    at java.util.concurrent.CompletableFuture.thenCompose(Unknown Source)
    at com.geico.messaging.servicebus.MessageReceiver.completeAsync(MessageReceiver.java:262)
    at com.geico.messaging.servicebus.MessageReceiver.completeAsync(MessageReceiver.java:255)
    at com.geico.messaging.servicebus.MessageAndSessionPump.lambda$6(MessageAndSessionPump.java:220)
    at java.util.concurrent.CompletableFuture.uniHandle(Unknown Source)
    at java.util.concurrent.CompletableFuture$UniHandle.tryFire(Unknown Source)
    at java.util.concurrent.CompletableFuture$Completion.run(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)

.這是我的發布代碼

ConnectionStringBuilder connectionResolver = new ConnectionStringBuilder(connectionString, "asb.java.pub");     
QueueClient sendClient = new QueueClient(connectionResolver,ReceiveMode.PEEKLOCK);
for(int i =0;i<50;i++){Message message = new Message("{'lastname' = 'test"+i+"', 'firstName' ='success"+i+"'}");
message.setLabel("name");sendClient.send(message);}sendClient.close();

這是我的訂閱者代碼

IMessageHandler ih=new IMessageHandler() {              
public CompletableFuture<Void> onMessageAsync(IMessage message)   {
byte[] body = message.getBody();                    
Map map = GSON.fromJson(new String(body, UTF_8), Map.class);    
try{                        if(map.get("lastname").equals("test25")){                       return receiveClient.abandonAsync(message.getLockToken());
;
}catch(Exception e){                        e.printStackTrace();                        
}
CompletableFuture.completedFuture(null);
}
public void notifyException(Throwable throwable, ExceptionPhase exceptionPhase) {
                    System.out.printf(exceptionPhase + "-" + throwable.getMessage());
}
};

            receiveClient.registerMessageHandler(ih, executorService);

以下是運行發布應用程序后的屏幕截圖,請在此處輸入圖片說明

運行訂閱者應用程序后的以下屏幕截圖。 在此處輸入圖片說明

我的問題是當我調用放棄方法時,為什么消息會轉到死信。 我不能制作一個特定的消息來放棄或自動完成 false.So 該消息將在隊列中可用。

謝謝你。

看起來像預期的行為。 當您放棄一條消息時,傳遞計數增加 1,並且消息在隊列中再次可用以進行處理。 但是,如果您繼續放棄消息,則傳遞計數將達到最大限制(從您的屏幕截圖中為 10),然后消息將移至死信隊列。

為了更好地了解交易信函隊列中的消息及其失敗的原因。 您可以在服務總線資源管理器中執行此操作。

只需用下面的替換

 receiveClient.registerMessageHandler(ih, new MessageHandlerOptions(1,true, Duration.ofMinutes(1)),executorService);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM