• ActiveMQ测试实例


    ActiveMQ的安装与启动

    1 下载ActiveMQ:http://activemq.apache.org/download.html

    2 下载后解压到任意文件夹,解压后文件夹内的目录为:


    3 进入bin目录下的win64目录,运行activemq.bat程序,启动前需要设置jdk的环境变量,启动后如图所示:


    在浏览器中输入http://localhost:8161/admin验证,需要输入用户名和密码登录,都为admin,登录后界面:


    在conf目录下的jetty.xml中可以配置登录的用户名密码和端口号

    <bean id="securityConstraint" class="org.eclipse.jetty.util.security.Constraint">
         <property name="name" value="BASIC" />
         <property name="roles" value="user,admin" />
         <!-- set authenticate=false to disable login -->
         <property name="authenticate" value="true" />
    </bean>

    设置authenticate为false时,登录不用输入用户名和密码;roles指的是登录的用户角色,这些角色在jetty-realm.properties文件中配置

    <bean id="jettyPort" class="org.apache.activemq.web.WebConsolePort" init-method="start">
         <!-- the default port number for the web console -->
         <property name="host" value="0.0.0.0"/>
         <property name="port" value="8161"/>
    </bean>

    port的值设置登录的端口号

    ActiveMQ代码测试 

    1 新建一个java工程,结构如下:


    2 消息发送者代码:

    package com.cn.active;
    
    import javax.jms.Connection;
    import javax.jms.ConnectionFactory;
    import javax.jms.Destination;
    import javax.jms.JMSException;
    import javax.jms.MessageProducer;
    import javax.jms.Session;
    import javax.jms.TextMessage;
    
    import org.apache.activemq.ActiveMQConnection;
    import org.apache.activemq.ActiveMQConnectionFactory;
    
    public class JMSProducer {
        //默认连接用户名和默认连接密码,在conf文件夹下的credentials.properties文件中配置
        private static final String USERNAME = ActiveMQConnection.DEFAULT_USER;
        private static final String PASSWORD = ActiveMQConnection.DEFAULT_PASSWORD;
        //默认连接地址
        private static final String BROKEURL = ActiveMQConnection.DEFAULT_BROKER_URL;
        //连接工厂
        static ConnectionFactory connectionFactory;
        //连接
        static Connection connection;
        //会话 接受或者发送消息的线程
        static Session session;
        //消息的目的地
        static Destination destination;
        //消息生产者
        static MessageProducer messageProducer;
        //消息内容
        static TextMessage textMessage;
        
        static {
            //实例化连接工厂,仅在启动时加载
            connectionFactory = new ActiveMQConnectionFactory(USERNAME,PASSWORD,BROKEURL);
        }
        
        public static void main(String[] args){
            try {
                //通过连接工厂获取连接
                connection = connectionFactory.createConnection();
                //启动连接
                connection.start();
                /*
                 * 创建session
                 * 第一个参数指是否使用事务:
                 * 当消息发送者向消息提供者(即消息代理)发送消息时,消息发送者等待消息代理的确认,没有回应则抛出异常,消息发送者负责处理这个错误
                 * 第二个参数指参数的确认模式:
                 * AUTO_ACKNOWLEDGE:消息提供者每次收到消息时自动发送确认,消息只向目标发送一次,传输过程中可能因为错误丢失消息
                 * CLIENT_ACKNOWLEDGE:由消息接收者确认收到消息,通过调用消息的acknowledge()方法通知消息提供者收到了消息
                 * DUPS_OK_ACKNOWLEDGE:消息提供者在消息接收者没有确认发送时重新发送消息(这种模式不在乎接收者收到重复的消息)
                 */
                session = connection.createSession(true, Session.AUTO_ACKNOWLEDGE);
                //创建一个名称为test的消息队列
                destination = session.createQueue("test");
                //创建消息生产者
                messageProducer = session.createProducer(destination);
                //发送消息
                sendMessage(session,messageProducer);
                session.commit();
                connection.close();
            } catch (JMSException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        public static void sendMessage(Session session,MessageProducer messageProducer){
            try {
                for(int i=0;i<2;i++){
                    //创建一条文本消息 
                    textMessage = session.createTextMessage("activeMQ"+i);
                    System.out.println("activeMQ"+i);
                    //通过消息生产者发出消息 
                    messageProducer.send(textMessage);
                }
            } catch (JMSException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }

    运行后监视台显示一个test队列和二条消息:


    3 消息接收者代码:

    package com.cn.active;
    
    import javax.jms.Connection;
    import javax.jms.ConnectionFactory;
    import javax.jms.Destination;
    import javax.jms.JMSException;
    import javax.jms.MessageConsumer;
    import javax.jms.Session;
    import javax.jms.TextMessage;
    
    import org.apache.activemq.ActiveMQConnection;
    import org.apache.activemq.ActiveMQConnectionFactory;
    
    public class JMSConsumer {
        //默认连接用户名和默认连接密码,在conf文件夹下的credentials.properties文件中配置
        private static final String USERNAME = ActiveMQConnection.DEFAULT_USER;
        private static final String PASSWORD = ActiveMQConnection.DEFAULT_PASSWORD;
        //默认连接地址
        private static final String BROKEURL = ActiveMQConnection.DEFAULT_BROKER_URL;
        //连接工厂
        static ConnectionFactory connectionFactory;
        //连接
        static Connection connection;
        //会话 接受或者发送消息的线程
        static Session session;
        //消息的目的地
        static Destination destination;
        //消息消费者
        static MessageConsumer messageConsumer;
        //消息内容
        static TextMessage textMessage;
        
        static {
            //实例化连接工厂,仅在启动时加载
            connectionFactory = new ActiveMQConnectionFactory(USERNAME,PASSWORD,BROKEURL);
        }
        
        public static void main(String[] args){
            try {
                //通过连接工厂获取连接
                connection = connectionFactory.createConnection();
                //启动连接
                connection.start();
                /*
                 * 创建session
                 * 第一个参数指是否使用事务:
                 * 当消息发送者向消息提供者(即消息代理)发送消息时,消息发送者等待消息代理的确认,没有回应则抛出异常,消息发送者负责处理这个错误
                 * 第二个参数指参数的确认模式:
                 * AUTO_ACKNOWLEDGE:消息提供者每次收到消息时自动发送确认,消息只向目标发送一次,传输过程中可能因为错误丢失消息
                 * CLIENT_ACKNOWLEDGE:由消息接收者确认收到消息,通过调用消息的acknowledge()方法通知消息提供者收到了消息
                 * DUPS_OK_ACKNOWLEDGE:消息提供者在消息接收者没有确认发送时重新发送消息(这种模式不在乎接收者收到重复的消息)
                 */
                session = connection.createSession(true, Session.AUTO_ACKNOWLEDGE);
                //创建一个名称为test的消息队列
                destination = session.createQueue("test");
                //创建消息消费者
                messageConsumer = session.createConsumer(destination);
                
                while(true){
                    //接收消息,参数表示接收消息的超时时间,为0表示不超时,receive返回下一个消息
                    //若超时了或者消费者被关闭了,返回null
                    textMessage = (TextMessage) messageConsumer.receive(1000);
                    if (textMessage != null) {
                        System.out.println("接收:"+textMessage.getText());
                    }else{
                        break;
                    }
                }
                connection.close();
            } catch (JMSException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        
    }

    运行后监视台变为:


    ActiveMQ的特性和使用情况

    ActiveMQ特性列表

      1 多种语言和协议编写客户端。语言: Java, C, C++, C#, Ruby, Perl, Python, PHP。应用协议: OpenWire,Stomp REST,WS Notification,XMPP,AMQP
      2 完全支持JMS1.1和J2EE 1.4规范 (持久化,XA消息,事务)
      3 对Spring的支持,ActiveMQ可以很容易内嵌到使用Spring的系统里面去,而且也支持Spring2.0的特性
      4 通过了常见J2EE服务器(如 Geronimo,JBoss 4, GlassFish,WebLogic)的测试,其中通过JCA 1.5 resource adaptors的配置,可以让ActiveMQ可以自动的部署到任何兼容J2EE 1.4 商业服务器上
      5 支持多种传送协议:in-VM,TCP,SSL,NIO,UDP,JGroups,JXTA
      6 支持通过JDBC和journal提供高速的消息持久化
      7 从设计上保证了高性能的集群,客户端-服务器,点对点
      8 支持Ajax
      9 支持与Axis的整合
      10 可以很容易得调用内嵌JMS provider,进行测试

    什么情况下使用ActiveMQ?

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

  • 相关阅读:
    [codevs]线段树练习5
    【Java学习笔记之十六】浅谈Java中的继承与多态
    【Java学习笔记之十五】Java中的static关键字解析
    【Java学习笔记之十四】Java中this用法小节
    【Java学习笔记之十三】初探Java面向对象的过程及代码实现
    【Java学习笔记之十二】Java8增强的工具类:Arrays的用法整理总结
    hdu2896 AC自动机
    hdu2222 AC自动机
    字符串匹配--AC自动机模板
    字符串匹配--(K)MP模板
  • 原文地址:https://www.cnblogs.com/aqsunkai/p/6690586.html
Copyright © 2020-2023  润新知