天天看点

Java消息队列--ActiveMq 实战

1、下载安装ActiveMQ

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

 ActiveMQ 提供了Windows 和Linux、Unix 等几个版本,楼主这里选择了Windows 版本下进行开发。

Java消息队列--ActiveMq 实战

下载完安装包,解压之后的目录:

Java消息队列--ActiveMq 实战

 从它的目录来说,还是很简单的: 

    • bin存放的是脚本文件
    • conf存放的是基本配置文件
    • data存放的是日志文件
    • docs存放的是说明文档
    • examples存放的是简单的实例
    • lib存放的是activemq所需jar包
    • webapps用于存放项目的目录

2、启动ActiveMQ 

 进入到ActiveMQ 安装目录的bin 目录,根据系统选择win32/win64,然后点击activemq.bat。

 点击之后,出现ActiveMQ已启动,这时候说明服务已经成功启动了,此时也能看到访问路径。

Java消息队列--ActiveMq 实战

ActiveMQ默认启动时,启动了内置的jetty服务器,提供一个用于监控ActiveMQ的admin应用。 

我们在浏览器请求http://127.0.0.1:8161/admin/,然后输入账号密码(这里和tomcat 服务器类似)。

默认账号密码:admin/admin

Java消息队列--ActiveMq 实战

到这里为止,ActiveMQ 服务端就启动完毕了。

3、创建一个ActiveMQ工程

 项目目录结构:

Java消息队列--ActiveMq 实战

上述在官网下载ActiveMq 的时候,我们可以在目录下看到一个jar包:

 

Java消息队列--ActiveMq 实战

这个jar 包就是我们需要在项目中进行开发中使用到的相关依赖。

3.1 创建生产者

public class Sender {

    private static final int SEND_NUMBER = 5;

    private static final String QUEUE_NAME = "xwj_queue";

    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注意参数值QUEUE_NAME是一个服务器的queue,须在在ActiveMq的console配置
            destination = session.createQueue(QUEUE_NAME);
            // 得到消息生成者【发送者】
            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("xwj发送消息:" + i);
            // 发送消息到目的地方
            System.out.println("发送消息:" + "ActiveMq 发送的消息" + i);
            producer.send(message);
        }
    }       

3.2 创建消费者

public class Receiver {
    
    private static final String QUEUE_NAME = "xwj_queue";
    
    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(QUEUE_NAME);
            consumer = session.createConsumer(destination);
            while (true) {
                // 设置接收者接收消息的时间,为了便于测试,这里谁定为100s
                TextMessage message = (TextMessage) consumer.receive(10000);
                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) {
            }
        }
    }      

4、运行ActiveMQ项目

 4.1、生产者开始生产消息

    执行Sender中的主方法,运行结果:

  发送消息:ActiveMq 发送的消息1
  发送消息:ActiveMq 发送的消息2
  发送消息:ActiveMq 发送的消息3
  发送消息:ActiveMq 发送的消息4
  发送消息:ActiveMq 发送的消息5      
Java消息队列--ActiveMq 实战

4.2 消费者开始消费消息

   执行Receiver中的主方法,运行结果:

发送消息:ActiveMq 发送的消息1
发送消息:ActiveMq 发送的消息2
发送消息:ActiveMq 发送的消息3
发送消息:ActiveMq 发送的消息4
发送消息:ActiveMq 发送的消息5      

查看运行结果,我们可以做ActiveMQ 服务端:http://127.0.0.1:8161/admin/ 里面的Queues 中查看我们生产的消息。

Java消息队列--ActiveMq 实战

5、ActiveMQ的特性

 5.1 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,进行测试

 5.2 什么情况下使用ActiveMQ?

  1. 多个项目之间集成 

    (1) 跨平台 

    (2) 多语言 

    (3) 多项目

  2. 降低系统间模块的耦合度,解耦 

    (1) 软件扩展性

  3. 系统前后端隔离 

    (1) 前后端隔离,屏蔽高安全区

知识改变世界