ActiveMQ

ActiveMQ消息管理、消息机制

1:MQ是什么?
2:MQ和JMS是什么关系?
3:MQ能做什么?
4:MQ有哪些组件组成?
5:MQ的应用场景
6:如何使用MQ?

ActiveMQ是什么?

ActiveMQ 是Apache出品,最流行的,能力强劲的开源消息总线。
ActiveMQ 是一个完全支持JMS1.1和J2EE 1.4规范的 JMS Provider实现.

ActiveMQ目录说明

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

JMS 简介:

1:JMS(Java  Message  Service),即:java消息服务应用程序接口。
2:是Java平台面向消息中间件(MOM)的API/技术规范。

场景:

应用与两个应用程序之间,或者分布式系统架构中分发消息,可进行异步/同步方式的通讯,和平台API无关,基本多数的MOM都提供对JMS的支持
JMS 体系架构:

1. JMS提供者
        连接面向消息中间件的,JMS接口的一个实现。提供者可以是Java平台的JMS实现,也可以是非Java平台的面向消息中间件的适配器。
2. JMS客户
        生产或消费基于消息的Java的应用程序或对象
3. JMS生产者
        创建并发送消息的JMS客户
4. JMS消费者
        接收消息的JMS客户
5. JMS消息
        包括可以在JMS客户之间传递的数据的对象
6. JMS队列
        一个容纳那些被发送的等待阅读的消息的区域。与队列名字所暗示的意思不同,消息的接受顺序并不一定要与消息的发送顺序相同。一旦一个消息被阅读,该消息将被从队列中移走
7. JMS主题
        一种支持发送消息给多个订阅者的机制

JMS 属性:

Destination(接口/目标)
Product(生产者)
Consumer(消费者)
Broker(消息转发器)
P2P,Pub/Sub(模型)
P2P:消息队列(Queue)、发送者(Sender)、接收者(Receiver)
Pub/Sub:主题(Topic)、发布者(Publisher)、订阅者(Subscriber)

ActiveMQ和JMS的关系:

JMS是一种规范
ActiveMQ是JMS规范的一种实现

ActiveMQ架构图:

ActiveMQ主要特性:

(1)JMS1.1、J2EE1.4
(2)J2EE servers(Tomcat,JBoss4,GlassFish,WebLogic…)
(3)多语言客户端(Java,C,C++,C#,Ruby,PhP)
(4)多种协议(VM,TCP,SSL,UDP,multicast,JGroups…)
(5)Spring
(6)Ajax
(7)CXF,Axis(WebService的两个流行的框架)
(8)REST(状态传递)
(9)Message Groups,Virtual Destinations,Wildcards,Composite , Destinations
(10)持久化(journal,JDBC)
(11)性能(client-server,cluster,peer…)

ActiveMQ功能:

多种协议
持久化
安全
集群
监控
其他

AvtiveMQ多种协议:

URI:   scheme:scheme-specific-part(通用)

eg:

    VM vm://brokername 
    TCP tcp://host:port (常用)
    SSL ssl://host:port (常用)
    HTTP http://host:port (常用)
    UDP udp://host:port 
    peer   peer://group/brokername 
    multicast multicast://IPAddress
    static static(list uris) 
    failover failvoer(list uris)
    discovery discovery://host:port

ActiveMQ持久化:

日志
    <journaledJDBC journalLogFiles="5"dataDirectory="../mq-data" />

数据库
    包括: Derby,HSQL,MySQL,SQLServer, Sybase,DB2,Oracle…
    <journaledJDBC  dataSource="#mysql-ds"/>

ActiveMQ安全:

认证
    simpleAuthenticationPlugin
    jaasAuthenticationPlugin
授权
   authorizationPlugin

ActiveMQ集群:

Master/Slave
Network of Brokers

ActiveMQ监控:

JMX(Java管理扩展框架)
Advisory  Message(通知消息)

Queue与Topic区别

ActiveMQ作为实现JMS中间件优点

1.多种语言和协议编写客户端。语言: Java, C, C++, C#, Python, PHP。
2.完全支持JMS1.1和J2EE 1.4规范 (持久化,XA消息,事务)
3.对Spring的支持,ActiveMQ可以很容易内嵌到使用Spring的系统里面去,而且也支持Spring2.0的特性
4.完全支持JMS1.1和J2EE 1.4规范 (持久化,XA消息,事务)
5.通过了常见J2EE服务器(如 Geronimo,JBoss 4, GlassFish,WebLogic)的测试,其中通过JCA 1.5 resource adaptors的配置,可以让ActiveMQ可以自动的部署到任何兼容J2EE 1.4 商业服务器上
6.支持多种传送协议
7.从设计上保证了高性能的集群,客户端-服务器,点对点
8.支持Ajax
9.支持与Axis的整合
10.可以很容易得调用内嵌JMS provider,进行测试

ActiveMQ关键词

ActiveMQConnectionFactory:
    实现了jms的ConnectionFactory,Connection的工厂类 
Connection :
    JMS连接,和Java连接池的Connection差不多  Producer和Consumer用来和Broker通讯的 
Session :
     会话 
Destination :
    目的地,数据要发送到哪里或者从哪里取 
MessageProducer: 
    生产者 
MessageConsumer :
    消费者 
Message :
     消息,add到队列的东西,也就是自己要处理的东西,Message有很多子接口,TextMessage或ByteMessage

ActiveMQ入门示例

1:导包:
activeio-core-3.1.4.jar
activemq-all-5.13.2.jar
activemq-pool-5.13.2.jar
commons-pool2-2.4.2.jar
或者:
activemq-all-5.3.0.jar
2:创建生产者
    /**
     * 发送消息--生产者---消息提供者
     * @author zxh
     * @date   2017-11-17 下午2:30:12
     */
public class Product {

    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;//连接的URL--broker

    public static void main(String[] args) {

        ConnectionFactory connectionFactory;//连接工厂
        Connection connection;//连接
        Session session;//会话
        Destination destination;//消息的接口(目的地)
        MessageProducer messageProducer;//消息生产者

        connectionFactory = new ActiveMQConnectionFactory(USERNAME,PASSWORD,BROKEURL);//初始化工厂信息
        try {
            connection = connectionFactory.createConnection();//建立连接
            connection.start();//开启连接
            /**
             * 参数1:true和false---是否开启事务
             * 参数2:
             * AUTO_ACKNOWLEDGE:消息的生产者和消费者无需做任何副本操作,即可获取消息内容或发送消息(自动装配模式)
             * CLIENT_ACKNOWLEDGE:发送消息后,需要消息的接受者客户端发送确认操作,才可以获取消息
             * DUPS_OK_ACKNOWLEDGE:是需要副本操作的
             * SESSION_TRANSACTED:只需要参数1为false的时候,才可以使用
             * 
             * 如果参数1为true,则代表连接需要开启事务,false不需要开启事务
             * 如果参数1位true、则参数2可以为AUTO_ACKNOWLEDGE、CLIENT_ACKNOWLEDGE、DUPS_OK_ACKNOWLEDGE
             * 如果参数1位false,则参数2可以为四种
             */
            session = connection.createSession(true, Session.AUTO_ACKNOWLEDGE);
            destination = session.createQueue("java11");//采用queue主题协议,进行消息发送,参数代表消息名称(主题)
            messageProducer = session.createProducer(destination);//创建生产者
            sendMessage(session,messageProducer);
            //如果不写commit,消息也可以发送成功,但是是没有安全监控的,数据不存储
            session.commit();//提交消息
        } catch (JMSException e) {
            e.printStackTrace();
        }
    }

    /**
     * 发送消息方法
     * @param session
     * @param messageProducer
     * @throws JMSException
     */
    private static void sendMessage(Session session,
            MessageProducer messageProducer) throws JMSException {
        for (int i = 0; i < 5; i++) {
            TextMessage message = session.createTextMessage("生产者发送消息内容为:第"+i+"条消息");
            System.out.println("生产者发送消息内容为:第"+i+"条消息");
            messageProducer.send(message);//发送消息
        }
    }
}
3:创建消费者
/**
 * 消息的接受者(消费者)
 * @author zxh
 * @date   2017-11-17 下午2:48:57
 */
public class Cousmer {

    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;//连接的URL--broker

    public static void main(String[] args) {
        ConnectionFactory connectionFactory;//连接工厂
        Connection connection;//连接
        Session session;//会话
        Destination destination;//消息的接口(目的地)
        MessageConsumer messageConsumer;

        connectionFactory = new ActiveMQConnectionFactory(USERNAME,PASSWORD,BROKEURL);//实例化工厂
        try {
            connection = connectionFactory.createConnection();//建立连接
            connection.start();//开启连接
            session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);//创建会话
            destination = session.createQueue("java11");
            messageConsumer = session.createConsumer(destination);//创建接受者
            while(true){
                TextMessage message = (TextMessage) messageConsumer.receive(100000);//接收消息,接收时间为100S
                if (message != null) {
                    System.out.println("消费者收到消息为:"+message);
                }else{
                    break;
                }
            }

        } catch (JMSException e) {
            e.printStackTrace();
        }
    }
}
4:启动ActiveMQ服务
activemq.bat双击启动,不要关闭启动窗口
5:运行生产者
main方法运行,并打印到控制台
6:运行消费者
main方法运行,并打印到控制台
7:监控平台
http://localhost:8161/admin/queues.jsp

ActiveMQ应用场景

1:发消息
    多个应用程序之间进行消息交互
2:用于分布式业务场景
3:执行任务的监控

原始的任务监控方案:

使用ActiveMQ监控执行任务:

使用ActiveMQ解决消息丢失问题:

后台监控页面:

入门示例2-集成Spring、SpringMVC

步骤:
1:配置MQ的工厂连接
2:配置session信息(缓存、有效期、session最大值等等)
3:配置topic和queue主题信息
4:配置topic和queue主题的监听
AcitveMQ.xml配置信息:
<!-- ActiveMQ 连接工厂 -->
<!-- 真正可以产生Connection的ConnectionFactory,由对应的 JMS服务厂商提供-->
<!-- 如果连接网络:tcp://ip:61616;未连接网络:tcp://localhost:61616 以及用户名,密码-->
<amq:connectionFactory id="amqConnectionFactory" brokerURL="tcp://localhost:61616" userName="admin" password="admin"  />

<!-- Spring Caching连接工厂 -->
<!-- Spring用于管理真正的ConnectionFactory的ConnectionFactory -->  
<bean id="connectionFactory" class="org.springframework.jms.connection.CachingConnectionFactory">
    <!-- 目标ConnectionFactory对应真实的可以产生JMS Connection的ConnectionFactory -->  
    <property name="targetConnectionFactory" ref="amqConnectionFactory"></property>
    <!-- Session缓存数量 -->
    <property name="sessionCacheSize" value="100" />
</bean>
<!-- Spring JmsTemplate 的消息生产者 start-->
<!-- 定义JmsTemplate的Queue类型 -->
<bean id="jmsQueueTemplate" class="org.springframework.jms.core.JmsTemplate">
    <!-- 这个connectionFactory对应的是我们定义的Spring提供的那个ConnectionFactory对象 -->  
    <constructor-arg ref="connectionFactory" />
    <!-- 非pub/sub模型(发布/订阅),即队列模式 -->
    <property name="pubSubDomain" value="false" />
</bean>
<!-- 定义JmsTemplate的Topic类型 -->
<bean id="jmsTopicTemplate" class="org.springframework.jms.core.JmsTemplate">
     <!-- 这个connectionFactory对应的是我们定义的Spring提供的那个ConnectionFactory对象 -->  
    <constructor-arg ref="connectionFactory" />
    <!-- pub/sub模型(发布/订阅) -->
    <property name="pubSubDomain" value="true" />
</bean>
<!--Spring JmsTemplate 的消息生产者 end-->
<!-- 消息消费者 start-->
<!-- 定义Queue监听器 -->
<jms:listener-container destination-type="queue" container-type="default" 
    connection-factory="connectionFactory" acknowledge="auto">
    <jms:listener destination="test.queue" ref="queueReceiver1"/>
    <jms:listener destination="test.queue" ref="queueReceiver2"/>
</jms:listener-container>
<!-- 定义Topic监听器 -->
<jms:listener-container destination-type="topic" container-type="default" 
    connection-factory="connectionFactory" acknowledge="auto">
    <jms:listener destination="test.topic" ref="topicReceiver1"/>
    <jms:listener destination="test.topic" ref="topicReceiver2"/>
</jms:listener-container>

<!-- 消息消费者 end -->

实现流程:

SS框架

发送:

/message.do-->controller-->servive(@Component)--->使用jms的基类模型JmsTemplate,并调用JmsTemplate的send方法

接收:

实现MessageListener接口,接收返回信息

代码:

参考工程代码
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值