• 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。  

  • 相关阅读:
    臭氧总量下载网址
    WRF遇到的问题
    linux 查询硬盘、内存、cpu命令
    降维中的特征选择
    偏最小二乘回归分析建模步骤的R实现(康复俱乐部20名成员测试数据)+补充pls回归系数矩阵的算法实现
    R语言机器学习之caret包运用
    用R语言做数据清理(详细教程)
    RColorBrewer的使用
    VOD, TVOD, SVOD FVOD的区别(转)
    Include promo/activity effect into the prediction (extended ARIMA model with R)
  • 原文地址:https://www.cnblogs.com/cxchanpin/p/6950128.html
Copyright © 2020-2023  润新知