【JAVA秒会技术之ActiveMQ】ActiveMQ的快速入门

ActiveMQ的快速入门

一、ActiveMQ介绍

1.ActiveMQ简介

        MQ,即Message Queue,消息队列。

        ActiveMQ,是Apache出品,最流行的,能力强劲的开源消息总线。ActiveMQ 是一个完全支持JMS1.1和J2EE
1.4规范的 JMS Provider实现,尽管JMS规范出台已经是很久的事情了,但是JMS在当今的J2EE应用中间仍然扮演着特殊的地位。

2.JMS简介

       JMS的全称是Java Message Service,即Java消息服务。用于在两个应用程序之间,或分布式系统中发送消息,进行异步通信。

它主要用于在生产者和消费者之间进行消息传递,生产者负责产生消息,而消费者负责接收消息。把它应用到实际的业务需求中的话我们可以在特定的时候利用生产者生成一消息,并进行发送,对应的消费者在接收到对应的消息后去完成对应的业务逻辑。

        对于消息的传递有两种类型:

         一种是点对点的,即一个生产者和一个消费者一一对应;

    另一种是发布/订阅模式,即一个生产者产生消息并进行发送后,可以由多个消费者进行接收。 

 二、ActiveMQ下载安装

1.下载

下载地址:


http://activemq.apache.org/ 

2.安装

第一步:安装JDK


ActiveMQ是使用java开发的,需要安装JDK

第二步:上传安装包


将下载好的apache-activemq-5.12.0-bin.tar.gz上传到linux系统

第三步:解压缩


[root@test-imgserver ~]# tar -zxf apache-activemq-5.12.0-bin.tar.gz

第四步:启动/停止ActiveMQ


[root@test-imgserver apache-activemq-5.12.0]# cd bin/

启动:[root@test-imgserver bin]# ./activemq start

停止:[root@test-imgserver bin]# ./activemq stop

第五步:访问ActiveMQ后台


访问地址:http://ip地址:8161/admin/

用户名:admin

密码:admin 

3.访问出错问题解决

访问ActiveMQ后台管理系统出现Service Unavailable,解决步骤如下:

第一步:停止ActiveMQ


[root@test-imgserver ~]# /root/apache-activemq-5.12.0/bin/activemq stop

第二步:查看ActiveMQ后台


[root@test-imgserver ~]# /root/apache-activemq-5.12.0/bin/activemq console

第三步:找出错误“域名解析失败”


test-imgserver :
域名解析失败

第四步:修改hosts文件


[root@test-imgserver ~]# vim /etc/hosts

127.0.0.1 localhost  localhost. localdomain  test-imgserver(将主机名添加到域名列表)

三、ActiveMQ使用

        ActiveMQ是对JMS1.1规范进行了实现,所以想了解ActiveMQ的使用方法之前,先了解JMS的消息发送模式和JMS应用程序接口。

1.JMS消息发送模式

      (1)队列模式(Queue)点对点,即一个生产者对应一个消费者,可以有多个生产者,但只能拥有一个消费者

特点:只有一个消费者将获得消息生产者不需要在接收者消费该消息期间处于运行状态,接收者也同样不需要在消息发送时处于运行状态。每一个成功处理的消息都由接收者签收。

      (2)主题模式(Topic)是一对多的发布/订阅模式。即一个生产者可以对应多个消费者,消费者只需要订阅指定生产者的消息即可。

        特点:多个消费者可以获得消息.在发布者和订阅者之间存在时间依赖性。发布者需要建立一个订阅(subscription),以便客户能够购订阅。订阅者必须保持持续的活动状态以接收消息,除非订阅者建立了持久的订阅。在那种情况下,在订阅者未连接时发布的消息将在订阅者重新连接时重新发布。

 

 2.JMS应用程序接口介绍

(1)ConnectionFactory 接口(连接工厂)


用户用来创建到JMS提供者的连接的被管对象。JMS客户通过可移植的接口访问连接,这样当下层的实现改变时,代码不需要进行修改。 管理员在JNDI名字空间中配置连接工厂,这样,JMS客户才能够查找到它们。根据消息类型的不同,用户将使用队列连接工厂,或者主题连接工厂。

(2)Connection 接口(连接)


连接代表了应用程序和消息服务器之间的通信链路。在获得了连接工厂后,就可以创建一个与JMS提供者的连接。根据不同的连接类型,连接允许用户创建会话,以发送和接收队列和主题到目标。

(3)Session 接口(会话)


表示一个单线程的上下文,用于发送和接收消息。由于会话是单线程的,所以消息是连续的,就是说消息是按照发送的顺序一个一个接收的。会话的好处是它支持事务。如果用户选择了事务支持,会话上下文将保存一组消息,直到事务被提交才发送这些消息。在提交事务之前,用户可以使用回滚操作取消这些消息。一个会话允许用户创建消息生产者来发送消息,创建消息消费者来接收消息。

(4)Destination 接口(目标)


目标是一个包装了消息目标标识符的被管对象,消息目标是指消息发布和接收的地点,或者是队列,或者是主题。JMS管理员创建这些对象,然后用户通过JNDI发现它们。和连接工厂一样,管理员可以创建两种类型的目标,点对点模型的队列,以及发布者/订阅者模型的主题。

(5)MessageConsumer 接口(消息消费者)


由会话创建的对象,用于接收发送到目标的消息。消费者可以同步地(阻塞模式),或异步(非阻塞)接收队列和主题类型的消息。

(6)MessageProducer 接口(消息生产者)


由会话创建的对象,用于发送消息到目标。用户可以创建某个目标的发送者,也可以创建一个通用的发送者,在发送消息时指定目标。

(7)Message 接口(消息)

是在消费者和生产者之间传送的对象,也就是说从一个应用程序创送到另一个应用程序。一个消息有三个主要部分:

①消息头(必须):包含用于识别和为消息寻找路由的操作设置。

②一组消息属性(可选):包含额外的属性,支持其他提供者和用户的兼容。可以创建定制的字段和过滤器(消息选择器)。

③一个消息体(可选):允许用户创建五种类型的消息(文本消息,映射消息,字节消息,流消息和对象消息)。

3.添加依赖

在生产者和消费者所在的工程中,都需要添加ActiveMQ的依赖。

(1)普通工程添加activemq-all-5.12.0.jar到工程即可

(2)Maven工程,需要在pom文件中添加以下依赖:

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

4.与Spring整合

(1)配置ConnectionFactory

不管是生产者还是消费者都需要配置ConnectionFactory,在test-manager-service和test-search-service工程中分创建applicationContext-activemq.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context" 
xmlns:p="http://www.springframework.org/schema/p"
xmlns:aop="http://www.springframework.org/schema/aop" 
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:jms="http://www.springframework.org/schema/jms" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-4.0.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-4.0.xsd
http://www.springframework.org/schema/jms
http://www.springframework.org/schema/jms/spring-jms-4.0.xsd
http://www.springframework.org/schema/util
http://www.springframework.org/schema/util/spring-util-4.0.xsd">
 
<!-- 真正可以产生Connection的ConnectionFactory,由对应的 JMS服务厂商提供 -->
<bean id="targetConnectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">
<property name="brokerURL" value="tcp://ip地址:61616" />
</bean>
<!-- Spring用于管理真正的ConnectionFactory的ConnectionFactory -->
<bean id="connectionFactory"
class="org.springframework.jms.connection.SingleConnectionFactory">
<!-- 目标ConnectionFactory对应真实的可以产生JMS Connection的ConnectionFactory -->
<property name="targetConnectionFactory" ref="targetConnectionFactory" />
</bean>
</beans>

2)生产者配置

①Spring配置文件

<!-- 配置生产者 -->
<!-- Spring提供的JMS工具类,它可以进行消息发送、接收等 -->
<bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">
<!-- 这个connectionFactory对应的是我们定义的Spring提供的那个ConnectionFactory对象 -->
<property name="connectionFactory" ref="connectionFactory" />
</bean>
<!--这个是队列目的地,点对点的 -->
<bean id="queueDestination" class="org.apache.activemq.command.ActiveMQQueue">
<constructor-arg>
<value>queue</value>
</constructor-arg>
</bean>
<!--这个是主题目的地,一对多的 -->
<bean id="topicDestination" class="org.apache.activemq.command.ActiveMQTopic">
<constructor-arg value="topic" />
</bean>

②测试代码

@Test
public void testSpringProducer() {
   ApplicationContext ctx = new ClassPathXmlApplicationContext("classpath:spring/applicationContext-activemq.xml");
   // 通过applicationContext获取JmsTemplate
   JmsTemplate jmsTemplate = (JmsTemplate) ctx.getBean("jmsTemplate");
   // 通过applicationContext获取destination
   Destination destination = (Destination) ctx.getBean("queueDestination");
   // 通过jmstemplate发送消息
   jmsTemplate.send(destination, new MessageCreator() {
      @Override
      public Message createMessage(Session session) throws JMSException {
           return session.createTextMessage("hello spring jmstemplate send message");
      }
    });
}

(3)消费者配置

那么消费者是通过Spring为我们封装的消息监听容器MessageListenerContainer实现的,它负责接收信息,并把接收到的信息分发给真正的MessageListener进行处理。每个消费者对应每个目的地都需要有对应的MessageListenerContainer。

对于消息监听容器而言,除了要知道监听哪个目的地之外,还需要知道到哪里去监听,也就是说它还需要知道去监听哪个JMS服务器,这是通过在配置MessageConnectionFactory的时候往里面注入一个ConnectionFactory来实现的。

所以在配置一个MessageListenerContainer的时候有三个属性必须指定:

1、一个是表示从哪里监听的ConnectionFactory

2、一个是表示监听什么的Destination;

3、一个是接收到消息以后进行消息处理的MessageListener。

常用的MessageListenerContainer实现类是DefaultMessageListenerContainer。

①MessageListener

public class MyMessageListener implements MessageListener {
    @Override
    public void onMessage(Message message) {
        // 根据不同业务逻辑进行相应处理
        System.out.println(message);
    }
}

②Spring配置文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context" 
xmlns:p="http://www.springframework.org/schema/p"
xmlns:aop="http://www.springframework.org/schema/aop" 
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:jms="http://www.springframework.org/schema/jms" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-4.0.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-4.0.xsd
http://www.springframework.org/schema/jms
http://www.springframework.org/schema/jms/spring-jms-4.0.xsd
http://www.springframework.org/schema/util
http://www.springframework.org/schema/util/spring-util-4.0.xsd">
 
<!-- 真正可以产生Connection的ConnectionFactory,由对应的 JMS服务厂商提供 -->
<bean id="targetConnectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">
<property name="brokerURL" value="tcp://ip地址:61616" />
</bean>
<!-- Spring用于管理真正的ConnectionFactory的ConnectionFactory -->
<bean id="connectionFactory"
class="org.springframework.jms.connection.SingleConnectionFactory">
<!-- 目标ConnectionFactory对应真实的可以产生JMS Connection的ConnectionFactory -->
<property name="targetConnectionFactory" ref="targetConnectionFactory" />
</bean>
 
<!-- 配置消费者 -->
<!-- 配置MessageListener -->
<bean id="myMessageListener" class="com.test.search.listener.MyMessageListener"></bean>
 
<!-- 配置MessageListenerContainer -->
<bean id="jmsContainer"
class="org.springframework.jms.listener.DefaultMessageListenerContainer">
<property name="connectionFactory" ref="connectionFactory" />
<property name="destination" ref="queueDestination" />
<property name="messageListener" ref="myMessageListener" />
</bean>
 
</beans>

③代码

@Test
public void testSpringConsumer() throws Exception {
    ApplicationContext ctx = new ClassPathXmlApplicationContext("classpath:spring/applicationContext-activemq.xml");
    System.in.read();
}

 

 

 

时间: 2024-11-03 22:30:24

【JAVA秒会技术之ActiveMQ】ActiveMQ的快速入门的相关文章

【JAVA秒会技术之图片上传】基于Nginx及FastDFS,完成图片的上传及展示

基于Nginx及FastDFS,完成商品图片的上传及展示 一.传统图片存储及展示方式      存在问题: 1)大并发量上传访问图片时,需要对web应用做负载均衡,但是会存在图片共享问题 2)web应用服务器的存储空间有限,它是web应用服务器,而不是存储服务器. 3)web应用服务器的本身的io读写性能不高,图片上传下载时,速度偏慢 4)web应用服务器访问图片时,由于图片内容较大,并发量大的时候,会占用web应用服务器的带宽,这样该web应用服务器的其他功能就会受到较大的影响.    解决方

【JAVA秒会技术之秒杀面试官】JavaEE常见面试题(二)

[前言]别人都在你看不到的地方暗自努力,在你看得到的地方,他们也和你一样显得游手好闲,和你一样会抱怨,而只有你自己相信这些都是真的,最后,也只有你一个人继续不思进取 --   [下载]个人结合诸多资料,总结的一些JavaEE常见面试题,主要针对初/中级程序员.想要word完整版下载的,评论里留言留下你的邮箱! 16.请写出hibernate中主键生成策略? 答:①increment:适用于short,int,long作为主键.不是使用的数据库自动增长机制. * Hibernate中提供的一种增长

【JAVA秒会技术之秒杀面试官】JavaSE常见面试题(三)

[前言]别人都在你看不到的地方暗自努力,在你看得到的地方,他们也和你一样显得游手好闲,和你一样会抱怨,而只有你自己相信这些都是真的,最后,也只有你一个人继续不思进取 --   [下载]本人刚学习Java时总结的一些JavaSE常见面试题,偶尔在电脑中翻出,重新整理一下分享给需要的人,主要针对初级程序员.想要PDF完整版下载的,评论里留言留下你的邮箱! 41..比较一下Java和JavaSciprt? 答:其实Java和JavaScript最重要的区别是一个是静态语言,一个是动态语言: (1)基于

【JAVA秒会技术之玩转多线程】多线程那些事儿(一)

多线程那些事儿(一)     现在只要出去面试,关于"Java多线程"的问题,几乎没有一家单位不问的,可见其重要性.于是博主抽空研究了一下,确实很有意思!以下是我综合整理了网上的各种资料,和个人的一些理解,写的一篇总结博文,仅供学习.交流. (一)多线程的概念         多线程的概念,简单理解:一个进程运行时产生了不止一个线程.         进程的概念,简单理解:正在运行的程序的实例. 两者之间的关系:进程就是线程的容器. (二)多线程的好处         使用多线程可以提

【JAVA秒会技术之秒杀面试官】JavaSE常见面试题(四)

[前言]别人都在你看不到的地方暗自努力,在你看得到的地方,他们也和你一样显得游手好闲,和你一样会抱怨,而只有你自己相信这些都是真的,最后,也只有你一个人继续不思进取 --   [下载]本人刚学习Java时总结的一些JavaSE常见面试题,偶尔在电脑中翻出,重新整理一下分享给需要的人,主要针对初级程序员.想要PDF完整版下载的,评论里留言留下你的邮箱! 61.同步代码块与同步函数的区别? 答:(1)同步代码块:位置比较灵活,锁对象可以任意对象,但必须是同一对象.格式:              

【JAVA秒会技术之秒杀面试官】JavaEE常见面试题(三)

[前言]别人都在你看不到的地方暗自努力,在你看得到的地方,他们也和你一样显得游手好闲,和你一样会抱怨,而只有你自己相信这些都是真的,最后,也只有你一个人继续不思进取 --   [下载]个人结合诸多资料,总结的一些JavaEE常见面试题,主要针对初/中级程序员.想要word完整版下载的,评论里留言留下你的邮箱! 31.Spring中的BeanFactory和ApplicationContext有什么联系? 答:①Spring通过配置文件描述Bean以及Bean之间的依赖关系,利用Java的反射机制

【JAVA秒会技术之玩转SQL】MySQL优化技术(一)

MySQL优化技术(一)         开发的路上,总会碰到一些老系统,越用越慢."慢"的原因也许有很多,但是,博主个人觉得,数据库的设计和sql语句写的好坏,对系统效率的影响是最直接,最显而易见的!所以,学习一下MySQL的优化,还是很有必要的.当然,博主能力有限,没那么多经验,更多的是"道听途说"和"纸上谈兵".如有不正之处,望大神开后给予指正,不胜感激! (一)MySQL优化技术概述 ①表的设计合理化(符合3NF,即符合"三范式

【JAVA秒会技术之秒杀面试官】JavaEE常见面试题(四)

[前言]别人都在你看不到的地方暗自努力,在你看得到的地方,他们也和你一样显得游手好闲,和你一样会抱怨,而只有你自己相信这些都是真的,最后,也只有你一个人继续不思进取 --   [下载]个人结合诸多资料,总结的一些JavaEE常见面试题,主要针对初/中级程序员.想要word完整版下载的,评论里留言留下你的邮箱! 46.Request对象的主要方法? 答:(1)setAttribute(String name,Object):设置名字为name的request的参数值 (2)getAttribute

【JAVA秒会技术之搞定Quartz定时任务】Quartz在Spring中的集成与应用

  Quartz在Spring中的集成与应用   一.Quqrtz简介     Quartz是一个完全由Java编写的开源任务调度的框架,通过触发器设置作业定时运行规则,控制作业的运行时间.主要用来执行定时任务,如:定时发送信息.定时生成报表等等. 简而言之,Quartz是一个定时器组件,是可以整合Spring使用的一个定时器.     二.Quqrtz的配置文件     1.在maven中引入: <dependency> <groupId>org.quartz-scheduler