客户端可能正在锁定消息,但从不删除它们。
如如何使用服务总线队列中所述:
在 PeekLock 模式下,接收变成了一个两阶段的操作,这使得支持不能容忍丢失消息的应用程序成为可能。当 Service Bus 收到请求时,它会找到下一条要消费的消息,将其锁定以防止其他消费者接收它,然后将其返回给应用程序。在应用程序完成处理消息(或将其可靠地存储以供将来处理)后,它通过对接收到的消息调用 Delete 来完成接收过程的第二阶段。当服务总线看到删除调用时,它会将消息标记为已使用并将其从队列中删除。
下面的示例演示了如何使用 PeekLock 模式接收和处理消息:
ReceiveMessageOptions opts = ReceiveMessageOptions.DEFAULT;
opts.setReceiveMode(ReceiveMode.PEEK_LOCK);
while(true)
{
ReceiveQueueMessageResult resultQM =
service.receiveQueueMessage("TestQueue", opts);
BrokeredMessage message = resultQM.getValue();
if (message != null && message.getMessageId() != null)
{
try
{
System.out.println("Body: " + message.toString());
System.out.println("MessageID: " + message.getMessageId());
System.out.println("Custom Property: " +
message.getProperty("TestProperty"));
// Remove message from queue
System.out.println("Deleting this message.");
service.deleteMessage(message);
}
catch (Exception ex)
{
// Indicate a problem, unlock message in queue
System.out.println("Inner exception encountered!");
service.unlockMessage(message);
}
}
else
{
System.out.println("Finishing up - no more messages.");
break;
// Added to handle no more messages in the queue.
// Could instead wait for more messages to be added.
}
}
根据您的应用程序的逻辑,您必须决定是否希望多个客户端从同一个队列接收消息(在这种情况下,任何客户端实例都可以接收任何消息),或者是否希望每个客户端具有不同的队列以便它只接收消息专门针对它。