菜鸟初探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 的调用中断?

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

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 11
    评论
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值