• ActiveMQ学习笔记(1)----初识ActiveMQ


    1. 什么是ActiveMQ?

      ActiveMQ是Apache推出的,一款开源的,完全支持JMS1.1和j2ee1.4规范的JMS Provider实现的消息中间件(Message Oriented Middleware, MOM).

    2. ActiveMQ能干什么?

      最主要的功能就是:实现JMS Provider ,用来帮助实现高可用,高性能,可伸缩,易用和安全的企业级面向消息服务的系统。

    3. ActiveMQ的特点:

      多种语言和协议编写客户端。语言: Java, C, C++, C#, Ruby, Perl, Python, PHP。应用协议: OpenWire,Stomp REST,WS Notification,XMPP,AMQP

      完全支持JMS1.1和J2EE 1.4规范 (持久化,XA消息,事务)

      对Spring的支持,ActiveMQ可以很容易内嵌到使用Spring的系统里面去,而且也支持Spring2.0的特性

      通过了常见J2EE服务器(如 Geronimo,JBoss 4, GlassFish,WebLogic)的测试,其中通过JCA 1.5 resource adaptors的配置,可以让ActiveMQ可以自动的部署到任何兼容J2EE 1.4 商业服务器上

      支持多种传送协议:in-VM,TCP,SSL,NIO,UDP,JGroups,JXTA

      支持通过JDBC和journal提供高速的消息持久化

      从设计上保证了高性能的集群,客户端-服务器,点对点

      支持Ajax

      支持与Axis的整合

      可以很容易得调用内嵌JMS provider,进行测试

    4.ActiveMQ的安装

      ActiveMQ官网下载地址:http://activemq.apache.org/download.html

      

      这里下载的5.15.6windows版的zip包,下载后直接解压到需要的文件夹,如果想要方便开启ActiveMQ也可以自己配置环境变量,配置环境变量的方式这里就不再详述。

      解压之后的目录

        

      bin存放的是脚本文件

      conf存放的是基本配置文件

      data存放的是日志文件

      docs存放的是说明文档

      webapps-demo存放的是简单的实例

      lib存放的是activemq所需jar包

      webapps用于存放项目的目录

      activemq-all-5.15.6.jar是使用ActiveMQ时需要依赖的jar

      进入到安装目录的bin目录下(配置了环境变量可以直接在任意位置)打开cmd,输入命令:activemq start开启ActiveMQ, activemq stop 关闭。

      如果报:

    Caused by: java.io.IOException: Failed to bind to server socket: tcp://0.0.0.0:61616?maximumConnections=1000&wireformat.maxFrameSize=104857600 due to: java.net.SocketException: Unrecognized Windows Sockets error: 0: JVM_Bind

      表示默认端口61616被占用。在大多数情况下,占用61616端口的是Internet Connection Sharing (ICS) 这个Windows服务,你只需停止它就可以启动ActiveMQ了。

      如果报:

    Failed to bind to server socket: amqp://0.0.0.0:5672?maximumConnections=1000&wireformat.maxFrameSize=104857600 due to: 
    java.net.BindException: Address already in use: JVM_Bind

      是5672端口被占用,修改conf/activemq.xml中的conf/activemq.xml中的端口即可。

    <transportConnector name="amqp" uri="amqp://0.0.0.0:5672?maximumConnections=1000&amp;wireformat.maxFrameSize=104857600"/>

      访问:http://localhost:8161/

      我们在浏览器打开链接之后输入账号密码

      默认账号:admin

      密码:admin

      如下则表示安装成功

      

    5. 什么情况下使用ActiveMQ

      1. 多个项目之间集成 
        (1) 跨平台 
        (2) 多语言 
        (3) 多项目
      2. 降低系统间模块的耦合度,解耦 
        (1) 软件扩展性
      3. 系统前后端隔离 
        (1) 前后端隔离,屏蔽高安全区

    6. 简单使用ActiveMQ

      新建一个maven项目,引入依赖(非maven项目直接将安装目录中的activemq-all.jar直接考到项目 的lib文件夹下)

      pom.xml文件如下

      <dependency>
          <groupId>org.apache.activemq</groupId>
          <artifactId>activemq-all</artifactId>
          <version>5.15.6</version>
        </dependency>

      新建一个生产者类

      

    package com.wangx.activemq;
    
    import org.apache.activemq.ActiveMQConnectionFactory;
    
    import javax.jms.*;
    
    public class MessageSender {
    
        public static void main(String[] args) throws JMSException {
            //创建链接工厂
            ConnectionFactory factory = new ActiveMQConnectionFactory(ActiveMQConnectionFactory.DEFAULT_USER,ActiveMQConnectionFactory.DEFAULT_PASSWORD,ActiveMQConnectionFactory.DEFAULT_BROKER_URL);
    
            Connection connection = null;
            Session session = null;
            try{
                //创建链接
                connection =  factory.createConnection();
                //启动链接
                connection.start();
                //获取会话
                session = connection.createSession(Boolean.TRUE, session.AUTO_ACKNOWLEDGE);
                //创建队列
                Destination queue = session.createQueue("myQueue");
                //创建生产者对象
                MessageProducer messageProducer = session.createProducer(queue);
    
                for (int i = 0; i < 9; i++) {
                    //创建消息对象
                    TextMessage textMessage = session.createTextMessage("hello:" + i);
                    //发送消息
                    messageProducer.send(textMessage);
                    System.out.println(textMessage.getText());
                }
                session.commit();
                session.close();
                connection.close();
            }catch (Exception e) {
    
            }finally {
            }
    
        }
    }

      运行消费者,将消息发送到ActiveMQ中,现在并没有消费者消费,但是我们访问http://localhost:8161可以看到消息已经在队列中了

      

      生产的消息已经有9条消息了。

      创建消费者

      

    package com.wangx.activemq;
    
    import org.apache.activemq.ActiveMQConnectionFactory;
    
    import javax.jms.*;
    
    public class MessageReceive {
    
        public static void main(String[] args) {
            //创建链接工厂
            ConnectionFactory factory = new ActiveMQConnectionFactory(ActiveMQConnectionFactory.DEFAULT_USER,ActiveMQConnectionFactory.DEFAULT_PASSWORD,ActiveMQConnectionFactory.DEFAULT_BROKER_URL);
            Connection connection = null;
            Session session = null;
            try{
                //创建链接
                connection =  factory.createConnection();
                //启动链接
                connection.start();
                //获取会话
                session = connection.createSession(Boolean.TRUE, session.AUTO_ACKNOWLEDGE);
                //创建队列
                Destination queue = session.createQueue("myQueue");
                //创建消费者
                MessageConsumer messageConsumer = session.createConsumer(queue);
                //监听消息
                while(true){
                    TextMessage msg = (TextMessage) messageConsumer.receive();
                    if(msg!=null) {
                        msg.acknowledge();
                        System.out.println(Thread.currentThread().getName()+": Consumer:我是消费者,我正在消费Msg"+msg.getText()+"--->");
                    }else {
                        break;
                    }
                }
                session.commit();
                session.close();
                connection.close();
            }catch (Exception e) {
    
            }
        }
    }

      控制台输出:

    main: Consumer:我是消费者,我正在消费Msghello:0--->
    main: Consumer:我是消费者,我正在消费Msghello:1--->
    main: Consumer:我是消费者,我正在消费Msghello:2--->
    main: Consumer:我是消费者,我正在消费Msghello:3--->
    main: Consumer:我是消费者,我正在消费Msghello:4--->
    main: Consumer:我是消费者,我正在消费Msghello:5--->
    main: Consumer:我是消费者,我正在消费Msghello:6--->
    main: Consumer:我是消费者,我正在消费Msghello:7--->
    main: Consumer:我是消费者,我正在消费Msghello:8--->
    main: Consumer:我是消费者,我正在消费Msghello:0--->
    main: Consumer:我是消费者,我正在消费Msghello:1--->
    main: Consumer:我是消费者,我正在消费Msghello:2--->
    main: Consumer:我是消费者,我正在消费Msghello:3--->
    main: Consumer:我是消费者,我正在消费Msghello:4--->
    main: Consumer:我是消费者,我正在消费Msghello:5--->
    main: Consumer:我是消费者,我正在消费Msghello:6--->
    main: Consumer:我是消费者,我正在消费Msghello:7--->
    main: Consumer:我是消费者,我正在消费Msghello:8--->

      可以看到,当消费者消费完队列中的消息后,将会一直等在receive()上监听消息的产生,直到队列中有新的消息被生产,会再次返回消息。

  • 相关阅读:
    Windows Phone本地数据库(SQLCE):3、[table]attribute(翻译) (转)
    深入理解 Node.js 中 EventEmitter源码分析(3.0.0版本)
    深入理解 Getter和Setter 对对象的属性监听
    深入理解Proxy 及 使用Proxy实现vue数据双向绑定
    深入理解 ES6中的 Reflect
    深入理解 Object.defineProperty 及实现数据双向绑定
    Egg入门学习(三)---理解中间件作用
    学习使用PM2管理nodejs进程
    Egg入门学习(二)---理解service作用
    Egg入门学习(一)
  • 原文地址:https://www.cnblogs.com/Eternally-dream/p/9874076.html
Copyright © 2020-2023  润新知