【ActiveMQ】的入门程序详解

1.ActiveMQ介绍

  • 1.1 什么是ActiveMQ
    ActiveMQ 是Apache出品、最流行的、能力强劲的开源消息总线。ActiveMQ 是一个完全支持JMS1.1和J2EE 1.4规范的 JMS Provider实现,尽管JMS规范出台已经是很久的事情了,但是JMS在当今的J2EE应用中间仍然扮演着特殊的地位。
    主要特点:
    1)多种语言和协议编写客户端,语言: Java, C, C++, C#, Ruby, Perl, Python, PHP。应用协议: OpenWire,Stomp REST,WS Notification,XMPP,AMQP
    2)对Spring的支持,ActiveMQ可以很容易内嵌到使用Spring的系统里面去,而且也支持Spring2.0的特性
    3)通过了常见J2EE服务器(如 Geronimo,JBoss 4, GlassFish,WebLogic)的测试,其中通过JCA 1.5 resource adaptors的配置,可以让ActiveMQ可以自动的部署到任何兼容J2EE 1.4 商业服务器上
    4)支持多种传送协议:in-VM,TCP,SSL,NIO,UDP,JGroups,JXTA
    5)支持通过JDBC和journal提供高速的消息持久化
    6)从设计上保证了高性能的集群,客户端-服务器,点对点
    7)支持Ajax,且支持与Axis的整合
    8)可以很容易得调用内嵌JMS provider,进行测试

  • 1.2 JMS介绍
    JMS的全称是Java Message Service,即Java消息服务。用于在两个应用程序之间,或分布式系统中发送消息,进行异步通信。
    它主要用于在生产者和消费者之间进行消息传递,生产者负责产生消息,而消费者负责接收消息。把它应用到实际的业务需求中的话我们可以在特定的时候利用生产者生成一消息,并进行发送,对应的消费者在接收到对应的消息后去完成对应的业务逻辑。
    对于消息的传递有两种类型:
    一种是点对点的:即一个生产者和一个消费者一一对应
    发布/订阅模式:即一个生产者产生消息并进行发送后,可以由多个消费者进行接收。
    JMS定义了五种不同的消息正文格式,以及调用的消息类型,允许你发送并接收以一些不同形式的数据,提供现有消息格式的一些级别的兼容性。
     · StreamMessage – Java原始值的数据流
     · MapMessage–一套名称-值对
     · TextMessage–一个字符串对象
     · ObjectMessage–一个序列化的 Java对象
     · BytesMessage–一个字节的数据流

2.ActiveMQ的安装

  • 2.1 下载
    进入http://activemq.apache.org/下载ActiveMQ
    这里写图片描述
  • 2.2 安装
    第一步:安装jdk,需要jdk1.7以上版本
    第二步:解压缩activeMQ的压缩包。
    第三步:进入bin目录。
    启动:[root@localhost bin]# ./activemq start
    停止:[root@localhost bin]# ./activemq stop
    第四步:访问后台管理。
    http://192.168.25.168:8161/admin
    用户名:admin
    密码:admin
    以上是在linux上安装过程,为了演示,下载了win版本,启动服务后运行效果为
    这里写图片描述

3.ActiveMQ的使用方法

  • 3.1 JMS消息发送模式
    这里写图片描述
    点对点或队列模型:一个生产者向一个特定的队列发布消息,一个消费者从该队列中读取消息。这里,生产者知道消费者的队列,并直接将消息发送到消费者的队列。这种模式被概括为:只有一个消费者将获得消息。生产者不需要在接收者消费该消息期间处于运行状态,接收者也同样不需要在消息发送时处于运行状态。每一个成功处理的消息都由接收者签收。
    发布者/订阅者模型:支持向一个特定的消息主题发布消息。0或多个订阅者可能对接收来自特定消息主题的消息感兴趣。在这种模型下,发布者和订阅者彼此不知道对方。这种模式好比是匿名公告板。这种模式被概括为:多个消费者可以获得消息.在发布者和订阅者之间存在时间依赖性。发布者需要建立一个订阅(subscription),以便客户能够购订阅。订阅者必须保持持续的活动状态以接收消息,除非订阅者建立了持久的订阅。在那种情况下,在订阅者未连接时发布的消息将在订阅者重新连接时重新发布。

  • 3.2 JMS应用程序接口
    1)ConnectionFactory 接口(连接工厂)
    用户用来创建到JMS提供者的连接的被管对象。JMS客户通过可移植的接口访问连接,这样当下层的实现改变时,代码不需要进行修改。 管理员在JNDI名字空间中配置连接工厂,这样,JMS客户才能够查找到它们。根据消息类型的不同,用户将使用队列连接工厂,或者主题连接工厂。
    2)Connection 接口(连接)
    连接代表了应用程序和消息服务器之间的通信链路。在获得了连接工厂后,就可以创建一个与JMS提供者的连接。根据不同的连接类型,连接允许用户创建会话,以发送和接收队列和主题到目标。
    3)Destination 接口(目标)
    目标是一个包装了消息目标标识符的被管对象,消息目标是指消息发布和接收的地点,或者是队列,或者是主题。JMS管理员创建这些对象,然后用户通过JNDI发现它们。和连接工厂一样,管理员可以创建两种类型的目标,点对点模型的队列,以及发布者/订阅者模型的主题。
    4)MessageConsumer 接口(消息消费者)
    由会话创建的对象,用于接收发送到目标的消息。消费者可以同步地(阻塞模式),或异步(非阻塞)接收队列和主题类型的消息。
    5)MessageProducer 接口(消息生产者)
    由会话创建的对象,用于发送消息到目标。用户可以创建某个目标的发送者,也可以创建一个通用的发送者,在发送消息时指定目标。
    6)Message 接口(消息)
    是在消费者和生产者之间传送的对象,也就是说从一个应用程序创送到另一个应用程序。一个消息有三个主要部分:
    消息头(必须):包含用于识别和为消息寻找路由的操作设置。
    一组消息属性(可选):包含额外的属性,支持其他提供者和用户的兼容。可以创建定制的字段和过滤器(消息选择器)。
    一个消息体(可选):允许用户创建五种类型的消息(文本消息,映射消息,字节消息,流消息和对象消息)。
    消息接口非常灵活,并提供了许多方式来定制消息的内容。
    7)Session 接口(会话)
    表示一个单线程的上下文,用于发送和接收消息。由于会话是单线程的,所以消息是连续的,就是说消息是按照发送的顺序一个一个接收的。会话的好处是它支持事务。如果用户选择了事务支持,会话上下文将保存一组消息,直到事务被提交才发送这些消息。在提交事务之前,用户可以使用回滚操作取消这些消息。一个会话允许用户创建消息生产者来发送消息,创建消息消费者来接收消息。

  • 3.3 消息队列
    把ActiveMQ依赖的activemq-all-5.15.3.jar包添加到工程中,使用maven工程,则添加jar包的依赖:

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

创建生产者Producer

/**
 * 点对点模式
 */
public class QueueSend {
    public static void main(String[] args) throws Exception {
        Connection connection = null;
        Session session = null;
        MessageProducer producer = null;
        //创建一个连接工厂
        ConnectionFactory connectionFactory = new ActiveMQConnectionFactory();
        try {
            //从工厂对象中获得连接
            connection = connectionFactory.createConnection();
            connection.start();

            /*
            connection.createSession(paramA, paramB)
            A)paramA设置为true时:
            paramB的值忽略, acknowledgment mode被jms服务器设置 SESSION_TRANSACTED,
            当一个事务被提交的时候,消息确认就会自动发生。
            B) paramA设置为false时:
            Session.AUTO_ACKNOWLEDGE为自动确认,当客户成功的从receive方法返回的时候,或者从
            MessageListener.onMessage方法成功返回的时候,会话自动确认客户收到的消息。
            Session.CLIENT_ACKNOWLEDGE为客户端确认,客户端接收到消息后,必须调用javax.jms.Message的
            acknowledge方法,jms服务器才会删除消息(默认是批量确认)。
            */

            //开启一个会话,第一个参数指定不使用事务,第二个参数指定客户端接收消息的确认方式
            session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
            //创建目的地Queue或者是Topic
            Queue queue = session.createQueue("queue");
            //创建一个生产者
            producer = session.createProducer(queue);
            //创建message
            ActiveMQTextMessage message = new ActiveMQTextMessage();
            message.setText("hello world");
            //发送消息
            producer.send(message);
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            //关闭
            producer.close();
            session.close();
            connection.close();
        }
    }
}

这里写图片描述
查看activemq-admin管理端,结果如下图
这里写图片描述

这里写图片描述

创建消费者Consumer

/**
 * 同步消费者
 */
public class QueueConsumer1 {
    public static void main(String[] args) throws Exception {
        Connection connection = null;
        Session session = null;
        MessageConsumer consumer = null;
        ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory();
        try {
            connection = connectionFactory.createConnection();
            connection.start();
            //创建一个会话
            session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
            //创建一个目的地Destination
            Queue queue = session.createQueue("hello-queue");
            //创建一个消费者
            consumer = session.createConsumer(queue);

            while (true) {
                //设置接受者接收消息的时间,为了便于测试,定为100s
                Message message = consumer.receive(100000);
                if(message != null){
                    System.out.println(message);
                }else {
                    //超时结束
                    break;
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            //关闭
            consumer.close();
            session.close();
            connection.close();
        }
    }
}

这里写图片描述
查看activemq-admin管理端,结果如下图
这里写图片描述

/**
 * 异步消费者
 */
public class QueueConsumer2 {
    public static void main(String[] args) throws Exception {
        Connection connection = null;
        Session session = null;
        MessageConsumer consumer = null;
        ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory();
        try {
             connection = connectionFactory.createConnection();
            connection.start();
            //创建一个会话
            session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
            //创建一个目的地Destination
            Queue queue = session.createQueue("queue");
            //创建一个消费者
            consumer = session.createConsumer(queue);

            consumer.setMessageListener(new MessageListener() {

                @Override
                public void onMessage(Message message) {
                    if(message instanceof TextMessage){
                        String msg = "";
                        try {
                            msg = ((TextMessage) message).getText();
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                        System.out.println(msg);
                    }
                }
            });
            System.in.read();
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            //关闭
            consumer.close();
            session.close();
            connection.close();
        }
    }
}

这里写图片描述

  • 3.4 发布者/订阅者
    创建生产者Producer
/**
 * 发布/订阅模式
 */
public class TopicSend {
    public static void main(String[] args) throws JMSException {
        Connection connection = null;
        Session session = null;
        MessageProducer producer = null;
        ConnectionFactory connectionFactory = new ActiveMQConnectionFactory();
        try {
            connection = connectionFactory.createConnection();
            connection.start();
            session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
            Topic topic = session.createTopic("hello-topic");
            //创建一个生产者
            producer = session.createProducer(topic);
            //创建一个消息
            TextMessage message = new ActiveMQTextMessage();
            message.setText("hello world");
            //发送消息
            producer.send(message);
        }  catch (Exception e) {
            e.printStackTrace();
        }finally {
            //关闭
            producer.close();
            session.close();
            connection.close();
        }
    }
}

查看activemq-admin管理端,结果如下图
这里写图片描述

创建消费者Consumer

/**
 * 异步消费者
 */
public class TopicConsumer {
    public static void main(String[] args) throws Exception {
        Connection connection = null;
        Session session = null;
        MessageConsumer consumer = null;
        ConnectionFactory connectionFactory = new ActiveMQConnectionFactory();
        try {
            connection = connectionFactory.createConnection();
            connection.start();
            //创建一个会话
            session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
            //创建一个目的地Destination
            Destination destination = session.createTopic("topic");
            //创建一个消费者
            consumer = session.createConsumer(destination);

            consumer.setMessageListener(new MessageListener() {

                @Override
                public void onMessage(Message message) {
                    if(message instanceof TextMessage){
                        String msg = "";
                        try {
                            msg = ((TextMessage) message).getText();
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                        System.out.println(msg);
                    }
                }
            });

            System.in.read();
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            //关闭
            consumer.close();
            session.close();
            connection.close();
        }
    }
}

这里写图片描述
查看activemq-admin管理端,结果如下图
这里写图片描述

若想了解更多关于ActiveMQ底层原理,可以阅读https://blog.csdn.net/qq_35029429/article/details/79775822

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值