Java:从Windows Azure Service Bus Queue接收答案

时间:2013-07-31 11:17:13

标签: java azure

我正在尝试使用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();

任何帮助将不胜感激,

1 个答案:

答案 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.
     }
}

根据应用程序的逻辑,您必须决定是否希望多个客户端从同一队列接收消息(在这种情况下,任何客户端实例都可以接收任何消息),或者您希望每个客户端具有不同的队列,以便它只接收专门发给它的消息。