ESB全称Enterprise Service Bus,即企业服务总线。它是传统中间件技术与XML、Web服务等技术结合的产物。
ESB的出现改变了传统的软件架构,可以提供比传统中间件产品更为廉价的解决方案,同时它还可以消除不同应用之间的技术差异,让不同的应用服务器协调运作,实现了不同服务之间的通信与整合。
看吧,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。