这里主要讲一下我基于Rebus写的一个ABP框架的模块

 
目录结构

对于Rebus网上的资料很少,其实我对于服务总线也不是很理解 。。个人理解的就是像ABP中的EventBus那样的,但是集成了一些消息队列像MSMQ,RabbitMQ等。

废话不多说,下面主要讲下几个主要的文件

 
RebusRabbitMqModule

这个呢就是ABP的模块写法,详细的可以去ABP官网看下,这里主要的代码是在这里

            var moduleConfig = IocManager.Resolve<IRebusRabbitMqModuleConfig>();

            if (moduleConfig.Enabled)
{
var rebusConfig = Configure.With(new CastleWindsorContainerAdapter(IocManager.IocContainer)); if (moduleConfig.LoggingConfigurer != null)
{
//配置Rebus用哪种工具来记录日志,我这里用的Log4net
rebusConfig.Logging(moduleConfig.LoggingConfigurer);
} rebusConfig.Serialization(moduleConfig.SerializerConfigurer); if (moduleConfig.OptionsConfigurer != null)
{
//自定义配置
rebusConfig.Options(moduleConfig.OptionsConfigurer);
} rebusConfig.Options(c =>
{
c.SetMaxParallelism(moduleConfig.MaxParallelism);
c.SetNumberOfWorkers(moduleConfig.NumberOfWorkers);
}); if (moduleConfig.MessageAuditingEnabled)
{
//消息审计队列名称
rebusConfig.Options(o => o.EnableMessageAuditing(moduleConfig.MessageAuditingQueueName));
} var mqMessageTypes = new List<Type>();
//通过反射取到所有继承IHandleMessages的类进行消息订阅
foreach (var assembly in moduleConfig.AssemblysIncludeRebusMqMessageHandlers)
{
IocManager.IocContainer.AutoRegisterHandlersFromAssembly(assembly); mqMessageTypes.AddRange(assembly.GetTypes()
.Where(t => t.GetInterfaces().Any(i => i.IsGenericType && i.GetGenericTypeDefinition() == typeof(IHandleMessages<>)))
.SelectMany(t => t.GetInterfaces())
.Distinct()
.SelectMany(t => t.GetGenericArguments())
.Distinct());
}
//这个就是配置使用RabbitMq进行消息通信的方法,具体的去看Rebus上的文档
_bus = rebusConfig.Transport(c => c.UseRabbitMq(moduleConfig.ConnectString, moduleConfig.QueueName)).Start(); //Subscribe messages
mqMessageTypes = mqMessageTypes.Distinct().ToList(); foreach (var mqMessageType in mqMessageTypes)
{
_bus.Subscribe(mqMessageType);
}
}

模块的使用

找到你需要引用模块的地方,如下图

 
添加依赖

然后进行对应的配置

 
image.png

里面的RabbitMqUrl是你本地RabbitMq的访问地址,比如我的是amqp://guest:guest@127.0.0.1:5672/

接下来就是如何使用进行消息的发送和处理

像其它的EventBus一样,需要先建立EventData

 public class Test
{
public string Name { get; set; }
}

然后是EventHander

public class TestHandler : EventDataConsumerHandlerBase<Test>
{
public override Task Handle(Test message)
{
//这里就是写你需要对message进行怎样的处理
return base.Handle(message);
}
}

最后就是发布,我这里是在AppService里面进行消息的发送

 #region 构造函数
private readonly IRepository<BaseItem> _baseItemRepository;
private readonly ICacheManager _cacheManager;
private readonly IMqMessagePublisher _iMqMessagePublisher;//依赖注入
public BaseItemAppService(IRepository<BaseItem> baseItemRepository, ICacheManager cacheManager, IMqMessagePublisher iMqMessagePublisher) : base(baseItemRepository)
{
this._cacheManager = cacheManager;
this._baseItemRepository = baseItemRepository;
_iMqMessagePublisher = iMqMessagePublisher;
}
#endregion #region 增删改查 protected override IQueryable<BaseItem> CreateFilteredQuery(BaseItemSearchDto input)
{
//消息的发布
_iMqMessagePublisher.Publish(new Test { Name = "123" });
return base.CreateFilteredQuery(input)
.WhereIf(input.DisplayName.IsNotNullOrEmpty(), m => m.DisplayName.Contains(input.DisplayName))
.WhereIf(input.TypeId != null, m => m.TypeId == input.TypeId);
}
#endregion

这样就可以了

我讲的不是很详细(我表达能力不行),大家可以去直接看我的代码,我就做了简单的封装不是很麻烦。大家可能会问我集成这个之后的业务场景是什么?我就把我用到的讲下吧:

  • 订单的处理:同一时间可能有很多个订单,这时可以把他发布到队列中一个一个推送进行处理,而且未标记完成的订单,就算你程序报错了,他也会自动重新推送好像默认是5次
  • 扫码入库的时候:仓库管理员扫码入库的速度是很快的,但后台程序需要一个比对操作比较耗时,这时候也可以把扫的码加入到队列中慢慢处理。

Rebus我研究不多,有些隐藏的好东西我可能暂时没加入,希望能多提点提点。。还有服务总线是啥?

最后附上几个地址:

作者:邵佳楠
链接:https://www.jianshu.com/p/5961bc5e556d
来源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

Rebus消息总线的更多相关文章

  1. 分布式消息总线,基于.NET Socket Tcp的发布-订阅框架之离线支持,附代码下载

    一.分布式消息总线以及基于Socket的实现 在前面的分享一个分布式消息总线,基于.NET Socket Tcp的发布-订阅框架,附代码下载一文之中给大家分享和介绍了一个极其简单也非常容易上的基于.N ...

  2. 分享一个分布式消息总线,基于.NET Socket Tcp的发布-订阅框架,附代码下载

    一.分布式消息总线 在很多MIS项目之中都有这样的需求,需要一个及时.高效的的通知机制,即比如当使用者A完成了任务X,就需要立即告知使用者B任务X已经完成,在通常的情况下,开发人中都是在使用者B所使用 ...

  3. EBS 消息总线

    http://www.ibm.com/developerworks/cn/webservices/ws-whyesb/ 开发人员为何需要企业服务总线? 本文不仅仅是为架构师准备的:使用企业服务总线 ( ...

  4. 使用SignalR为FineUI/Webform打造消息总线

    第一次写博客,语言组织能力不好,请大家多多包涵! 效果图如下: 图片的右下角即为SignalR消息总线的消息框. 一.建立SignalR服务端 第一步:打开一个空的FineUI 4.5空项目文件,在空 ...

  5. 开源消息总线ActiveMQ

    一.消息中间件MOM(Message-Oriented Middleware) 消息中间件是解决异步分布式系统中通讯和排队问题的中间件技术.它利用高效可靠的消息传递机制进行平台无关的数据交流,并基于数 ...

  6. 使用SignalR打造消息总线

    使用SignalR为FineUI/Webform打造消息总线 第一次写博客,语言组织能力不好,请大家多多包涵! 效果图如下: 图片的右下角即为SignalR消息总线的消息框. 一.建立SignalR服 ...

  7. springcloud(九):配置中心和消息总线(配置中心终结版)

    我们在springcloud(七):配置中心svn示例和refresh中讲到,如果需要客户端获取到最新的配置信息需要执行refresh,我们可以利用webhook的机制每次提交代码发送请求来刷新客户端 ...

  8. SpringCloud实战8-Bus消息总线

    好了现在我们接着上一篇的随笔,继续来讲.上一篇我们讲到,我们如果要去更新所有微服务的配置,在不重启的情况下去更新配置,只能依靠spring cloud config了,但是,是我们要一个服务一个服务的 ...

  9. SpringCloud学习系列之五-----配置中心(Config)和消息总线(Bus)完美使用版

    前言 在上篇中介绍了SpringCloud Config的使用,本篇则介绍基于SpringCloud(基于SpringBoot2.x,.SpringCloud Finchley版)中的分布式配置中心( ...

随机推荐

  1. css3线性渐变兼容

    火狐浏览器: background:-moz-linear-gradient(top, red, rgba(0, 0, 255, 0.5)); 谷歌: .l6{background: -webkit- ...

  2. laravel基础课程---13、数据库基本操作2(lavarel数据库操作和tp对比)

    laravel基础课程---13.数据库基本操作2(lavarel数据库操作和tp对比) 一.总结 一句话总结: 非常非常接近:也是分为两大类,原生SQL 和 数据库链式操作 学习方法:使用时 多看手 ...

  3. ffmpeg截取视频

    ffmpeg -i ./suen071520.mp4 -vcodec copy -acodec copy -ss 00:55:00 -to 01:14:50 ./suen071520sp3.mp4-- ...

  4. SpringMVC拦截器的配置与使用详解

         一.SpringMVC拦截器简介      Spring MVC的处理器拦截器类似于Servlet开发中的过滤器Filter,用于对处理器进行预处理和后处理.在springmvc中,定义拦截 ...

  5. nginx中共享内存的使用

    在nginx的进程模型下,类似流量统计.流量控制.数据共享.等需要多个工作进程共同配合完成任务,共享内存是一个重要的进程通讯的方案.本文介绍在nginx的代码中与共享内存相关的功能,包括ngx_shm ...

  6. poj1637 Sightseeing tour[最大流+欧拉回路]

    混合图的欧拉回路定向问题. 顺便瞎说几句,有向图定欧拉回路的充要条件是每个点入度等于出度,并且图联通.无向图的话只要联通无奇点即可. 欧拉路径的确定应该是无向图联通且奇点数0个或2个,有向图忘了,好像 ...

  7. 使用Tornado作为Django App的服务器

    闲来无事,折腾折腾. 老是听说tonado是个异步web框架和服务器,作为框架倒是了解到了,但是服务器一直不太懂.所以决定了解一下,既然可以做服务器,那就把自己的django app部署到这上边去. ...

  8. CF285 E Positions in Permutations——“恰好->大于”的容斥和允许“随意放”的dp

    题目:http://codeforces.com/contest/285/problem/E 是2018.7.31的一场考试的题,当时没做出来. 题解:http://www.cnblogs.com/y ...

  9. 1.改变项目 动态库、静态库属性。 2.使用运行库 /MD、/MT、/LD说明

    /MD./MT./LD(使用运行库) 有关 C 运行库以及使用 /clr(公共语言运行时编译) 进行编译时要使用哪些库的更多信息,请参见 CRT 库功能. 传递给链接器的给定调用的所有模块都必须使用相 ...

  10. [poj1811]Prime Test(Pollard-Rho大整数分解)

    问题描述:素性测试兼质因子分解 解题关键:pollard-rho质因数分解,在RSA的破译中也起到了很大的作用 期望复杂度:$O({n^{\frac{1}{4}}})$ #include<cst ...