• 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);
            }
    
        }

    执行结果:

        
     
     
     
  • 相关阅读:
    原单,尾货的科普贴
    c code
    考试
    一个笔试题
    注意自己的聊天内容可能招致被拐卖儿童
    酷壳网陈皓:开发者实用学习资源汇总[转]
    性格测试
    最实用的心理调节技巧,让你的情感细胞提升一下吧!
    Makefile教程
    Extjs中的迭代
  • 原文地址:https://www.cnblogs.com/Tmc-Blog/p/5212589.html
Copyright © 2020-2023  润新知