2013-09-25 131 views
0

我刚开始玩着天蓝色和服务总线。我试图能够将相同的消息发送给多个客户端。在其他消息传递解决方案中,如果您有多个客户端正在监听某个主题,并且您将消息发送给某个主题,则他们都会收到该消息使用Azure,只有一个订阅者可以获取该消息。我相信我错过了任何人都可以提供一个指针?我的示例代码如下。如何向多个客户端发送相同的消息

string connectionString = 
"Endpoint=sb://xxx.servicebus.windows.net/;SharedSecretIssuer=owner;SharedSecretValue=xxxxxxxxxxxxxxxxxxxxxxxxxxxx="; 
NamespaceManager namespaceManager = NamespaceManager.CreateFromConnectionString(connectionString); 
string topic = TestTopic.Replace("/", ".").Replace("{", "-").Replace("}", "-"); 
if (!namespaceManager.TopicExists(topic)) 
{ 
var td = new TopicDescription(topic) 
    { 
    MaxSizeInMegabytes = 5120, 
    DefaultMessageTimeToLive = new TimeSpan(0, 1, 0), 
    }; 

namespaceManager.CreateTopic(td); 
} 


var message = new {CurrencyCode = "AUD", EffectiveDate = DateTime.Today, Rate = .97M}; 

TopicClient publisher = TopicClient.CreateFromConnectionString(connectionString, topic); 
var bm = new BrokeredMessage("fff"); 
bm.Properties["Topic"] = ".xxx.fxrates.aud"; 

int messagesReceived = 0; 
int messagesReceived2 = 0; 

if (namespaceManager.SubscriptionExists(topic, "test") == false) 
{ 
SubscriptionDescription sub = namespaceManager.CreateSubscription(topic, "test"); 
} 

SubscriptionClient subscriber = SubscriptionClient.CreateFromConnectionString(connectionString, topic, 
             "test", 
             ReceiveMode.ReceiveAndDelete); 
SubscriptionClient subscriber2 = SubscriptionClient.CreateFromConnectionString(connectionString, topic, 
             "test", 
             ReceiveMode.ReceiveAndDelete); 
subscriber.OnMessage(delegate { messagesReceived++; }); 

subscriber2.OnMessage(delegate { messagesReceived2++; }); 

publisher.Send(bm); 
namespaceManager.DeleteTopic(topic); 

回答

0

首先,你必须进行唯一命名你的用户!目前您的两位订户都被命名为“test”。其次,如果您希望其他订户也收到消息,则必须执行ReceiveMode.PeekLock,但不执行ReceiveMode.ReceiveAndDelete。我知道我们开发人员不喜欢RTFM,但是当没有其他任何帮助时(包括StackOverflow问题),最好看看它(手册):Service Bus Queues, Topics and Subscriptions是了解它如何工作的好的资源。而How to use Service Bus Topics/Subscriptions将带你到正确的点。

+3

每个订阅者都有自己的队列,因此每个订阅者是否执行PeekLock或ReceiveAndDelete并不重要,其他订阅者将收到是否有另一个订阅(队列)已经阅读消息的消息。 –

相关问题