Shuttle ESB實現消息推送

      ESB全稱Enterprise Service Bus,即企業服務總線。它是傳統中間件技術與XML、Web服務等技術結合的產物。html

 ESB的出現改變了傳統的軟件架構,可以提供比傳統中間件產品更爲便宜的解決方式。同一時候它還可以消除不一樣應用之間的技術差別,讓不一樣的應用server協調運做,實現了不一樣服務之間的通訊與整合。java

  看吧,ESB的功能是如此強大。sql

在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。app

Pub端經過Sub端寫入到數據庫的消息類型和工做隊列Uri推斷是否向某一Sub端發送某種類型的數據,Sub端的配置文件例如如下:ide

<?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>post

    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例如如下:spa

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。  

相關文章
相關標籤/搜索