我们在升级一个POS系统的时候,决定使用微软公有云计算平台下的Azure ServiceBus 进行POS客户端与服务器的交互。

本文主要时作者在学习使用 Azure SDK for .NET 操作由世纪互联运营的 中国区Azure 上的 Service Bus。


目录
一、安装AzureServiceBus程序集

二、在Portal创建命名空间

三、通过代码创建Topic

四、通过代码创建订阅

五、创建并发送消息

六、消费消息


1.通过nuget安装程序集

using Microsoft.ServiceBus;
using Microsoft.ServiceBus.Messaging;

using Microsoft.Azure;

2. 在Portal创建 service bus 命名空间:

只有标准级别可以使用主题(Topic),因此创建命名空间时,请选择标准;

也可以创建后,在缩放选项卡里调整为标准。

3.创建主题,可以通过portal创建,也可以通过代码创建:

通过代码创建主题:

 // Create the topic if it does not exist already.
string connectionString =
CloudConfigurationManager.GetSetting("Microsoft.ServiceBus.ConnectionString"); var namespaceManager =
NamespaceManager.CreateFromConnectionString(connectionString); if (!namespaceManager.TopicExists("TestTopic"))
{ //默认的createtopic方法
namespaceManager.CreateTopic("TestTopic"); // 通过TopicDescription构建一个重载
//TopicDescription td = new TopicDescription("TestTopicCustomer");
//td.MaxSizeInMegabytes = 5120;
//td.DefaultMessageTimeToLive = new TimeSpan(0, 1, 0);
//if (!namespaceManager.TopicExists("TestTopicCustomer"))
//{
// namespaceManager.CreateTopic(td);
//} }

4.创建订阅:

下面的代码演示创建了三个订阅,其中Product和Customer订阅增加了一个SqlFilter,即如果发送消息时,

message.Properties["Entity"] = "Product",则消息会由Product订阅处理;

message.Properties["Entity"] = "Customer",则消息会由Customer订阅处理;

  string connectionString =
CloudConfigurationManager.GetSetting("Microsoft.ServiceBus.ConnectionString"); var namespaceManager =
NamespaceManager.CreateFromConnectionString(connectionString); if (!namespaceManager.SubscriptionExists("TestTopic", "AllMessages"))
{
namespaceManager.CreateSubscription("TestTopic", "AllMessages");
} Console.WriteLine("AllMessages done"); // Create a "ProductMessagesFilter" filtered subscription.
SqlFilter ProductMessagesFilter =
new SqlFilter("Entity='Product'"); namespaceManager.CreateSubscription("TestTopic",
"Product",
ProductMessagesFilter); Console.WriteLine("Product done"); // Create a "CustomerMessagesFilter" filtered subscription.
SqlFilter CustomerMessagesFilter =
new SqlFilter("Entity='Customer'"); namespaceManager.CreateSubscription("TestTopic",
"Customer",
CustomerMessagesFilter); Console.WriteLine("Customers done");

5.创建并发送普通消息:

下面创建了5个product和3个customer并发送了消息,

 BrokeredMessage message = new BrokeredMessage(product);
 BrokeredMessage message = new BrokeredMessage(customer);
 

Product有如下设置:message.Properties["Entity"] = "Product";

Customer有如下设置:message.Properties["Entity"] = "Customer";

 

则 product 订阅会有5条消息,customer订阅会有3条消息,另外,Allmessages没有任何sqlfilter,则该订阅会有5+3=8条消息。

  string connectionString =
CloudConfigurationManager.GetSetting("Microsoft.ServiceBus.ConnectionString"); TopicClient Client =
TopicClient.CreateFromConnectionString(connectionString, "TestTopic"); // Client.Send(new BrokeredMessage()); //Add 5 Products
var product = new Model.Product(); for (int i = ; i < ; i++)
{ product.ProductID ="ProductID"+ i.ToString(); // Create message, passing a Product for the body.
BrokeredMessage message = new BrokeredMessage(product); // Set additional custom app-specific property.
message.Properties["Entity"] = "Product"; //ScheduledMessage
//message.ScheduledEnqueueTimeUtc = DateTime.Now.AddMinutes(1); // Send message to the topic.
Client.Send(message);
} //Add 3 Customers
var customer = new Model.Customer(); for (int i = ; i < ; i++)
{ customer.CustomerID = "CustomerID"+i.ToString(); // Create message, passing a Customer message for the body.
BrokeredMessage message = new BrokeredMessage(customer); // Set additional custom app-specific property.
message.Properties["Entity"] = "Customer"; // Send message to the topic.
Client.Send(message);
}

发送消息后的效果:

创建定时消息:

设置消息的如下属性,则消息在发送成功后延时1分钟后才会出现在上图中,也才可以被订阅消费。

message.ScheduledEnqueueTimeUtc = DateTime.Now.AddMinutes(1);

6.消费消息:

不同的订阅可以取不同订阅里的消息进行处理,处理完成后,标记message.Complete()即可从订阅里清除消息。

 string connectionString =
CloudConfigurationManager.GetSetting("Microsoft.ServiceBus.ConnectionString"); //SubscriptionClient Client =
// SubscriptionClient.CreateFromConnectionString
// (connectionString, "TestTopic", "Customer"); //SubscriptionClient Client =
// SubscriptionClient.CreateFromConnectionString
// (connectionString, "TestTopic", "Product"); SubscriptionClient Client =
SubscriptionClient.CreateFromConnectionString
(connectionString, "TestTopic", "AllMessages"); // Configure the callback options.
OnMessageOptions options = new OnMessageOptions();
options.AutoComplete = false;
options.AutoRenewTimeout = TimeSpan.FromMinutes(); Client.OnMessage((message) =>
{
try
{
// Process message from subscription.
Console.WriteLine("Messages"); Console.WriteLine("MessageID: " + message.MessageId);
Console.WriteLine("Message EntityType=: " +
message.Properties["Entity"]); if(message.Properties["Entity"].ToString()=="Customer")
{
Console.WriteLine("CustomerID=" + message.GetBody<Customer>().CustomerID.ToString());
}
if (message.Properties["Entity"].ToString() == "Product")
{
Console.WriteLine("ProductID=" + message.GetBody<Product>().ProductID.ToString());
} // Remove message from subscription.
message.Complete();
}
catch (Exception)
{
// Indicates a problem, unlock message in subscription.
message.Abandon();
}
}, options); Console.ReadLine();

特别注意:消费掉Product或Customer里的消息后,AllMessage里的消息不受影响。

Azure service bus Topic基本用法的更多相关文章

  1. Windows Azure Service Bus (5) 主题(Topic) 使用VS2013开发Service Bus Topic

    <Windows Azure Platform 系列文章目录> 项目文件,请在这里下载 在笔者之前的文章中Windows Azure Service Bus (1) 基础 介绍了Servi ...

  2. Windows Azure Service Bus Topics实现系统松散耦合

    前言 Windows Azure中的服务总线(Service Bus)提供了多种功能, 包括队列(Queue), 主题(Topic),中继(Relay),和通知中心(Notification Hub) ...

  3. Windows Azure Service Bus (4) Service Bus Queue和Storage Queue的区别

    <Windows Azure Platform 系列文章目录> 熟悉笔者文章的读者都了解,Azure提供两种不同方式的Queue消息队列: 1.Azure Storage Queue 具体 ...

  4. 阿里云ONS而微软Azure Service Bus体系结构和功能比较

    阿里云ONS而微软Azure Service bus体系结构和功能比较 版权所有所有,转载请注明出处http://blog.csdn.net/yangzhenping.谢谢! 阿里云的开放消息服务: ...

  5. 如何在ASP.NET Core中使用Azure Service Bus Queue

    原文:USING AZURE SERVICE BUS QUEUES WITH ASP.NET CORE SERVICES 作者:damienbod 译文:如何在ASP.NET Core中使用Azure ...

  6. 使用Service Bus Topic 实现简单的聊天室

    创建Service Bus能够參照: https://azure.microsoft.com/en-gb/documentation/articles/service-bus-dotnet-how-t ...

  7. 【Azure 服务总线】详解Azure Service Bus SDK中接收消息时设置的maxConcurrentCalls,prefetchCount参数

    (Azure Service Bus服务总线的两大类消息处理方式: 队列Queue和主题Topic) 问题描述 使用Service Bus作为企业消息代理,当有大量的数据堆积再Queue或Topic中 ...

  8. Azure Service Bus 中的身份验证方式 Shared Access Signature

    var appInsights=window.appInsights||function(config){ function r(config){t[config]=function(){var i= ...

  9. Windows Azure Service Bus Notification Hub推送通知

    前言 随着Windows Azure 在中国的正式落地,相信越来越多的人会体验到Windows Azure带来的强大和便利.在上一篇文章中, 我们介绍了如何利用Windows Azure中的Servi ...

随机推荐

  1. Double.valueOf()与Double.parseDouble()两者的区别

    写代码用到这两个方法,不知道有什么区别,看一下源码: Double.parseDouble(String str) public static double parseDouble(String s) ...

  2. MySQL学习笔记(二)——检索数据与过滤数据

    检索数据和过滤数据也就是平时用到最多的增删改查里面的查了. 一.数据检索 检索单个列: select column from table; 检索多个列:     select colunm1,colu ...

  3. 《UML和模式应用》读书笔记(一)

    一.绪论 1. 面向对象分析和设计 1.1 什么是分析和设计 分析(analysis)强调的是对问题和需求的调查研究,而不是解决方案. 设计(design)强调的是满足需求的概念上的解决方案,而不是其 ...

  4. jmeter解压后启动jmeter.bat报错:Not able to find java executable or version

    错误详情: 错误解决方法: 修改环境变量配置将%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin;移动到%SystemRoot%\system32;%SystemRoot%;%Sy ...

  5. JavaWeb----文件的上传和下载

    一.开发环境搭建 创建一个FileUploadAndDownLoad项目,加入Apache的commons-fileupload文件上传组件的相关Jar包,如下图所示: 二.实现文件上传 2.1.文件 ...

  6. QQ登陆功能的实现2

    QQ登陆功能的实现2 由于看到园子里有朋友说需要讲解和剖析实现的步骤,前面的QQ登陆实现只有代码,所以这篇补上 1.  分析 1). 当运行QQ.exe后会出现qq登陆界面的窗体 2). 我们用spy ...

  7. 如何更快更好的写出cnblog博客?windows live writer推荐

    之前总是会羡慕网上那些技术牛人的博客都写的那么给力,后来一搜发现还是有工具可用的. 这里就推荐一款写博客的"神器",Windows Live Writer (Get It Now! ...

  8. spellchecker inspection helps locate typeos and misspelling in your code, comments and literals, and fix them in one click

    项目layout文件中出现 spellchecker inspection helps locate typos and misspelling in your code, comments and ...

  9. plsql 免oracle客户端安装

    PLSQL Developer 11.0.0.1762 中文绿色注册版(免Oracle11g客户端) 免安装Oracle客户端,绿色无公害. 说明: 1.点击 "启动PLSQL.exe&qu ...

  10. windows下mysql5.1忘记root密码解决方法[win7]

    步骤如下:1.停止mysql服务(以管理员身份,在cmd命令行下运行) net stop mysql2.使用 mysqld –skip-grant-tables 命令启动mysql数据库 D:\> ...