Shuttle ESB实现局域网消息推送

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。

时间: 2024-10-29 19:11:51

Shuttle ESB实现局域网消息推送的相关文章

Android 消息推送 Xmpp协议

1.引言 所谓的消息推送就是从服务器端向移动终端发送连接,传输一定的信息.比如一些新闻客户端,每隔一段时间收到一条或者多条通知,这就是从服务器端传来的推送消息:还比如常用的一些IM软件如微信.GTalk等,都具有服务器推送功能. 推送方法如下: 1)通过SMS进行服务器端和客户端的交流通信. 在Android平台上,你可以通过拦截SMS消息并且解析消息内容来了解服务器的意图,可以实现完全的实时操作.但是问题是这个方案的成本相对比较高,且依赖于运营商. 2)循环主动定时获取 这种方法需要客户端来做

Android第三方消息推送

====================问题描述==================== 我看现在第三方的消息推送怎么都是从网页推到手机上的?有没有从手机到手机的,即时聊天那样的?有哪些? ====================解决方案1==================== 终端直接一般依靠服务器实现,如果终端不经过服务器中转,那就不能实现广域网通讯.终端之间可以通过udp广播实现局域网内消息推送. ====================解决方案2====================

物联网核心协议—消息推送技术演进

消息触达能力是物联网(internet ofthings, IOT)的重要支撑,而物联网很多技术都源于移动互联网.本文阐述移动互联网消息推送技术在物联网中的应用和演进. 一.物联网架构和关键技术 从开发的角度,无线接入是物联网设备端的核心技术,身份设备管理和消息推送技术是物联网云端的核心技术.而从场景体验的角度,除了前者,还要包括手机的前端开发技术. 在上一篇<一张图读懂基于微信硬件平台的物联网架构>博文中,笔者曾用一张大图详细描述了基于微信硬件平台的物联网架构的组成要素.关键场景.和通信协议

atitit.极光消息推送服务器端开发实现推送&#160;&#160;jpush&#160;v3.&#160;总结o7p

atitit.极光消息推送服务器端开发实现推送  jpush v3. 总结o7p 1. 推送所设计到底功能1 1.1. 内容压缩1 1.2. 多引擎1 2. reg  ,设置appkey and pwdkey1 3. 下载server  sdk   v31 4. push推送样例1 5. Code3 1. 推送所设计到底功能 1.1. 内容压缩 1.2. 多引擎 2. reg  ,设置appkey and pwdkey 3. 下载server  sdk   v3 https://github.c

微信小程序开发:设置消息推送

开发设置中,启用并设置消息推送配置后,用户发给小程序的消息以及开发者需要的事件推送,都将被微信转发至该服务器地址中. 不过照着说明去操作,即使按照最简单的明文方式去设置,还是提示Token验证失败.仔细研究说明,其实服务器验证过程很简单,用Get发来一个连接,然后在自己的页面中去检验,不想做也可以先不做,直接返回echostr即可.关键在,怎么返回,开始我还以为必须要按照xml或者json返回,试了半天,其实很简单,清空所有其他输出,直接返回echostr即可. Response.Clear()

redis 学习 五 消息推送

<?php header('content-type:text/html;chaeset=utf-8'); /** * redis实战 * * 发布 * * @example php publish.php */ //发布 $redis = new \Redis(); $redis->connect('127.0.0.1', 6379); $redis->publish('msg', '来自msg频道的推送'); echo "msg频道消息推送成功- \n"; $re

Android消息推送:手把手教你集成小米推送

前言 在Android开发中,消息推送功能的使用非常常见. 为了降低开发成本,使用第三方推送是现今较为流行的解决方案. 今天,我将手把手教大家如何在你的应用里集成小米推送 该文档基于小米推送官方Demo,并给出简易推送Demo 看该文档前,请先阅读我写的另外两篇文章: 史上最全解析Android消息推送解决方案 Android推送:第三方消息推送平台详细解析 目录 1. 官方Demo解析 首先,我们先对小米官方的推送Demo进行解析. 请先到官网下载官方Demo和SDK说明文档 1.1 Demo

MPush开源消息推送系统:简洁、安全、支持集群

引言 由于之前自己团队需要一个消息推送系统来替换JPUSH,一直找了很久基本没有真正可用的开源系统 所有就直接造了个轮子,造轮子的时候就奔着开源做打算的,只是后来创业项目失败一直没时间整理 这一套代码,最近比较闲就拿出来给开源做点贡献. 作为Java版的开源推送系统,MPUSH还是有很多不错的设计的,特别是对想自己搭建一套推送系统的团队 是有很大的借鉴意义的.当然开源出来也是不想曾经做过的工作白白浪费掉,特别希望对这方面有兴趣的同学 来一起把这套东西做的更好,服务更多的用户! 项目主页 http

AngularJS+ASP.NET MVC+SignalR实现消息推送

原文:http://www.mincoder.com/article/4565.shtml 背景 OA管理系统中,员工提交申请单,消息实时通知到相关人员及时进行审批,审批之后将结果推送给用户. 技术选择 最开始发现的是firebase,于是很兴奋的开始倒腾起来.firebase用 起来倒是简单:引用一个js即可,按官网上的教程很快便应用到了项目中.第二天打开项目发现推送功能不好使了,这是为何?最后发现firebase官网打 不开了...难道firebase被google收了也会被天朝给墙掉?也许