Shuttle ESB实现消息推送

news/2025/1/12 0:48:43/

      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><inboxworkQueueUri="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。  

转载于:https://www.cnblogs.com/cxchanpin/p/6950128.html


http://www.ppmy.cn/news/869734.html

相关文章

usaco Shuttle Puzzle

有个2*N1的线性的棋盘&#xff0c;开始时最左边全是白&#xff0c;右边全是黑&#xff0c;中间一个空格。目标是黑白全部互换。求输出最少步数的操作的棋子的下标。并且要字典序最小的。 980ms险过。 不判重700ms能过。我居然多此一举的用map判重。 /* ID: modengd1 PROG: shut…

阿里云Elasticsearch搜索服务框架Shuttle

随着阿里云生态的蓬勃发展&#xff0c;我们看到越来越多的开发者开始基于ECS体系开发自己的分布式应用。的确&#xff0c;阿里云ECS提供的弹性云计算服务、多样化的规格配置支持、安全网络隔离等多种灵活便利的一站式服务&#xff0c;大大降低了用户开发新应用的技术门槛与成本…

[Usaco2009 Feb]庙会捷运Fair Shuttle

Description 公交车一共经过N&#xff08;1<N<20000&#xff09;个站点&#xff0c;从站点1一直驶到站点N。K&#xff08;1<K<50000)群奶牛希望搭乘这辆公交车。第i群牛一共有Mi&#xff08;1<Mi<N)只. 他们希望从Si到Ei去。 公交车只能座C&#xff08;1&…

Usaco Training Section 4.4 Shuttle Puzzle

要将W...W_B...B变成B...B_W...W&#xff0c;每次可以1、交换空格和相邻格&#xff1b;2、你可以把一个棋子跳过一个(仅一个)与它不同色的棋子到达空格。用最少步数&#xff0c;打印出每次移动的棋子&#xff08;最小的一组解&#xff09; 直接dfs&#xff0c;要优化。很明显W…

MapReduce中Shuttle过程的理解

MapReduce中Shuttle过程的理解--转自&#xff1a;http://langyu.iteye.com/blog/992916 Shuffle过程是MapReduce的核心&#xff0c;也被称为奇迹发生的地方。要想理解MapReduce&#xff0c; Shuffle是必须要了解的。我看过很多相关的资料&#xff0c;但每次看完都云里雾里的绕着…

USACO 4.4 Shuttle Puzzle(数学)

2015-03-25 22:21:59 思路&#xff1a;一道找规律的题... 一开始没啥思路&#xff0c;看了别人博客才知道... N3&#xff1a;3 5 6 4 2 1 3 5 7 6 4 2 3 5 4 差&#xff1a; 2 1 -2 -2 -1 2 2 2 -1 -2 -2 1 2 -1 N4&#xff1a;4 6 7 5 3 2 4 6 8 9 7 5 3 1 2 4 6 8 7 5 3 4 6…

R语言基于MASS包中的shuttle数据集以及neuralnet包构建神经网络模型

R语言基于MASS包中的shuttle数据集以及neuralnet包构建神经网络模型 目录 R语言基于MASS包中的shuttle数据集以及neuralnet包构建神经网络模型

Shuttle ESB(三)——架构模型介绍(2)

上一篇文章中&#xff0c;介绍了Shuttle ESB架构模型中的三个重要部分。 今天&#xff0c;我们继续介绍剩余的三个内容&#xff1a;模式和消息路由。 四、模式 Request/Response(请求/响应模式) 对基于Request/Response消息机制的内容。你能够看WiKi的一些文章&#xff1a;http…