从服务总线队列中读取死信消息
Reading deadlettered messages from service bus queue
我想知道是否可以从 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中的死信消息。
非常感谢
我不确定 Java 方面,但是接收 dead-lettered 消息与读取活动消息的机制完全相同,只是队列名称不同。
使用 API 可以调用 QueueClient.FormatDeadLetterPath("NormalQueuePath") 来获取死信路径名。然后,您可以在对 QueueClient.CreateFromConnectionString(...) 的调用中使用它来获取可以从中接收死信消息的客户端。
我知道这是一个旧线程,但对于下一个迷失的灵魂正在寻找解决方案...
我一直在挖掘 .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;
}
}
}
我想知道是否可以从 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中的死信消息。
非常感谢
我不确定 Java 方面,但是接收 dead-lettered 消息与读取活动消息的机制完全相同,只是队列名称不同。
使用 API 可以调用 QueueClient.FormatDeadLetterPath("NormalQueuePath") 来获取死信路径名。然后,您可以在对 QueueClient.CreateFromConnectionString(...) 的调用中使用它来获取可以从中接收死信消息的客户端。
我知道这是一个旧线程,但对于下一个迷失的灵魂正在寻找解决方案...
我一直在挖掘 .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;
}
}
}