zoukankan      html  css  js  c++  java
  • 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) 前后端隔离,屏蔽高安全区

  • 相关阅读:
    编译原理-第二章 一个简单的语法指导编译器-2.4 语法制导翻译
    编译原理-第二章 一个简单的语法指导编译器-2.3 语法定义
    编译原理-第二章 一个简单的语法指导编译器-2.2 词法分析
    LeetCode 1347. Minimum Number of Steps to Make Two Strings Anagram
    LeetCode 1348. Tweet Counts Per Frequency
    1349. Maximum Students Taking Exam(DP,状态压缩)
    LeetCode 1345. Jump Game IV(BFS)
    LeetCode 212. Word Search II
    LeetCode 188. Best Time to Buy and Sell Stock IV (动态规划)
    LeetCode 187. Repeated DNA Sequences(位运算,hash)
  • 原文地址:https://www.cnblogs.com/aqsunkai/p/6690586.html
Copyright © 2011-2022 走看看