Shuttle ESB实现消息推送
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实现消息推送的更多相关文章
- SignalR快速入门 ~ 仿QQ即时聊天,消息推送,单聊,群聊,多群公聊(基础=》提升)
SignalR快速入门 ~ 仿QQ即时聊天,消息推送,单聊,群聊,多群公聊(基础=>提升,5个Demo贯彻全篇,感兴趣的玩才是真的学) 官方demo:http://www.asp.net/si ...
- 【原创分享·微信支付】C# MVC 微信支付之微信模板消息推送
微信支付之微信模板消息推送 今天我要跟大家分享的是“模板消息”的推送,这玩意呢,你说用途嘛,那还是真真的牛逼呐.原因在哪?就是因为它是依赖微信生存的呀,所以他能不 ...
- 基于SignalR的消息推送与二维码描登录实现
1 概要说明 使用微信扫描登录相信大家都不会陌生吧,二维码与手机结合产生了不同应用场景,基于二维码的应用更是比较广泛.为了满足ios.android客户端与web短信平台的结合,特开发了基于Singl ...
- C# BS消息推送 SignalR介绍(一)
1. 前言 本文是根据网上前人的总结得出的. 环境: SignalR2.x,VS2015,Win10 介绍 1)SignalR能用来持久客户端与服务端的连接,让我们便于开发一些实时的应用,例如聊天室在 ...
- iOS 之消息推送(个推)---个人小结
前言:自从上个星期开始整这个推送,弄了差不多一个星期,今天终于给整好了,因此现在来记录这段"奇妙"的旅程. 我们公司使用的消息推送是用的第三方--个推,这里不得不说一下,个推的技术 ...
- WebSocket与消息推送
B/S结构的软件项目中有时客户端需要实时的获得服务器消息,但默认HTTP协议只支持请求响应模式,这样做可以简化Web服务器,减少服务器的负担,加快响应速度,因为服务器不需要与客户端长时间建立一个通信链 ...
- 分分钟搞定IOS远程消息推送
一.引言 IOS中消息的推送有两种方式,分别是本地推送和远程推送,本地推送在http://my.oschina.net/u/2340880/blog/405491这篇博客中有详细的介绍,这里主要讨论远 ...
- 基于ajax与msmq技术的消息推送功能实现
周末在家捣鼓了一下消息推送的简单例子,其实也没什么技术含量,欢迎大伙拍砖.我设计的这个推送demo是基于ajax长轮询+msmq消息队列来实现的,具体交互过程如下图: 先说说这个ajax长轮询,多长时 ...
- C# BS消息推送 SignalR Hubs环境搭建与开发(二)
1. 前言 本文是根据网上前人的总结得出的. 环境: SignalR2.x,VS2015,Win10 2. 开始开发 1)新建一个MVC项目,叫做SignalRDemo 2)安装SignalR包 In ...
随机推荐
- 自己定义控件三部曲之动画篇(十三)——实现ListView Item进入动画
前言:宝剑锋从磨砺出,梅花香自苦寒来 相关文章: <Android自己定义控件三部曲文章索引>: http://blog.csdn.net/harvic880925/article/det ...
- [JavaEE]Hibernate 所有缓存机制详解
Hibernate提供的一级缓存 hibernate是一个线程对应一个session,一个线程可以看成一个用户.也就是说session级缓存(一级缓存)只能给一个线程用,别的线程用不了,一级缓存就是和 ...
- 基于macOS+VMware的GNS3内VM上公网
笔者经常需要做网络实验,GNS3就是笔者最喜欢用的模拟器,为了便于实验,需要能从macos上直接ssh登陆模拟出来的vm,并且vm需要上公网.经过研究,已解决此问题,并以此分享出来 tag: maco ...
- 在eclipse环境下使用maven install 命令碰到native2ascii-utf8问题解决方案
报错语句:Failed to execute goal org.codehaus.mojo:native2ascii-maven-plugin:1.0-beta-1:native2ascii (nat ...
- 谈谈javascript中原型继承
什么是继承?拿来主义:自己没有,别人有,把别人的拿过来使用或者让其成为自己的 如何实现继承的方式 原型继承 混入继承 经典继承 1. 混入继承 由于一个对象可以继承自任意的对象,即:o可以继承自对象o ...
- 使用JS&jQuery改善用户体验
第一章 JavaScript基本语法 一.运算符 运算符就是完成操作的一系列符号,它有七类: 赋值运算符(=,+=,-=,*=,/=,%=,<<=,>>=,|=,&= ...
- Android设计模式——工厂方法模式
1.定义:工厂方法模式就是定义一个用于创建对象的接口,让子类决定实例化哪个类. 2.看代码: 产品抽象类 public abstract class Product { /** * 产品类抽象方法 * ...
- HTMLWEST网页特效大全
网页特效大全网:www.htmlwest.com 收藏一下,很不错的站.
- JQurey大纲
- ABBYY简体中文版终身授权半价来袭,真的是5折!
经过了一个春秋,心心念念的双十一终于要来了,一年时间并不长,但这一个月尤其慢!ABBYY官方称为回馈广大用户的支持与厚爱,双十一期间,ABBYY价格感人,诱惑难挡. 说到双十一活动,方式也是五花八门, ...