ActiveMQ的入门使用

来源:互联网 发布:淘宝简易摄影棚 编辑:程序博客网 时间:2024/06/10 22:07


ActiveMQ的入门使用
序:
消息队列现在又很多,各有优势,这里现在就说说ActiveMQ。
ActiveMQ 是Apache出品,最流行的,能力强劲的开源消息总线。ActiveMQ 是一个完全支持JMS1.1和J2EE 1.4规范的 JMS Provider实现,尽管JMS规范出台已经是很久的事情了,但是JMS在当今的J2EE应用中间仍然扮演着特殊的地位。
几个基本参数解释
ProducerTool broker的地址,默认的是tcp://localhost:61616
[true|flase] 是否使用topic,默认是false
[subject] subject的名字,默认是TOOL.DEFAULT
[durabl] 是否持久化消息,默认是false
[messagecount] 发送消息数量,默认是10
[messagesize] 消息长度,默认是255
[clientID] durable为true的时候,需要配置clientID
[timeToLive] 消息存活时间
[sleepTime] 发送消息中间的休眠时间
[transacte] 是否采用事务
ConsumerTool broker的地址,默认的是tcp://localhost:61616
[true|flase] 是否使用topic,默认是false
[subject] subject的名字,默认是TOOL.DEFAULT
[durabl] 是否持久化消息,默认是false
[maxiumMessages] 接受最大消息数量,0表示不限制
[clientID] durable为true的时候,需要配置clientID
[transacte] 是否采用事务
[sleepTime] 接受消息中间的休眠时间,默认是0,onMeesage方法不休眠
[receiveTimeOut] 接受超时

1、先下载ActiveMQ,我这里下载的是5.14.3
地址:http://activemq.apache.org/activemq-5143-release.html
2、运行ActiveMQ
解压下载的ActiveMQ,找到bin目录下的activemq.bat,双击。
我这里直接运行bin下的activemq.bat出现黑框框一闪而过,于是我运行的是win64目录下的activemq.bat,黑框框正常不消失了
3、访问:http://localhost:8161/admin

选择queues,输入队列名后点击Create。
4、新建一个java项目,测试下。
新建java project,我这里就取名ActiveMQ
5、新建lib目录,与src同级。将下载的ActiveMQ的解压文件lib下的
activemq-broker-5.14.3.jar
activemq-client-5.14.3.jar
geronimo-j2ee-management_1.1_spec-1.0.1.jar
geronimo-jms_1.1_spec-1.1.1.jar
slf4j-api-1.7.13.jar
拷贝到项目下的lib下。
如果不加入slf4j-log4j12-1.7.13.jar、log4j-1.2.17.jar会报下面的错
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder"
另外还要加入hawtbuf-1.11.jar,否则会报下面的错
org.fusesource.hawtbuf.UTF8Buffer
6、在项目里建2个java类,一个发送、一个接收,我这里建Sender.java、Receiver.java,代码如下:
Sender.java
package com.lm.activemq; 
 
/**
 * @Header: Sender.java
 * 类描述:
 * @author: lm
 * @date 2013-7-17 上午10:52:42
 * @Email 
 * @company 欢
 * @addr 北京市朝阳区劲松
 */ 
import javax.jms.Connection; 
import javax.jms.ConnectionFactory; 
import javax.jms.DeliveryMode; 
import javax.jms.Destination; 
import javax.jms.MessageProducer; 
import javax.jms.Session; 
import javax.jms.TextMessage; 
import org.apache.activemq.ActiveMQConnection; 
import org.apache.activemq.ActiveMQConnectionFactory; 
 
public class Sender { 
    private static final int SEND_NUMBER = 5; 
 
    public static void main(String[] args) { 
        // ConnectionFactory :连接工厂,JMS 用它创建连接 
        ConnectionFactory connectionFactory; // Connection :JMS 客户端到JMS 
        // Provider 的连接 
        Connection connection = null; // Session: 一个发送或接收消息的线程 
        Session session; // Destination :消息的目的地;消息发送给谁. 
        Destination destination; // MessageProducer:消息发送者 
        MessageProducer producer; // TextMessage message; 
        // 构造ConnectionFactory实例对象,此处采用ActiveMq的实现jar 
        connectionFactory = new ActiveMQConnectionFactory( 
                ActiveMQConnection.DEFAULT_USER, 
                ActiveMQConnection.DEFAULT_PASSWORD, "tcp://localhost:61616"); 
        try { // 构造从工厂得到连接对象 
            connection = connectionFactory.createConnection(); 
            // 启动 
            connection.start(); 
            // 获取操作连接 
            session = connection.createSession(Boolean.TRUE, 
                    Session.AUTO_ACKNOWLEDGE); 
            // 获取session注意参数值xingbo.xu-queue是一个服务器的queue,须在在ActiveMq的console配置 
            destination = session.createQueue("FirstQueue"); 
            // 得到消息生成者【发送者】 
            producer = session.createProducer(destination); 
            // 设置不持久化,此处学习,实际根据项目决定 
            producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT); 
            // 构造消息,此处写死,项目就是参数,或者方法获取 
            sendMessage(session, producer); 
            session.commit(); 
        } catch (Exception e) { 
            e.printStackTrace(); 
        } finally { 
            try { 
                if (null != connection) 
                    connection.close(); 
            } catch (Throwable ignore) { 
            } 
        } 
    } 
 
    public static void sendMessage(Session session, MessageProducer producer) 
            throws Exception { 
        for (int i = 1; i <= SEND_NUMBER; i++) { 
            TextMessage message = session.createTextMessage("ActiveMq 发送的消息" 
                    + i); 
            // 发送消息到目的地方 
 
            System.out.println("发送消息:" + "ActiveMq 发送的消息" + i); 
            producer.send(message); 
        } 
    } 


Receiver.java
package com.lm.activemq; 
 
/**
 * @Header: Receiver.java
 * 类描述:
 * @author: lm
 * @date 2013-7-17 上午10:52:58
 * @Email 
 * @company 欢
 * @addr 北京市朝阳区劲松
 */ 
import javax.jms.Connection; 
import javax.jms.ConnectionFactory; 
import javax.jms.Destination; 
import javax.jms.MessageConsumer; 
import javax.jms.Session; 
import javax.jms.TextMessage; 
import org.apache.activemq.ActiveMQConnection; 
import org.apache.activemq.ActiveMQConnectionFactory; 
 
public class Receiver { 
    public static void main(String[] args) { 
        // ConnectionFactory :连接工厂,JMS 用它创建连接 
        ConnectionFactory connectionFactory; 
        // Connection :JMS 客户端到JMS Provider 的连接 
        Connection connection = null; 
        // Session: 一个发送或接收消息的线程 
        Session session; 
        // Destination :消息的目的地;消息发送给谁. 
        Destination destination; 
        // 消费者,消息接收者 
        MessageConsumer consumer; 
        connectionFactory = new ActiveMQConnectionFactory( 
                ActiveMQConnection.DEFAULT_USER, 
                ActiveMQConnection.DEFAULT_PASSWORD, "tcp://localhost:61616"); 
        try { 
            // 构造从工厂得到连接对象 
            connection = connectionFactory.createConnection(); 
            // 启动 
            connection.start(); 
            // 获取操作连接 
            session = connection.createSession(Boolean.FALSE, 
                    Session.AUTO_ACKNOWLEDGE); 
            // 获取session注意参数值xingbo.xu-queue是一个服务器的queue,须在在ActiveMq的console配置 
            destination = session.createQueue("FirstQueue"); 
            consumer = session.createConsumer(destination); 
            while (true) { 
                // 设置接收者接收消息的时间,为了便于测试,这里谁定为100s 
                TextMessage message = (TextMessage) consumer.receive(100000); 
                if (null != message) { 
                    System.out.println("收到消息" + message.getText()); 
                } else { 
                    break; 
                } 
            } 
        } catch (Exception e) { 
            e.printStackTrace(); 
        } finally { 
            try { 
                if (null != connection) 
                    connection.close(); 
            } catch (Throwable ignore) { 
            } 
        } 
    } 

7、测试过程,注意先运行Sender,run as application就行,然后再运行Receiver
注意,先运行Sender后查看ActiveMQ的管理页面,你会看到收到和接收的数量差距,如图:


当再运行Receiver 后,两个数量才会持平。如图


8、下面顺便贴下2个java运行后的控制台效果


9、关键代码和对象都有解释,这里不多说了,下次写项目引入,谢谢