从服务总线队列中读取死锁消息

时间:2015-07-08 09:00:10

标签: java azure-servicebus-queues dead-letter brokeredmessage

我想知道是否可以从JAVA中的azure服务总线队列中读取死去的消息。

我找到了以下示例https://code.msdn.microsoft.com/windowsazure/Brokered-Messaging-Dead-22536dd8/sourcecode?fileId=123792&pathId=497121593 但是,我还没能将代码翻译成JAVA。

我还发现https://github.com/Azure/azure-storage-java/tree/master/microsoft-azure-storage/src/com/microsoft/azure/storage 但在那里似乎没有任何关于无法实现的东西。

我还发现了几个博客(我不允许添加更多链接,所以我不知道我是否应该没有正确的标签)。但他们都没有描述如何阅读JAVA中的无法解决的消息。

非常感谢提前

2 个答案:

答案 0 :(得分:1)

我知道这是一个旧线索,但是对于寻找解决方案的下一个失去的灵魂......

我一直在挖掘.NET SDK源代码,发现它实际上只是对“/ $ DeadLetterQueue”的简单HTTP调用,即:

https://mynamespace.servicebus.windows.net/myqueuename/$DeadLetterQueue/messages/head

// Peek-Lock Message from DLQ
curl -X POST -H "authorization: insertSASHere" "https://mynamespace.servicebus.windows.net/myqueuename/%24DeadLetterQueue/messages/head"

因此,使用Java SDK只需要读取死信队列中的消息:

service.receiveQueueMessage(queueName + "/$DeadLetterQueue", opts);

这是一个非常基本但具体的例子(破坏性阅读):

public static void main(String[] args) throws ServiceException {

    String namespace        = "namespace";
    String sharedKeyName    = "keyName";
    String sharedSecretKey  = "secretKey";
    String queueName        = "queueName";      

    // Azure Service Bus Service
    Configuration config = ServiceBusConfiguration.configureWithSASAuthentication(namespace, sharedKeyName, sharedSecretKey, ".servicebus.windows.net");
    ServiceBusContract service = ServiceBusService.create(config);

    // Receive and Delete Messages from DLQ
    ReceiveMessageOptions opts = ReceiveMessageOptions.DEFAULT;
    opts.setReceiveMode(ReceiveMode.RECEIVE_AND_DELETE);

    while (true) {
        // To get messages from the DLQ we just need the "$DeadLetterQueue" URI
        ReceiveQueueMessageResult resultQM = service.receiveQueueMessage(queueName + "/$DeadLetterQueue", opts);
        BrokeredMessage message = resultQM.getValue();
        if (message != null && message.getMessageId() != null) {
            System.out.println("MessageID: " + message.getMessageId());
        } else {
            System.out.println("No more messages.");
            break;
        }
    }
}

当然,REST API规范中的任何地方都没有记录,典型的Microsoft ......

答案 1 :(得分:0)

我不确定Java方面,但接收死信消息与读取活动消息的机制完全相同,但队列名称不同。

使用API​​,您可以调用QueueClient.FormatDeadLetterPath(" NormalQueuePath")来获取死信路径名称。然后,您可以在调用QueueClient.CreateFromConnectionString(...)时使用它来获取一个客户端,您可以从中接收来自。的死去的消息。