【问题标题】:Abandon() in azure service bus method makes a specific message to dead letter queueazure 服务总线方法中的 Abandon() 将特定消息发送到死信队列
【发布时间】:2019-09-27 05:07:00
【问题描述】:

我是 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);

下面是运行发布appenter image description here后的截图

运行订阅者应用程序后的以下屏幕截图。enter image description here

我的问题是,当我调用放弃方法时,为什么消息会发送到 deadletter 。我不能让特定消息放弃或自动完成为 false。这样该消息将在队列中可用。

谢谢。

【问题讨论】:

    标签: java azure azureservicebus


    【解决方案1】:

    只需替换为以下一个

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

    【讨论】:

      【解决方案2】:

      看起来像预期的行为。当您放弃一条消息时,传递计数增加 1,并且消息在队列中再次可用以进行处理。但是,如果您继续放弃一条消息,则传递计数将达到最大限制(从您的屏幕截图中为 10),然后消息将移动到死信队列。

      为了更好地了解交易信队列中的消息以及失败的原因。您可以在服务总线资源管理器中执行此操作。

      【讨论】:

        猜你喜欢
        • 2020-01-11
        • 1970-01-01
        • 2012-08-28
        • 1970-01-01
        • 1970-01-01
        • 2022-12-19
        • 2018-04-01
        • 2017-02-13
        • 2017-06-07
        相关资源
        最近更新 更多