Чтение недоставленных сообщений из очереди служебной шины

Я хотел бы знать, возможно ли читать сообщения с недействительными сообщениями из очереди Azure Service Bus в JAVA.

Я нашел следующий пример 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 ответа

Решение

Я знаю, что это старая нить, но для следующей потерянной души, которая ищет решение...

Я покопался в источнике.NET SDK и обнаружил, что на самом деле это всего лишь простой HTTP-вызов "/$DeadLetterQueue", то есть:

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...

Я не уверен насчет аспекта Java, но получение сообщений с мертвыми буквами - это та же самая механика, что и при чтении активного сообщения, но имя очереди отличается.

Используя API, вы можете вызвать QueueClient.FormatDeadLetterPath("NormalQueuePath"), чтобы получить путь к тупиковому пути. Затем вы можете использовать это при вызове QueueClient.CreateFromConnectionString(...), чтобы получить клиента, от которого вы можете получать сообщения с аномалиями.

Другие вопросы по тегам