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 ...
随机推荐
- c#基于udp实现的p2p语音聊天工具
原创性申明 此博文的出处 为 http://blog.csdn.net/zhujunxxxxx/article/details/40124773假设进行转载请注明出处.本文作者原创,邮箱zhujunx ...
- [Angular] Upgrade existing Angular app to Progressive Web App
If you alread have an existing Angular application and want to upgrade to progressive web app. 1. In ...
- HDU 2874 LCA离线算法 tarjan算法
给出N个点,M条边.Q次询问 Q次询问每两点之间的最短距离 典型LCA 问题 Marjan算法解 #include "stdio.h" #include "strin ...
- SecureCRT学习之道:SecureCRT 经常使用技巧
快捷键: 1. ctrl + a : 移动光标到行首 2. ctrl + e :移动光标到行尾 3. ctrl + d :删除光标之后的一个字符 4. ctrl + w : 删除行首到当前光标所在位 ...
- edit filter rules in sql source control
https://documentation.red-gate.com/soc6/common-tasks/exclude-objects-using-filters 如果有人上传了filter,nam ...
- wamp openssl
在这一章节里, 我记录了一下如何在 wamp 环境下配置 ssl 前提条件 在设置 Apache + SSL 之前, 需要确认 Apache 已经安装并可以正常工作. 并且 ssl 需要的文件在如下的 ...
- Windows下慎用内核隔离
1. 开启内核隔离后只能通过注册表关闭 2. 开启内核隔离后, 默认会启动hybrid-v, 这个东西和虚拟机是冲突的, 这样就用不了虚拟机了. 3. 解决方法: 关闭内核隔离后, 再关闭已经 ...
- javascript中常用数组方法详细讲解
javascript中数组常用方法总结 1.join()方法: Array.join()方法将数组中所以元素都转化为字符串链接在一起,返回最后生成的字符串.也可以指定可选的字符串在生成的字符串中来分隔 ...
- 关于Android对话框简单实用方法总结
要显示一个对话框,首先需要在xx.xml下添加一个Button按钮,并添加一个对应id. 单次点击事件对话框: button.setOnClickListener(new View.OnClickLi ...
- C++中关于文本内容的实用操作集合(新)(添加一些关于文件流的介绍)
首先先给大家一个链接:http://baike.baidu.com/view/1679747.htm 主要是关于ios的使用,头文件要include<ios>,然后就可以调用下面的一些操作 ...