gpt4 book ai didi

java - Windows Azure : Error when deleting brokered message

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:12:55 24 4
gpt4 key购买 nike

我正在开发一个从 Azure 服务总线队列中提取消息的 Java 应用程序。我正在使用 Java Azure API (com.microsoft.windowsazure.services)。我遇到的问题是处理消息后删除代理消息有时会失败。

我的应用程序使用 ServiceBusContract 对象上的 receiveQueueMessage() 方法,使用 peek-lock 接收模式从队列中提取消息。成功处理消息后,我通过调用 deleteMessage() 方法从队列中删除消息(我相信此方法对应于 .NET API 中的 Complete() 方法)。

但是,有时此方法调用会失败。 com.sun.jersey.api.client.UniformInterfaceException 异常通过deleteMessage() 记录到控制台,它不会抛出此异常(我将生成下面的输出)。该异常似乎表明无法找到该消息。发生这种情况时,消息将保留在队列中。事实上,下一次调用 receiveQueueMessage() 会再次检索该消息。然后删除又失败一两次,然后就成功了。此后检索到的消息删除成功。

这是出现问题的代码:

ReceiveMessageOptions receiveOptions = ReceiveMessageOptions.DEFAULT; 
receiveOptions.setReceiveMode(ReceiveMode.PEEK_LOCK);
BrokeredMessage message = serviceBus.receiveQueueMessage("my_queue",receiveOptions).getValue();
// Process the message
System.out.println("Delete message with ID: "+message.getMessageId());
serviceBus.deleteMessage(message);

以下是出现问题时的输出示例:

Delete message with ID: 100790000086491
2013/01/22 12:58:29 com.microsoft.windowsazure.services.serviceBus.implementation.ServiceBusExceptionProcessor processCatch
WARNING: com.sun.jersey.api.client.UniformInterfaceException: DELETE https://voyagernetzmessaging.servicebus.windows.net/sms_queue/messages/24/efa56a1c-95e8-4cd6-931a-972eac21563a returned a response status of 404 Not Found
com.sun.jersey.api.client.UniformInterfaceException: DELETE https://voyagernetzmessaging.servicebus.windows.net/sms_queue/messages/24/efa56a1c-95e8-4cd6-931a-972eac21563a returned a response status of 404 Not Found
at com.sun.jersey.api.client.WebResource.voidHandle(WebResource.java:697)
at com.sun.jersey.api.client.WebResource.delete(WebResource.java:261)
at com.microsoft.windowsazure.services.serviceBus.implementation.ServiceBusRestProxy.deleteMessage(ServiceBusRestProxy.java:260)
at com.microsoft.windowsazure.services.serviceBus.implementation.ServiceBusExceptionProcessor.deleteMessage(ServiceBusExceptionProcessor.java:176)
at microworks.voyagernetzmessaging.smsservice.SmsSender$Runner.finalizeSms(SmsSender.java:114)
at microworks.voyagernetzmessaging.smsservice.SmsSender$Runner.finalizeSms(SmsSender.java:119)
at microworks.voyagernetzmessaging.smsservice.SmsSender$Runner.run(SmsSender.java:340)
com.microsoft.windowsazure.services.core.ServiceException: com.sun.jersey.api.client.UniformInterfaceException: DELETE https://voyagernetzmessaging.servicebus.windows.net/sms_queue/messages/24/efa56a1c-95e8-4cd6-931a-972eac21563a returned a response status of 404 Not Found
Response Body: <Error><Code>404</Code><Detail>The lock supplied is invalid. Either the lock expired, or the message has already been removed from the queue..TrackingId:4b112c5a-5919-4680-b6bb-e10a2c081ba3_G15_B9,TimeStamp:1/22/2013 10:58:30 AM</Detail></Error>
at com.microsoft.windowsazure.services.serviceBus.implementation.ServiceBusExceptionProcessor.deleteMessage(ServiceBusExceptionProcessor.java:179)
at microworks.voyagernetzmessaging.smsservice.SmsSender$Runner.finalizeSms(SmsSender.java:114)
at microworks.voyagernetzmessaging.smsservice.SmsSender$Runner.finalizeSms(SmsSender.java:119)
at microworks.voyagernetzmessaging.smsservice.SmsSender$Runner.run(SmsSender.java:340)
Caused by: com.sun.jersey.api.client.UniformInterfaceException: DELETE https://voyagernetzmessaging.servicebus.windows.net/sms_queue/messages/24/efa56a1c-95e8-4cd6-931a-972eac21563a returned a response status of 404 Not Found
at com.sun.jersey.api.client.WebResource.voidHandle(WebResource.java:697)
at com.sun.jersey.api.client.WebResource.delete(WebResource.java:261)
at com.microsoft.windowsazure.services.serviceBus.implementation.ServiceBusRestProxy.deleteMessage(ServiceBusRestProxy.java:260)
at com.microsoft.windowsazure.services.serviceBus.implementation.ServiceBusExceptionProcessor.deleteMessage(ServiceBusExceptionProcessor.java:176)
... 3 more

请注意,异常中的 URI 似乎引用了不同的消息 ID (efa56a1c-95e8-4cd6-931a-972eac21563a,而消息的 ID 实际上是 100790000086491)。我不知道这是否是失败的关键,但我有一种预感。

另一个有趣的观察结果:看起来错误总是发生在应用程序启动后或队列为空后从队列中检索到的第一条消息中。此后发出的所有消息似乎都不会导致此类问题。

队列的锁定持续时间为 2 分钟,消息的处理时间远远低于该持续时间,因此过期的锁定不可能是原因。

有什么想法吗?

最佳答案

我建议您调用 BrokeredMessage 类的 Complete() 。因此,对于您的情况,请尝试调用:

message.Complete();

当服务总线看到 Complete() 时,它认为该消息已被使用并将其从队列中删除。

关于java - Windows Azure : Error when deleting brokered message,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14487888/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com