1

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

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

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

对于接收消息,我使用:

ReceiveMessageOptions 选项 = ReceiveMessageOptions.DEFAULT;

options.setReceiveMode(ReceiveMode.PEEK_LOCK);

options.setTimeout(20);

ReceiveQueueMessageResult resultQueueMessage = service.receiveQueueMessage(responseQueueName);

BrokeredMessage receivedMessage = resultQueueMessage.getValue();

任何帮助,将不胜感激,

亚洲

4

1 回答 1

0

客户端可能正在锁定消息,但从不删除它们。

如何使用服务总线队列中所述:

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

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

于 2013-07-31T13:01:31.560 回答