zoukankan      html  css  js  c++  java
  • 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。  

  • 相关阅读:
    HDOJ 1846 Brave Game
    并查集模板
    HDU 2102 A计划
    POJ 1426 Find The Multiple
    POJ 3278 Catch That Cow
    POJ 1321 棋盘问题
    CF 999 C.Alphabetic Removals
    CF 999 B. Reversing Encryption
    string的基础用法
    51nod 1267 4个数和为0
  • 原文地址:https://www.cnblogs.com/cxchanpin/p/6950128.html
Copyright © 2011-2022 走看看