Azure Service Bus キューからメッセージをプルする Java アプリケーションに取り組んでいます。Java Azure API (com.microsoft.windowsazure.services) を使用しています。私が経験している問題は、仲介されたメッセージが処理された後に削除できないことがあるということです。
私のアプリケーションは、ピークロック受信モードを使用して、ServiceBusContract オブジェクトで receiveQueueMessage() メソッドを使用して、キューからメッセージをプルします。メッセージが正常に処理されたら、deleteMessage() メソッドを呼び出してキューからメッセージを削除します (このメソッドは、.NET API の Complete() メソッドに対応すると思います)。
ただし、このメソッド呼び出しが失敗する場合があります。com.sun.jersey.api.client.UniformInterfaceException 例外は、deleteMessage() によってコンソールに記録されますが、この例外はスローされません (以下に出力を生成します)。例外は、メッセージが見つからなかったことを示しているようです。この場合、メッセージはキューに残ります。実際、次に receiveQueueMessage() を呼び出すと、このメッセージが再び取得されます。その後、削除は 1 回か 2 回失敗し、その後成功します。その後取得したメッセージは正常に削除されます。
問題が発生するコードは次のとおりです。
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 です)。これが失敗の鍵になるかどうかはわかりませんが、予感はします。
もう 1 つの興味深い観察結果: アプリケーションが開始された後、またはキューが空になった後に、キューから取得された最初のメッセージで常にエラーが発生するように見えます。その後のすべてのメッセージがこの種の問題を引き起こすことはないようです。
キューのロック期間は 2 分間で、メッセージの処理には 2 分間かかります。そのため、期限切れのロックが原因になることはありません。
何か案は?