我正在尝试使用Windows Azure Service Bus Queue实现请求响应队列。我创建了两个队列:请求和响应。
我的客户端向Request队列发送消息,然后我的服务器端从Request队列中获取此消息,执行某些操作并将响应放入Response Queue。 如果有任何消息,客户端检查响应队列。当我只运行一个客户端时,它工作正常。
当我运行多个客户端时,一段时间后客户端不会从响应队列中取出任何消息。这个队列肯定不是空的,因为客户端检查有多少消息。
接收消息我使用:
ReceiveMessageOptions options = ReceiveMessageOptions.DEFAULT;
options.setReceiveMode(ReceiveMode.PEEK_LOCK);
options.setTimeout(20);
ReceiveQueueMessageResult resultQueueMessage = service.receiveQueueMessage(responseQueueName);
BrokeredMessage receivedMessage = resultQueueMessage.getValue();
任何帮助将不胜感激,
亚
答案 0 :(得分:0)
客户端可能会锁定邮件但从不删除邮件。
如How to Use Service Bus Queues中所述:
在PeekLock模式下,接收变为两阶段操作,这使得可以支持不能容忍丢失消息的应用程序。当Service Bus收到请求时,它会找到要使用的下一条消息,将其锁定以防止其他消费者接收该消息,然后将其返回给应用程序。在应用程序完成处理消息(或将其可靠地存储以供将来处理)之后,它通过在接收的消息上调用Delete来完成接收过程的第二阶段。当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.
}
}
根据应用程序的逻辑,您必须决定是否希望多个客户端从同一队列接收消息(在这种情况下,任何客户端实例都可以接收任何消息),或者您希望每个客户端具有不同的队列,以便它只接收专门发给它的消息。