最近在项目中接触了同步平台这么个东西,后来一直想着问问他们,后来想想自己什么也不知道,就去问人家,也不合适,于是决定自己先了解一下,那么就先把我这几天的感受给大家讲一下。
什么事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); } } }这样我们就可以实现一个传输数据,另一个人什么时候打开程序,什么时候接收,服务端不用管多少条信息,反正我就从前往后处理就可以。
代码问题
运行这个程序很可能出现:
版权声明:本文为博主原创文章,未经博主允许不得转载。
原文地址:http://blog.csdn.net/lovemenghaibin/article/details/47113951