ESB全称Enterprise Service Bus,即企业服务总线。它是传统中间件技术与XML、Web服务等技术结合的产物。

ESB的出现改变了传统的软件架构,能够提供比传统中间件产品更为便宜的解决方式。同一时候它还能够消除不同应用之间的技术差异,让不同的应用server协调运作,实现了不同服务之间的通信与整合。

看吧,ESB的功能是如此强大。

在java中经常使用的是Mule ESB。而到了.Net,Shuttle ESB作为一种新生的ESB正在慢慢的被人们所接受。以下通过一个实例解说Shuttle ESB的创建过程及推送原理。

1.我们须要引入Shuttle ESB相关的类库-Shuttle.Core.Data、Shuttle.Core.Domain、Shuttle.Core.Host、Shuttle.Core.Infranstructure、Shuttle.ESB.Core、Shuttle.ESB.Msmq、Shuttle.ESB.SqlServer。为了保证版本号统一,我们能够在VS中安装NuGet插件下载Shuttle
ESB须要的类库;

2.在Pub端加入Shuttle ESB配置文件app.config,Shuttle ESB通过配置文件读取数据库内容。获得须要推送数据的Sub端工作队列Uri及Sub端能够接受的消息类型,配置内容例如以下:

<?xml version="1.0"?>
<configuration>
<configSections>
<section name="serviceBus" type="Shuttle.ESB.Core.ServiceBusSection, Shuttle.ESB.Core"/>
<section name="sqlServer" type="Shuttle.ESB.SqlServer.SqlServerSection, Shuttle.ESB.SqlServer"/>
</configSections>
<appSettings>
<add key="SubscriptionManagerSecured" value="false"/>
</appSettings>
<connectionStrings>
<clear/>
<add name="SubscriptionConnection" connectionString="Uid=sa;Pwd=123456;Initial Catalog=shuttle;Data Source=172.22.51.180;Connect Timeout=900" providerName="System.Data.SqlClient"/>
</connectionStrings>
<sqlServer subscriptionManagerConnectionStringName="SubscriptionConnection"/>
<serviceBus>
<inbox
workQueueUri="msmq://./pubsub-publish-inbox-work"
deferredQueueUri="msmq://./pubsub-publish-inbox-deferred"
errorQueueUri="msmq://./shuttle-pubsub-error"/>
</serviceBus>
<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/></startup>
</configuration>

3.在Pub端启一个Bus。用于推送数据:

            //连接数据库
new ConnectionStringService().Approve();
//配置信息
subscriptionManager = SubscriptionManager.Default(); //创建 消息通道
bus = ServiceBus
.Create(c => c.SubscriptionManager(subscriptionManager))
.Start(); Console.WriteLine();
ColoredConsole.WriteLine(ConsoleColor.Green, "Server bus started. Press CTRL+C to stop.");

Bus创建完毕后。通过bus.Publish方法完毕向Sub端的消息推送。

4.在Sub端加入Shuttle ESB配置文件app.config,Shuttle ESB通过配置文件向数据库写入当前Sub端能够接收的消息类型及当前工作队列的Uri。

Pub端通过Sub端写入到数据库的消息类型和工作队列Uri推断是否向某一Sub端发送某种类型的数据,Sub端的配置文件例如以下:

<?xml version="1.0"?

>
<configuration>
<configSections>
<section name="serviceBus" type="Shuttle.ESB.Core.ServiceBusSection, Shuttle.ESB.Core"/>
</configSections>
<connectionStrings>
<clear/>
<add name="Subscription" connectionString="Uid=sa;Pwd=123456;Initial Catalog=shuttle;Data Source=172.22.51.180;Connect Timeout=900" providerName="System.Data.SqlClient"/>
</connectionStrings>
<serviceBus>
<inbox
workQueueUri="msmq://./pubsub-subscriber1-inbox-work"
errorQueueUri="msmq://./shuttle-pubsub-error"/>
</serviceBus>
<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/></startup>
</configuration>

5.在Sub端启一个Bus用于接收Pub端推送的数据。

            //连接数据库
new ConnectionStringService().Approve(); //配置信息
subscriptionManager = SubscriptionManager.Default();
/*
* 配置接收消息的类型:
* 风报警解除、雨报警解除、雪报警解除、异物报警解除、地震报警解除
*
* 远程实验三个实体
*/
subscriptionManager.Subscribe(
new[] {
typeof(WindInfoAlarmEntity).FullName,
typeof(RainInfoAlarmEntity).FullName,
typeof(SnowInfoAlarmEntity).FullName,
typeof(FreignMatterAlarmEntity).FullName,
typeof(EarthquakeAlarmEntity).FullName,
typeof(String).FullName
}
); //创建 消息通道
bus = ServiceBus
.Create(c => c.SubscriptionManager(subscriptionManager))
.Start(); Console.WriteLine();
ColoredConsole.WriteLine(ConsoleColor.Green, "Server bus started. Press CTRL+C to stop.");

在Bus中说明,当前Sub端能够处理的数据类型,比方WindInfoAlarmEntity类型、String类型。

6.在Sub端建立相应的handler,通过泛型限制接收不同类型的数据推送。处理String类型的handler例如以下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Shuttle.ESB.Core;
using Shuttle.Core.Infrastructure;
using ICT.MainFramework.ViewEntity;
using ICT.RCS.Server.ESB;
namespace PublishSubscribe.Subscriber1
{
public class WindRainSnowStrHandler : IMessageHandler<String>
{
public void ProcessMessage(HandlerContext<String> context)
{
string strType = context.Message.Split('#')[0].ToString(); //ESB接收处理消息
MessageTransfer.transferDataToEntity(MainServerForm.bus, context.Message);
}
public bool IsReusable
{
get { return true; }
}
}
}

为了解决离线数据推送。Shuttle ESB用MSMQ作为消息队列。将待处理的消息缓存到MSMQ中。

  到此Shuttle ESB的Pub端和Sub端创建完成,执行效果为Pub端通过bus公布一个消息后,局域网内已经在数据库的工作队列Uri中注冊过,且符合对应消息类型的Sub端均能够接收到Pub端公布的消息,观察者模式的完美运用。

Shuttle ESB的原理明确了。Mule ESB、JBoss ESB也就一看就懂。

希望我的解说能帮助大家进一步认识Shuttle ESB。

Shuttle ESB实现消息推送的更多相关文章

  1. SignalR快速入门 ~ 仿QQ即时聊天,消息推送,单聊,群聊,多群公聊(基础=》提升)

     SignalR快速入门 ~ 仿QQ即时聊天,消息推送,单聊,群聊,多群公聊(基础=>提升,5个Demo贯彻全篇,感兴趣的玩才是真的学) 官方demo:http://www.asp.net/si ...

  2. 【原创分享·微信支付】C# MVC 微信支付之微信模板消息推送

    微信支付之微信模板消息推送                    今天我要跟大家分享的是“模板消息”的推送,这玩意呢,你说用途嘛,那还是真真的牛逼呐.原因在哪?就是因为它是依赖微信生存的呀,所以他能不 ...

  3. 基于SignalR的消息推送与二维码描登录实现

    1 概要说明 使用微信扫描登录相信大家都不会陌生吧,二维码与手机结合产生了不同应用场景,基于二维码的应用更是比较广泛.为了满足ios.android客户端与web短信平台的结合,特开发了基于Singl ...

  4. C# BS消息推送 SignalR介绍(一)

    1. 前言 本文是根据网上前人的总结得出的. 环境: SignalR2.x,VS2015,Win10 介绍 1)SignalR能用来持久客户端与服务端的连接,让我们便于开发一些实时的应用,例如聊天室在 ...

  5. iOS 之消息推送(个推)---个人小结

    前言:自从上个星期开始整这个推送,弄了差不多一个星期,今天终于给整好了,因此现在来记录这段"奇妙"的旅程. 我们公司使用的消息推送是用的第三方--个推,这里不得不说一下,个推的技术 ...

  6. WebSocket与消息推送

    B/S结构的软件项目中有时客户端需要实时的获得服务器消息,但默认HTTP协议只支持请求响应模式,这样做可以简化Web服务器,减少服务器的负担,加快响应速度,因为服务器不需要与客户端长时间建立一个通信链 ...

  7. 分分钟搞定IOS远程消息推送

    一.引言 IOS中消息的推送有两种方式,分别是本地推送和远程推送,本地推送在http://my.oschina.net/u/2340880/blog/405491这篇博客中有详细的介绍,这里主要讨论远 ...

  8. 基于ajax与msmq技术的消息推送功能实现

    周末在家捣鼓了一下消息推送的简单例子,其实也没什么技术含量,欢迎大伙拍砖.我设计的这个推送demo是基于ajax长轮询+msmq消息队列来实现的,具体交互过程如下图: 先说说这个ajax长轮询,多长时 ...

  9. C# BS消息推送 SignalR Hubs环境搭建与开发(二)

    1. 前言 本文是根据网上前人的总结得出的. 环境: SignalR2.x,VS2015,Win10 2. 开始开发 1)新建一个MVC项目,叫做SignalRDemo 2)安装SignalR包 In ...

随机推荐

  1. js面向对象编程: js类定义函数时prototype和this差别?

    在面向对象编写js脚本时,定义实例方法主要有两种 例如以下: function ListCommon2(afirst) { var first=afirst; this.do1=function () ...

  2. Android圆角Tag控件的另类实现

    一般的圆角标签控件都是用xml设置shape做实现.可是假设我们想要做一个更加强大通用的的圆角控件,不须要使用者去关心圆角,仅仅设置背景就能够了. 应该怎么实现呢?这个就须要把背景先设置成图片,然后再 ...

  3. ASP.NET六大巨头——内置对象(1)

    ASP.NET提供了六个内置对象:Request.Response.Application.Session.Server和Cookie.这些对象收集当前应用程序请求.用户信息.响应浏览器信息,来完毕页 ...

  4. Android系统编译【转】

    本文转载自;http://blog.csdn.net/zirconsdu/article/details/8005415 Android编译系统分析 概要 由于android编译系统的复杂和使用了不熟 ...

  5. dns tunnel工具地址

  6. 编译最新版webrtc源码和编译好的整个项目10多个G【分享】

    编译最新版webrtc源码和编译好的整个项目10多个G[分享] 参考https://webrtc.org/native-code/development/编译最新版webrtc源码: Git clon ...

  7. 14. Longest Common Prefix[E]最长公共前缀

    题目 Write a function to find the longest common prefix string amongst an array of strings. If there i ...

  8. caffe mnist实例 --lenet_train_test.prototxt 网络配置详解

    1.mnist实例 ##1.数据下载 获得mnist的数据包,在caffe根目录下执行./data/mnist/get_mnist.sh脚本. get_mnist.sh脚本先下载样本库并进行解压缩,得 ...

  9. java导出html页面

    http://blog.csdn.net/zhyh1986/article/details/8727523#t6 http://blog.csdn.net/zuozuofuwaiwai/article ...

  10. [实验楼]python11期--NO.1(未完成)

    tuple 是 Python 的一种不可变数据类型,用于列表数据一旦初始化就不会再修改的场景.tuple 只能通过位置索引去访问里面的元素,但有时候我们需要给每个元素取个别名,以便通过别名去获取对应的 ...