3

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 分間かかります。そのため、期限切れのロックが原因になることはありません。

何か案は?

4

2 に答える 2

5

BrokeredMessage クラスの Complete() を呼び出すことをお勧めします。したがって、あなたの場合、電話してみてください:

message.Complete();

サービス バスは、Complete() を確認すると、メッセージが消費されたと見なし、キューから削除します。

于 2013-01-24T09:50:11.253 に答える
3

URL に表示される UUID は、ロックされているメッセージを追跡するためにサーバーが使用するランダムなトークンです。メッセージ ID と同じであってはなりません。を使用してロック URL にアクセスできますmessage.getLockLocation()

あなたが持っているコードは正しいように見えますが、特にあなたが説明した言葉では、それが失敗する明白な理由はわかりません。確認事項:

  1. 受け取ったメッセージが有効なメッセージであることを確認してください。空のキューをピーク ロックすると、空のメッセージが返されます。次に、ロックの場所は ですnull。(しかし、それはあなたが見る失敗を引き起こすことはありません。)
  2. lock supplied is invalid同じメッセージを複数回削除しようとすると、エラーが発生する可能性があります。これは、サービスが空のメッセージを返したことを認識し、前のメッセージを置き換えるコードがある場合に発生する可能性があります。(しかし、それが別のメッセージが削除されている場合を除き、メッセージを削除しようとして最終的に機能する理由を説明することはできません。)

うまくいけば、それは役に立ちます!

于 2013-02-07T23:36:50.813 に答える