前言

NServiceBus提供了8种传输管道组件,分别是Learning、MSMQ、Azure Service Bus、Azure Service Bus (Legacy)、Azure Storage Queues、SQL Server、RabbitMQ、Amazon SQS。前两篇我们主要用的是Learnning,这篇使用RabbitMQ,也可以直接用于生产。

安装RabbitMQ组件

RabbitMQ不在NServiceBus下,是一个单独的组件,需要单独安装。

设置RabbitMQ连接串

var transport = config.UseTransport<RabbitMQTransport>();
transport.ConnectionString("host=192.168.80.129;username=admin;password=admin");
transport.UseDirectRoutingTopology();

消息生产者(ClientUI)

 class Program
{
static ILog log = LogManager.GetLogger<Program>();
static void Main(string[] args)
{
MainAsync().GetAwaiter().GetResult();
} static async Task MainAsync()
{
Console.Title = "Sample.ClientUI";
var config = new EndpointConfiguration("Sample.ClientUI");
config.UseSerialization<NewtonsoftSerializer>();
config.UsePersistence<InMemoryPersistence>();
config.EnableInstallers(); var transport = config.UseTransport<RabbitMQTransport>();
transport.ConnectionString("host=192.168.80.129;username=admin;password=admin");
transport.UseDirectRoutingTopology(); var endpointInstance = await Endpoint.Start(config).ConfigureAwait(false); await RunAsync(endpointInstance).ConfigureAwait(false); await endpointInstance.Stop().ConfigureAwait(false);
} static async Task RunAsync(IEndpointInstance endpointInstance)
{
log.Info("Press 'P' to send an PlaceOrder Command");
while (true)
{
var key = Console.ReadKey();
Console.WriteLine(); switch (key.Key)
{
case ConsoleKey.P:
{
var command = new PlaceOrder
{
OrderId = Guid.NewGuid().ToString()
}; log.Info($"Sending PlaceOrder with OrderId:{command.OrderId}");
await endpointInstance.Send("Sample.Server",command).ConfigureAwait(false);
break;
} case ConsoleKey.Q:
return;
default:
log.Info("Please try again");
break;
}
}
}
}

先启动ClientUI,启动后先发送几条数据,发送数据观察程序控制台数据是否发送,然后在RabbitMQ控制台里观察Queue的情况,没创建Queue时,这里会自动创建Queue,队列名称和端点名称相同。这里发送消息数据,数据会在Sample.Server队列里。



     这里能看到在队列Sample.Server里有三条未消费的数据,因为我还没有启动Sample.Server控制台程序。

消息消费者(Server)

public class Program
{
static ILog log = LogManager.GetLogger<Program>();
static void Main(string[] args)
{
MainAsync().GetAwaiter().GetResult();
} static async Task MainAsync()
{
Console.Title = "Sample.Server";
var config = new EndpointConfiguration("Sample.Server");
config.UseSerialization<NewtonsoftSerializer>();
config.UsePersistence<InMemoryPersistence>();
config.EnableInstallers(); var transport = config.UseTransport<RabbitMQTransport>();
transport.ConnectionString("host=192.168.80.129;username=admin;password=admin");
transport.UseDirectRoutingTopology(); var endpointInstance = await Endpoint.Start(config).ConfigureAwait(false); log.Info("Press any key to quit");
Console.ReadKey(); await endpointInstance.Stop().ConfigureAwait(false);
}
}
public class PlaceOrderHandler : IHandleMessages<PlaceOrder>
{
static ILog log = LogManager.GetLogger<PlaceOrderHandler>();
public Task Handle(PlaceOrder message, IMessageHandlerContext context)
{
log.Info($"Received PlaceOrder with OrderId:{message.OrderId}");
return Task.CompletedTask;
}
}

启动Sample.Server控制台后,就会消费Queue里的数据,消费完成后观察程序控制台的提示和RabbitMQ控制台的提示。





    这里能看到刚才堆积的三条数据已经被消费了。

总结

写完这个demo我就在想在程序里通过使用NServiceBus的RabbitMQ组件和直接在程序里使用RabbitMQ直接调用的区别,到底有没有必要通过NServiceBus调用,还需要进一步考量。

NServiceBus+RabbitMQ开发分布式应用的更多相关文章

  1. NServiceBus+Saga开发分布式应用

    前言       当你在处理异步消息时,每个单独的消息处理程序都是一个单独的handler,每个handler之间互不影响.这时如果一个消息依赖另一个消息的状态呢? 这时业务逻辑怎么处理?       ...

  2. 跟我一起学WCF(3)——利用Web Services开发分布式应用

    一.引言 在前面文章中分别介绍了MSMQ和.NET Remoting技术,今天继续分享.NET 平台下另一种分布式技术——Web Services 二.Web Services 详细介绍 2.1 We ...

  3. 跟我一起学WCF(2)——利用.NET Remoting技术开发分布式应用

    一.引言 上一篇博文分享了消息队列(MSMQ)技术来实现分布式应用,在这篇博文继续分享下.NET平台下另一种分布式技术——.NET Remoting. 二..NET Remoting 介绍 2.1 . ...

  4. 利用Web Services开发分布式应用

    一.引言 在前面文章中分别介绍了MSMQ和.NET Remoting技术,今天继续分享.NET 平台下另一种分布式技术——Web Services 二.Web Services 详细介绍 2.1 We ...

  5. 使用.NET Remoting开发分布式应用——基于租约的生存期

    一.概述 知名类型的SingleCall对象可以在客户程序的方法调用之后被垃圾收集器清理掉,因为它没有保持状态,属于无状态的.而客户激活的类型的对象和知名类型的SingleTon对象都属于生存期长的对 ...

  6. 初识用.NET Remoting来开发分布式应用

    一..NET Remoting简介: .NET Remoting从某种意义上讲是DCOM的替代品.ASP.NET Web服务十分有用,但是这项技术在企业内联网的解决方案中,对于某些业务请求来说并不快, ...

  7. 使用NServiceBus开发分布式应用

    系列主题:基于消息的软件架构模型演变 NServiceBus 是一个.Net平台下开源的消息服务框架,这类产品有时也被称作ESB(Enterprise Service Bus)--企业服务总线.NSe ...

  8. 【RabbitMQ 实战指南】一 RabbitMQ 开发

    1.RabbitMQ 安装 RabbitMQ 的安装可以参考官方文档:https://www.rabbitmq.com/download.html 2.管理页面 rabbitmq-management ...

  9. 搭建 .Net RabbitMQ 开发环境

    开发环境,window 10 64位,VS2017,系统账号需要用administrator. 1 先需要安装erlang语言开发包,一路默认安装就是了,地址:http://www.erlang.or ...

随机推荐

  1. linux iconv 转换文件编码

    查看文件编码file -i filename 递归转换(包括子文件夹)find default -type d -exec mkdir -p utf/{} \;find default -type f ...

  2. 软件测试的分类&软件测试生命周期

    软件测试的分类: 按测试执行阶段:单元测试.集成测试.系统测试.验收测试.(正式验收测试,Alpha 测试-内侧,Beta 测试-公测) 按测试技术分类:黑盒测试.白盒测试.灰盒测试 按测试对象是否运 ...

  3. web前端开发面试题(附答案)-3

    1.用纯css创建一个三角形的原理: .demo{ width:0; height: 0; border: 5px solid transparent; border-left-color: red; ...

  4. 在Docker中启动Cloudera

    写在前面 记录一下,一个简单的cloudera处理平台的构建过程和一些基本组件的使用 前置说明 需要一台安装有Docker的机器 docker常用命令: docker ps docker ps -a ...

  5. JAVA设计模式---单例模式篇

    单例模式(singleton):是JAVA中最简单的一种设计模式,属于创建型模式.所谓单例,就是整个程序有且仅有一个实例. 特点: 构造方法私有化 在本类中实例化一个对象作为本类的属性 对外提供一个访 ...

  6. 浏览器端获取短信验证码java实现——阿里云短信服务

    需求:浏览器端输入手机号,获取验证码.点击登录,验证验证码是否输入错误.是否超时等情况,一旦校验通过,将用户数据保存到数据中(业务逻辑). 前提:注册阿里用户,开通短信服务,申请key.秘钥.签名.短 ...

  7. spring源码分析系列2:Bean与BeanDefinition关系

    接口表示一种能力,实现了一个接口,即拥有一种能力. BeanDefinition与Bean的关系, 就好比类与对象的关系. 类在spring的数据结构就是BeanDefinition.根据BeanDe ...

  8. springboot之本地缓存(guava与caffeine)

    1. 场景描述 因项目要使用本地缓存,具体为啥不用redis等,就不讨论,记录下过程,希望能帮到需要的朋友. 2.解决方案 2.1 使用google的guava作为本地缓存 初步的想法是使用googl ...

  9. 【solved】must have one register DataBase alias named `default`

    beego在初始化MySQL数据库时报错处理 1.报错提示: ... [ORM]2019/10/11 08:42:52 register db Ping `default`, dial tcp 192 ...

  10. 爬虫那点事,干就玩了之seleunim

    目录 selenium 环境准备 代码环境 开始爬虫 操作js 截图 切换窗口 在当前窗口切换访问地址 管理cookie # 加入战队 微信公众号 # 加入战队 微信公众号 做技术我们最重要的是[做] ...