菜鸟初探ActiveMQ

最近在项目中接触了同步平台这么个东西,后来一直想着问问他们,后来想想自己什么也不知道,就去问人家,也不合适,于是决定自己先了解一下,那么就先把我这几天的感受给大家讲一下。

什么事MQ

MQ负责在两个系统之间传递消息,这两个系统可以是异构的,处于不同硬件、不同操作系统、用不同语言编写,只需要简单的调用几个MQ的API,就可以互相通讯,你不必考虑底层系统和网络的复杂性。

简单来讲,就是我可以在不同的地段,即使没有相通的网络,也可以实现他们消息测传输。

为什么要用

说起这个话题,给大家举个例子,大家现在都用支付宝来转账,如果大家把支付宝的钱转到银行卡,那么他会提示你两个小时内到账,其实这就是一个很好的例子,大家的手机和天猫的系统不在一个网络,硬件就更不用说了,那么为什么他们还能实现相互的同信,就是咱们把一个转账的信息,放到一个队列里边,然后支付宝会一个一个处理,想想大家如果用的是WCF,那么大家调用的就是一个接口,如果成千上万的人同时转账,我估计他就该倒闭了,系统面临的就是崩盘呀。

怎么用MQ

首先我们要用人家的API函数,那么就肯定要引用dll了

      给大家一个小例子,大家建一个winForm的程序

1.下载ActiveMQ

官方网站下载地址:http://activemq.apache.org/

2.运行ActiveMQ

解压缩apache-activemq-5.10.0-bin.zip,然后双击apache-activemq-5.10.0\bin\win32\activemq.bat运行ActiveMQ程序。

看见控制台最后一行输出: “access to all MBeans is allowed” 证明启动成功。

启动ActiveMQ以后,可以使用浏览器登陆:http://localhost:8161/admin/验证, 默认用户名是:admin  密码是:admin

(前提是安装好Java环境)

同时下载.net版Dll:Apache.NMS-1.6.0-bin.zip和Apache.NMS.ActiveMQ-1.6.4-bin.zip

都从这里下载:http://archive.apache.org/dist/activemq/apache-nms/1.6.0/

3、银行程序

界面很简单,一个Lable,一个TextBox,一个Button,然后添加Apache.NMS.dll和Apache.NMS.ActiveMQ.dll引用,在上述另外2个下载包里面找,注意版本号。

客户端:输入金额,然后确定转账

using Apache.NMS;
using Apache.NMS.ActiveMQ;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            InitProducer();

        }

        private IConnectionFactory factory = null;
        private void Form1_Load(object sender, EventArgs e)
        {

        }

        public void InitProducer()
        {
            try
            {
                //初始化工厂,这里默认的URL是不需要修改的
                factory = new ConnectionFactory("tcp://localhost:61616");
                //factory = new ConnectionFactory();
            }
            catch
            {
                lbMessage.Text = "初始化失败!!";
            }
        }

        private void btnConfirm_Click(object sender, EventArgs e)
        {
            //通过工厂建立连接
            using (IConnection connection = factory.CreateConnection())
            {
                //通过连接创建Session会话
                using (ISession session = connection.CreateSession())
                {
                    //通过会话创建生产者(转账的人),方法里面new出来的是MQ中的Queue
                    IMessageProducer prod = session.CreateProducer(new Apache.NMS.ActiveMQ.Commands.ActiveMQQueue("firstQueue"));
                    //创建一个发送的消息对象
                    ITextMessage message = prod.CreateTextMessage();
                    //给这个对象赋实际的消息
                    message.Text = txtMessage.Text;
                    //设置消息对象的属性,这个很重要哦,是Queue的过滤条件,也是P2P消息的唯一指定属性
                    message.Properties.SetString("filter", "demo1");
                    //转账的人把消息发送出去,几个枚举参数MsgDeliveryMode是否长链,MsgPriority消息优先级别,发送最小单位,当然还有其他重载
                    prod.Send(message, MsgDeliveryMode.NonPersistent, MsgPriority.Normal, TimeSpan.MinValue);
                    lbMessage.Text = "发送成功!!";
                    txtMessage.Text = "";
                    txtMessage.Focus();
                }
            }

        }

    }
}

服务端

using Apache.NMS;
using Apache.NMS.ActiveMQ;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WindowsFormsApplication2
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            InitConsumer();
        }

        private void Form1_Load(object sender, EventArgs e)
        {

        }

        public void InitConsumer()
        {
            //创建连接工厂
            IConnectionFactory factory = new ConnectionFactory("tcp://localhost:61616");
            //通过工厂构建连接
            IConnection connection = factory.CreateConnection();
            //这个是连接的客户端名称标识
            connection.ClientId = "firstQueueListener";
            //启动连接,监听的话要主动启动连接
            connection.Start();
            //通过连接创建一个会话
            ISession session = connection.CreateSession();
            //通过会话创建一个消费者,这里就是Queue这种会话类型的监听参数设置
            IMessageConsumer consumer = session.CreateConsumer(new Apache.NMS.ActiveMQ.Commands.ActiveMQQueue("firstQueue"), "filter='demo1'");
            //注册监听事件
            consumer.Listener += new MessageListener(consumer_Listener);
            connection.Stop();
            connection.Close();  

        }

        void consumer_Listener(IMessage message)
        {
            ITextMessage msg = (ITextMessage)message;
            //异步调用下,否则无法回归主线程
            tbReceiveMessage.Invoke(new DelegateRevMessage(RevMessage), msg);

        }

        public delegate void DelegateRevMessage(ITextMessage message);

        public void RevMessage(ITextMessage message)
        {
            tbReceiveMessage.Text += string.Format(@"接收到:{0}{1}", message.Text, Environment.NewLine);
        }
    }
}

这样我们就可以实现一个传输数据,另一个人什么时候打开程序,什么时候接收,服务端不用管多少条信息,反正我就从前往后处理就可以。

代码问题

运行这个程序很可能出现:

无法从传输连接中读取数据: 一个封锁操作被对 WSACancelBlockingCall 的调用中断?

无法在流的结尾之外进行读取

的问题,现在我还没有找到解决办法,不过原理是这个原理,如果有大神的话及时帮我解决一下啊,我也会在我的下片博客里边写出这个的解决办法。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-08-25 12:29:49

菜鸟初探ActiveMQ的相关文章

菜鸟vimer成长记——第2.0章、模式初探

首先,其他的文本编辑器只有一种模式,就是插入模式.而vim一下子颠覆了我们的世界观——有好多模式.这个是思维上的切换,很难也很重要!!! 其次,Vim 提供一个区分模式的用户界面.也就是说在不同的模式下相同的键位可能产生的结果不一样.好多快捷怎么记忆?记忆后过段时间不使用又还给vim了.这个是因为没有弄清楚职责和使用场景,没有构建成套的vim知识体系.而我们这里通过模式为载体来构建vim知识体系. 目的 介绍vim的常用模式职责及模式切换,减少由于不断思考和纠正什么场景用什么模式的什么操作而引起

菜鸟学CSS+DIV网页样式与布局——CSS初探

已经学习过HTML和XML来编写网页代码,当你设计好了网页,字体是黑色的,老大过来说改成紫色的,于是你一条一条呼哧呼哧的改好了,老大转了一圈又说,紫色不太好看,还是改成红色的吧!于是你愣了,呼哧呼哧又来了一遍.于是你开始害怕大Boss的再度光临,于是你开始害怕自己辛苦很久出的页面再遭更改-- 一.引入CSS 就像开篇说的,为了应付HTML的变化,为了十分便利的控制页面,加上了CSS可以说是更为灵活,更为方便的应对变化.Web设计者和开发者小心地布好页面,完成所有嵌套的表格后,客户要求进行一点"小

Key/Value之王Memcached初探:三、Memcached解决Session的分布式存储场景的应用

一.高可用的Session服务器场景简介 1.1 应用服务器的无状态特性 应用层服务器(这里一般指Web服务器)处理网站应用的业务逻辑,应用的一个最显著的特点是:应用的无状态性. PS:提到无状态特性,不得不说下Http协议.我们常常听到说,Http是一个无状态协议,同一个会话的连续两个请求互相不了解,他们由最新实例化的环境进行解析,除了应用本身可能已经存储在全局对象中的所有信息外,该环境不保存与会话有关的任何信息.之所以我们在使用ASP.NET WebForm开发中会感觉不到Http的无状态特

.NET文件并发与RabbitMQ(初探RabbitMQ)

本文版权归博客园和作者吴双本人共同所有.欢迎转载,转载和爬虫请注明原文地址:http://www.cnblogs.com/tdws/p/5860668.html 想必MQ这两个字母对于各位前辈们和老司机们并不陌生.本文初探RabbitMQ的简单分享可能值得学习之处不怎么多,本人对于RabbitMQ的研究目前也很初级,这个月打算按照好的学习线路提高一下,欢迎新老司机留下你们的见解. 首先提到第一个简单的场景,文件并发.我先手动实现一下文件并发,引发异常,请看如下代码. 1 static void

[深入剖析React Native]React 初探

认识React React是一个用于构建用户界面的JavaScript库. React主要用于构建UI,很多人认为React是MVC中的V,即视图. React起源于Facebook的内部项目,用来架设Instagram的网站,并于2013年5月开源. React拥有较高的性能,代码逻辑非常简单,越来越多的人已开始关注和实用它. React特点 声明式设计 - React**采用声明范式**,可以轻松描述应用. 高效 - React通过对DOM的模拟,最大限度地减少与DOM的交互. 灵活 - R

代码初探->能耗

将作为一名程序员,进一步确定的目标是成为一个架构师,那么能耗必须考虑. 写代码与能耗的关系不言自明,现在假设将网络视频监控的监控识别算法放在客户端,既不利于算法的保护,也不利于算法的优化,更不利于降低能耗. 谈到能耗,每一台服务器都是吃电器,如果我不是老板,就不考虑耗电的情况,但是如果作为这个公司的一员,也有义务从能耗的角度去写代码. 一个65W的CPU跑一年,需耗电568度电,一度电假定为1.2元,那么一个CPU就需要耗电681.6元,这个价钱可以再买个CPU了. 对于一个1500W的GPU跑

HTML5+MUI+HBuilder 之初探情人

07,08年那会儿正当Java火爆,C/C++仍是广泛运用的一门语言的时候,所以我的大学都献给了C/C++和Java.当诺基亚的倒闭成为按键机时代衰落的标志时,移动APP的开发也如破堤之洪,爆炸式的崛起了.可惜小弟不才,反映略慢,加上观念陈旧,(C++程序员的通病--觉得前端=低端&移动端=前端),因此并没有打好移动APP的基础.这给后来我和我们兴趣小团队做些创意式项目也带来了难以逾越的坎.现在这会儿,哪个web应用没有移动APP客户端,就好比飞机没有机翼,帅哥没房没车没学历,美女不能生育一样,

EF6.0+APS.NET MVC5.0项目初探一(界面展示)

本人是菜鸟,但又是那种啥新技术都想试试的菜鸟,以前写过一个基于webform的基础框架(地址:http://www.51aspx.com/Code/RSFBase).闲来无事就想用微软大叔最新的技术搭建一个框架玩玩.期间也遇到不少问题,现在想把框架的搭建过程写下来,也算是来个总结复习吧. 先将图晒上,欢迎指正. 项目结构图如下: 静态页面是我在网上找的,稍加修改变成动态的了,也不知道侵权不,法盲哈哈 列表界面如下: 编辑添加页面如下: 到现在,叩打叩打的搞了一两天,好不容易将静态页面嫁接到网站上

NoSQL初探之人人都爱Redis:(3)使用Redis作为消息队列服务场景应用案例

一.消息队列场景简介 “消息”是在两台计算机间传送的数据单位.消息可以非常简单,例如只包含文本字符串:也可以更复杂,可能包含嵌入对象.消息被发送到队列中,“消息队列”是在消息的传输过程中保存消息的容器. 在目前广泛的Web应用中,都会出现一种场景:在某一个时刻,网站会迎来一个用户请求的高峰期(比如:淘宝的双十一购物狂欢节,12306的春运抢票节等),一般的设计中,用户的请求都会被直接写入数据库或文件中,在高并发的情形下会对数据库服务器或文件服务器造成巨大的压力,同时呢,也使响应延迟加剧.这也说明