你的位置:首页 > ASP.net教程

[ASP.net教程]ActiveMQ系列(1)


没网的日子真的不好过啊
  • 1.背景:

                  对于常见业务中,数据并发是一个很头疼的问题,很多时候,会出现资源共享导致线程阻塞的问题,这时候问题就来了,,,老板也尾随来了,来找你麻烦了,钱哪去了?,具体点儿,
            比如生成订单时候,多用户同时下单并支付,这都是白花花的银子啊,算错了,真的出现上面的情况了,还一个就是会遇到数据脏读问题,那么怎么解决?不以规矩不成方圆,所以,从小到大,
            老师总让我们排队,井然有序的入课堂就坐,就因为有序所以也提升了效率。ActiveMQ就做到了,列队形式,类似线程池列队,redis的push prop,当然redis更猛。

 
  • 2.系统环境:

           windows 10 企业版本 64位


  • 3.获取 与 安装 :



              a)     http://activemq.apache.org/ 自行选择中意版本(或 文章底部,我上传了,是目前的最新版本), 注意看域名,apache,所以肯定离不开 jdk了, jdk获取:

                      http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html ,同时配置 JAVA_HOME环境              b)    安装 ActiveMQ:
                        首先,解压下载的zip文件包,文件目录如下:
         
                        
                        bin       不用说了,和tomcat一样的,都是bat的启动或者停止的批处理和几个相关的jar包,
                        conf     顾名思义就是存放配置文件的
                        data     数据,什么数据?执行过程中生成的log等文件都在里面
                        docs    就是现在要用到的,安装以及使用:
      
  • 4 安装使用:

         doc文件夹中的 提示:
                                 
 



                          执行之后,下面的配置可以不用看了,因为部分不正确,直接在浏览器地址栏键入:Http://127.0.0.1:(端口号)8161,这时候可以看到以下界面:
         
                           
                            进行相关配置,默认用户名称和密码,上一步骤有提示,account/password ->admin/admin,显示如下界面:
          
                            
                            
                          -----其实测试过程中发现,上面的东西如果没有特殊要求,可以不用变化,就可以直接使用,这地方注意,看以下截图:
         
            
                执行 bin文件夹中的activemq.bat之后,发现执行到这个地方就不执行了,起初以为出现异常了,其实不是这个问题,可以不用理会,直接写代码即可。
 
  • 5. 参考  p2p 案例代码:                        


         依次引入:Apache.NMS.dll,Apache.NMS.ActiveMQ.dll即可食用。
    (案例来自,底部链接,虽然是别人的东西,但是自己动手写一遍和只看别人的东西,是不可用言语能表达的。):控制台程序:
服务端
    
namespace TestActiveMQ  {    class Program    {      private static IConnectionFactory factory //需要引用 Apache.NMS;        = new ConnectionFactory("tcp://localhost:61616");//需要引用Apache.NMS.ActiveMQ;      static void Main(string[] args)      {        //建立连接        using (IConnection connection = factory.CreateConnection())        {          //通过连接创建session会话          using (ISession session = connection.CreateSession())          {            //通过会话创建生产者,方法里面new出来的是MQ中的Queue            IMessageProducer producer = session.CreateProducer(new Apache.NMS.ActiveMQ.Commands.ActiveMQQueue("firstQueue"));            //创建一个发送的消息对象            ITextMessage message = producer.CreateTextMessage();            //给这个对象赋实际的消息            message.Text = "12321321321";            //设置消息对象的属性,这个很重要哦,是Queue的过滤条件,也是P2P消息的唯一指定属性            message.Properties.SetString("filter", "demo");            //生产者把消息发送出去,几个枚举参数MsgDeliveryMode是否长链,MsgPriority消息优先级别,发送最小单位,当然还有其他重载            producer.Send(message, MsgDeliveryMode.NonPersistent, MsgPriority.Normal, TimeSpan.MinValue);            Console.WriteLine("发送成功!");            Console.ReadLine();          }        }      }    }  }

客户端:

public partial class Form1 : Form  {    public Form1()    {      InitializeComponent();      InitConsumer();    }    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='demo'");      //注册监听事件      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);    }  }

执行结果: