2016-04-07 44 views
0

我有几个客户端应用程序正在等待将消息作业从Azure服务总线队列中取出。单个Azure服务总线队列的多个客户端

一旦客户端有了这份工作,我不希望任何其他客户端应用程序接收到这份工作。

如果所有客户端都实现Queue.OnMessage()以通知到达消息,我如何确定2个或更多客户端不接收消息?

+0

你能说清楚吗?你是否要求1个消费者应该只能得到一种类型的消息,但其他消费者不应该或者当一个消费者得到其他消费者不应该的消息时?如果你说清楚并举一个例子,那会更好。 –

回答

1

我的理解是,只要其中一个工作人员从队列中获得一件物品,就会在某个可配置的时间(租赁)内为其他人隐藏。如果工人成功完成作业,则通知队列该项目可以被删除。如果工人失败,它可以通知队列将物品移动到死信队列中,如果工人在其他工人的租约时间后变为可见物品。项目内应该有一个属性(由ServiceBus设置),表示物品交付的次数。还有一个TTL(生存时间),之后物品将自动移动到死信队列中。

0

为了避免这种使用队列,您可以使用Azure Service Bus的会话功能。

在做其他任何事情之前,您需要首先创建一个会话感知队列,这可以按如下方式完成。

// Create a queue with duplicate detection 
// with a detection history window of one hour, 
// and requires sessions. 

QueueDescription rfidCheckoutQueueDescription = new QueueDescription("rfidcheckout") 
{ 

    RequiresSession = true, 

    RequiresDuplicateDetection = true, 

    DuplicateDetectionHistoryTimeWindow = new TimeSpan(0, 1, 0) 

}; 

// Create a queue that supports duplicate detection. 
namespaceMgr.CreateQueue(rfidCheckoutQueueDescription); 

当会话知道队列设置必须设置SessionId属性的消息,并收到使用MessageSession代替QueueClient消息。

为此可以找到一些代码示例: Sending Messages,Receiving Messages

+0

如果您想将特定消息路由到特定的消费者,会话很有用。如果你想简单地分配负载,并确保一个项目只处理一次你不应该需要会话 – Helikaon

+0

啊是的,道歉我误解了这个问题。 –

相关问题