【问题标题】:Java: Receive answer from Windows Azure Service Bus QueueJava:从 Windows Azure 服务总线队列接收答案
【发布时间】:2013-07-31 11:17:13
【问题描述】:

我正在尝试使用 Windows Azure 服务总线队列来实现请求响应队列。我创建了两个队列:请求和响应。

我的客户端将消息发送到请求队列,然后我的服务器端从请求队列中获取此消息,做一些事情并将响应放入响应队列。 客户端检查响应队列是否有任何消息。当我只运行一个客户端时,它工作正常。

当我运行多个客户端时,一段时间后客户端不会从响应队列中提取任何消息。这个队列肯定不是空的,因为客户端检查有多少消息。

为了接收我使用的消息:

ReceiveMessageOptions 选项 = ReceiveMessageOptions.DEFAULT;

options.setReceiveMode(ReceiveMode.PEEK_LOCK);

options.setTimeout(20);

ReceiveQueueMessageResult 结果QueueMessage = service.receiveQueueMessage(responseQueueName);

BrokeredMessage receivedMessage = resultQueueMessage.getValue();

任何帮助将不胜感激,

亚洲

【问题讨论】:

    标签: java azure


    【解决方案1】:

    客户端可能锁定了消息,但从未删除它们。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-02-13
      • 1970-01-01
      • 2017-04-16
      • 1970-01-01
      • 1970-01-01
      • 2017-02-25
      • 2017-02-14
      • 2015-07-18
      相关资源
      最近更新 更多