NServiceBus
NServiceBus的核心并不依赖于MSMQ。NServiceBus可扩展性允许我们插入自行编写的通信传送器,、订阅存储器和工作流的实现。我已经基于MSMQ实现了一个传送器,还有一个则借助了WCF的NetTCP。开发人员既可以使用这些现有组件,也可以根据需要进行自定义。我们知道当前的许多SOA产品都与HTTP紧密耦合,因此NServiceBus的这种实现方式也将是个另辟蹊径的设计。
之所以选择使用MSMQ,是因为它是微软公司的两大主流的通讯技术之一(另一个是SQL Server Service Broker)。MSMQ允许双方在离线的状态下进行通信,且它提供了一整套易于使用的API,并已经集成到了.NET框架中,这一点要比Service Broker好得多。我个人认为支持离线通信是任何SOA基础框架都必须考虑的关键部分——因为Tenet of Service Autonomy 并不能保证当前通信的另一端处于可用状态。
学习创建一个简单的由客户端向服务端发送消息的订单系统。
- 创建 Client 项目
- 创建 Messages 项目
- 创建 Server 项目
- 发送订单
- 运行解决方案
创建项目之前先记得安装MSMQ消息队列服务,Windows自带这个功能了,只需要安装一下。

创建 Client 项目
让我们开始创建 Client 项目,它将负责发送订单请求到一个 NServiceBus 终结点(Endpoint)。
先创建一个解决方案命名为“Ordering”,然后添加一个名叫“Ordering.Client”的类库项目。
我们现在需要引用 NServiceBus 的程序集,最快的方式是使用 NuGet 包管理控制台。
打开 NuGet 包管理控制台:
输入以下命令:
PM> Install-Package NServiceBus.Host-ProjectName Ordering.Client
注:需要重新加载项目
包安装程序将引用 NServiceBus 程序集并在 Client 项目中创建几个模板文件。
例如,“EndpointConfig.cs” 被用来配置项目的终结点,并且自动应用了服务端配置。
为了将配置修改为客户端配置,我们需要打开“EndpointConfig.cs”文件并修改以下代码:
namespace Ordering.Client
{
using NServiceBus;
publicclassEndpointConfig : IConfigureThisEndpoint, AsA_Client
{
publicvoid Customize(BusConfiguration configuration)
{
configuration.UsePersistence<InMemoryPersistence>();
configuration.UseTransport<MsmqTransport>();
}
}
}
注:仅继承的基类由 AsA_Server 修改为 AsA_Client。
稍后我们将在 Client 项目中添加更多代码,现在让我们先把焦点放在如何处理订单请求上面。
创建 Messages 项目
首先添加一个名叫“Ordering.Messages”的类库项目。
该项目将包含消息定义,并且将由客户端和服务端共享,这样两边都将获得强类型的消息描述。
在该项目中安装“NServiceBusInterfaces”NuGet包,在包管理控制台,输入以下命令:
PM> Install-Package NServiceBus.Host -ProjectName Ordering.Messages
可以将自动添加的配置文件app.config和EndpointConfig.cs两个文件删除。
添加一个“PlaceOrder.cs”文件,在其中添加以下代码:
namespace Ordering.Messages
{
publicclassPlaceOrder : ICommand
{
publicGuid Id { get; set; }
publicstring Product { get; set; }
}
}
创建 Server 项目
现在我们可以开始创建处理订单的服务端,首先添加一个名为“Ordering.Server”的类库项目。
为该项目安装“NServiceBusHost”NuGet包,在包管理控制台,输入以下命令:
PM> Install-Package NServiceBus.Host -ProjectName Ordering.Server
注:需要重新加载项目
添加对 Messages 项目的引用,以便服务端解释消息内容。
添加一个“PlaceOrderHandler.cs”文件,向其中写入以下代码:
namespace Ordering.Server
{
publicclassPlaceOrderHandler : IHandleMessages<PlaceOrder>
{
publicIBus Bus { get; set; }
publicvoid Handle(PlaceOrder message)
{
Console.WriteLine(@"Order for Product:{0} placed with id: {1}", message.Product, message.Id);
}
}
}
发送订单
我们差不多快做好了,现在唯一剩下的就是回到 Client 项目中,添加对 Messages 项目的引用,并添加一个“SendOrder.cs”文件,向其中写入以下代码:
namespace Ordering.Client
{
publicclassSendOrder : IWantToRunWhenBusStartsAndStops
{
publicIBus Bus { get; set; }
publicvoid Start()
{
Console.WriteLine("Press 'Enter' to send a message. To exit, Ctrl+C");
while (Console.ReadLine() !=null)
{
var id =Guid.NewGuid();
Bus.Send("Ordering.Server", newPlaceOrder() { Id = id, Product ="New shoes" });
Console.WriteLine("=============================================");
Console.WriteLine("Send a new PlaceOrder message with id: {0}",id.ToString("N"));
}
}
publicvoid Stop()
{ }
}
}
注:以上代码基于 4.x 版本,若使用 3.x 版本需要使用 “IWantToRunAtStartup”接口。
运行解决方案
已经完成编码了,现在是时候运行解决方案了。
在解决方案中设置启动项目,将 Client 和 Server 项目设置为同时运行。

最后点击 F5 按钮运行解决方案,即可看到整个系统。
将会有两个控制台应用程序启动,在客户端控制台中按下回车,将在服务端窗口中看到“Order for Product: New shoes placed”。

NServiceBus的更多相关文章
- 使用NServiceBus开发分布式应用
系列主题:基于消息的软件架构模型演变 NServiceBus 是一个.Net平台下开源的消息服务框架,这类产品有时也被称作ESB(Enterprise Service Bus)--企业服务总线.NSe ...
- SOA、ESB、NServiceBus、云计算 总结
SOA SOA 是通过功能组件化.服务化,来实现系统集成.解决信息孤岛,这是其主要目标.而更进一步则是实现更快响应业务的变化.更快推出新的应用系统.与此同时,SOA 还实现了整合资源,资源复用. SO ...
- NServiceBus 更换服务名及队列名称
可以通过起动时的参数处理 NServiceBus.Host.exe /serviceName:”服务名称” /endpointName:”默认队列名称”
- NserviceBus+rabbitmq
Ok so I figured this out after looking a bit at the code and the requirements for amqp URI and it sh ...
- NServiceBus 结合 RabbitMQ 使用
参考官方教程: Step by Step Guide 新建4个项目: A Console Application named Client A Console Application named Se ...
- NServiceBus教程-持久化配置
当配置在NServiceBus v5持久性,秩序是非常重要的.最后赢得持久性配置选项.我们看看一些例子. 示例1 在本例中最后一个配置选项将会覆盖前面的所有选项. v5.2 v5.0 编辑 var c ...
- NServiceBus教程-持久化
NServiceBus的各种特性需要持久性.其中有超时.传奇和订阅存储. 四个持久化技术在NServiceBus在使用: RavenDB nHibernate 内存中 MSMQ 读到安装Raven D ...
- NServiceBus教程-NServiceBus和WCF
WCF中缺少的最主要的事情是发布/订阅,但为什么你必须建立它自己吗?NServiceBus,你把它弄出来. 下一个重要的事情是容错.异常导致WCF代理休息,需要"刷新"的代码,但调 ...
- NServiceBus教程-消息传递与处理
nservicebus"的容错默认"设计的一部分,基础设施管理事务自动所以你不需要记住所有的线程和状态管理要素配置. 客户端和服务器 理想情况下,服务器代码处理消息事务,但它往往不 ...
随机推荐
- 【工作备忘】suricata
因为工作遇到的困难,我向suricata的某个作者发送了邮件. On Wed, Sep 11, 2013 at 8:22 AM, likeyi <929812468@qq.com> wro ...
- other 遮罩层
<!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" content ...
- android错误系列之导出数据库出错Failed to pull selection
使用效率检视工具traceView,在导出检测文件时,出现了“failed to pull a selection”问题,网上搜索了几篇文章,有的说,是因为导出超时,我将windows-->pr ...
- unigui TUniTreeView demo
unit untTree; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, For ...
- True or False
任何对象都可以被测试真值.用于if或while条件中或作为下面的布尔操作的操作数.以下值被视为假: None False 任何数值类型的零,例如,0.0.0.0j . 任何空序列,例如,". ...
- Java获取IP地址:request.getRemoteAddr()注意
在JSP里,获取客户端的IP地址的方法是:request.getRemoteAddr() ,这种方法在大部分情况下都是有效的.但是在通过了Apache,Squid等反向代理软件就不能获取到客户 ...
- This is a sandbox of markdown
A First Level Header A Second Level Header Now is the time for all good men to come to the aid of th ...
- CentOS6 下安装JDK7
1.下载JDK:http://www.oracle.com/technetwork/java/javase/archive-139210.html,选择Java SE 7,下载jdk-7u80-lin ...
- Windows 10 Edge浏览器、照片查看程序关闭“平滑滚动”
升级到10后,这两个常用软件的“平滑滚动”功能,个人感觉体验有点不好,特别是图片这个自带程序,看了几十张图后就有点头晕了,所以把它关闭为好: 控制面板\系统和安全\系统\高级系统设置\高级\性能\设置 ...
- jquery操作select 的value和text值
获取select 的text值: $('#testSelect option:selected').text(); 获取select 的value值: $('#testSelect').val(); ...