zoukankan      html  css  js  c++  java
  • ActiveMQ入门实例(.NET)

    1.ActiveMQ简介

    先分析这么一个场景:当我们在网站上购物时,必须经过,下订单、发票创建、付款处理、订单履行、航运等。但是,当用户下单后,立即跳转到“感谢那您的订单” 页面。不仅如此,若果没有延迟,用户还会受到一封电子邮件。如果我们使用传统方式去实现,一般是对数据库操作一通,然后调用各种接口、各种服务等待各种响应,这样一来下个订单需要很久时间才能看到结果,如果某个环节出了问题,那这个订单结果一时半会是看不到了,对于现代电子商务来说,这是不能容忍的。 那么ActiveMQ久可以很好的解决这个问题:当用户下单后,有一个对ActiveMQ的调用,用来提交订单,然后系统就可以返回结果页面,而整个订单流程不会同步调用,后台JOB可以边聊天边跑。前台订单量很大的情况下每个订单也只需要调用一次,后台一下子处理不了? 慢慢来,没人逼你,订单都在ActiveMQ中排队等待呢,他们可不会烦躁。    这个场景非常适合一种缓存队列,这种队列叫消息队列,很多产品都能实现这个功能,顺便回答下一个潜在的问题:他可比数据库操作快多了。

    本文就从基础开始一起学习下,本文系统运行环境:Window7 32位

    2.下载ActiveMQ

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

    3.运行ActiveMQ

    解压缩apache-activemq-5.10.0-bin.zip,然后双击apache-activemq-5.10.0inwin32activemq.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.第一个ActiveMQ例子

    先使用C#编写一个消息源,也就是生产者:

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

     1 public Form1()
     2         {
     3             InitializeComponent();
     4             InitProducer();
     5         }
     6         private IConnectionFactory factory;
     7 
     8         public void InitProducer()
     9         {
    10             try
    11             {
    12                 //初始化工厂,这里默认的URL是不需要修改的
    13                 factory = new ConnectionFactory("tcp://localhost:61616");
    14 
    15             }
    16             catch
    17             {
    18                 lbMessage.Text = "初始化失败!!";
    19             }
    20         }
    21 
    22         private void btnConfirm_Click(object sender, EventArgs e)
    23         {
    24             //通过工厂建立连接
    25             using (IConnection connection = factory.CreateConnection())
    26             {
    27                 //通过连接创建Session会话
    28                 using (ISession session = connection.CreateSession())
    29                 {
    30                     //通过会话创建生产者,方法里面new出来的是MQ中的Queue
    31                     IMessageProducer prod = session.CreateProducer(new Apache.NMS.ActiveMQ.Commands.ActiveMQQueue("firstQueue"));
    32                     //创建一个发送的消息对象
    33                     ITextMessage message = prod.CreateTextMessage();
    34                     //给这个对象赋实际的消息
    35                     message.Text = txtMessage.Text;
    36                     //设置消息对象的属性,这个很重要哦,是Queue的过滤条件,也是P2P消息的唯一指定属性
    37                     message.Properties.SetString("filter", "demo");
    38                     //生产者把消息发送出去,几个枚举参数MsgDeliveryMode是否长链,MsgPriority消息优先级别,发送最小单位,当然还有其他重载
    39                     prod.Send(message, MsgDeliveryMode.NonPersistent, MsgPriority.Normal, TimeSpan.MinValue);
    40                     lbMessage.Text = "发送成功!!";
    41                     txtMessage.Text = "";
    42                     txtMessage.Focus();
    43                 }
    44             }
    45         }
    View Code

    可以点击按钮发送一些消息,这些消息就被暂存到ActiveMQ中了,可以登录刚才要密码的那个网页去查看。然后编写接收端,也就是消费者:

     1 public Form1()
     2         {
     3             InitializeComponent();
     4             InitConsumer();
     5 
     6         }
     7          public void InitConsumer()
     8          {
     9              //创建连接工厂
    10              IConnectionFactory factory = new ConnectionFactory("tcp://localhost:61616");
    11              //通过工厂构建连接
    12              IConnection connection = factory.CreateConnection();
    13              //这个是连接的客户端名称标识
    14              connection.ClientId = "firstQueueListener";
    15              //启动连接,监听的话要主动启动连接
    16              connection.Start();
    17              //通过连接创建一个会话
    18              ISession session = connection.CreateSession();
    19              //通过会话创建一个消费者,这里就是Queue这种会话类型的监听参数设置
    20              IMessageConsumer consumer = session.CreateConsumer(new Apache.NMS.ActiveMQ.Commands.ActiveMQQueue("firstQueue"), "filter='demo'");
    21              //注册监听事件
    22              consumer.Listener += new MessageListener(consumer_Listener);
    23              //connection.Stop();
    24              //connection.Close();  
    25  
    26          }
    27  
    28          void consumer_Listener(IMessage message)
    29          {
    30              ITextMessage msg = (ITextMessage)message;
    31              //异步调用下,否则无法回归主线程
    32              tbReceiveMessage.Invoke(new DelegateRevMessage(RevMessage),msg);
    33  
    34          }
    35  
    36          public delegate void DelegateRevMessage(ITextMessage message);
    37  
    38          public void RevMessage(ITextMessage message)
    39          {
    40              tbReceiveMessage.Text += string.Format(@"接收到:{0}{1}", message.Text, Environment.NewLine);
    41          }
    View Code

    4.总结

    以上实现了一个p2p方式的消息队列,就是暂时存进去等待处理,处理完了这个消息就没了,保证送达,不会丢失,也不会被掉包。这种模式使用场合有限,而且客户只能有一个,属于快递形式,满足不了订单处理要求,原因很简单:黑名单检查环节获取了这个订单信息,审核环节就获取不到了,下一节我们一起学习“消息群发”,就是大喊一声,订单来了,大家开始忙吧...

  • 相关阅读:
    【leetcode】1215.Stepping Numbers
    【leetcode】1214.Two Sum BSTs
    【leetcode】1213.Intersection of Three Sorted Arrays
    【leetcode】1210. Minimum Moves to Reach Target with Rotations
    【leetcode】1209. Remove All Adjacent Duplicates in String II
    【leetcode】1208. Get Equal Substrings Within Budget
    【leetcode】1207. Unique Number of Occurrences
    【leetcode】689. Maximum Sum of 3 Non-Overlapping Subarrays
    【leetcode】LCP 3. Programmable Robot
    【leetcode】LCP 1. Guess Numbers
  • 原文地址:https://www.cnblogs.com/bangguo/p/13093021.html
Copyright © 2011-2022 走看看