MQ、JMS以及ActiveMQ 关系的理解

一、MQ 
1.1 关于消息队列 MQ 
消息队列(MQ)是一种应用程序对应用程序的通信方法。应用程序通过写和检索出入列队的针对应用程序的数据(消息)来通信,而无需专用连接来链接它们。消息传递指的是程序之间通过在消息中发送数据进行通信,而不是通过直接调用彼此来通信,直接调用通常是用于诸如远程过程调用的技术。排队指的是应用程序通过队列来通信。队列的使用除去了接收和发送应用程序同时执行的要求 
1.2 MQ特点: 
MQ的消费-生产者模型的一个典型的代表,一端往消息队列中不断的写入消息,而另一端则可以读取或者订阅队列中的消息。MQ和JMS类似,但不同的是JMS是SUN JAVA消息中间件服务的一个标准和API定义,而MQ则是遵循了AMQP协议的具体实现和产品。

1.3 使用场景: 
在项目中,将一些无需即时返回且耗时的操作提取出来,进行了异步处理,而这种异步处理的方式大大的节省了服务器的请求响应时间,从而提高了系统的吞吐量。

二、JMS 

2.1 关于JMS 
JMS即Java消息服务(Java Message Service)应用程序接口,是一个Java平台中关于面向消息中间件(MOM)的API,用于在两个应用程序之间,或分布式系统中发送消息,进行异步通信。Java消息服务是一个与具体平台无关的API,绝大多数MOM提供商都对JMS提供支持。

2.2. JMS体系结构

JMS由以下元素组成 
JMS提供者 —— 连接面向消息中间件的,JMS接口的一个实现。提供者可以是Java平台的JMS实现,也可以是非Java平台的面向消息中间件的适配器 (activemq,rabbitmq等)。 
JMS客户 —— 生产或消费基于消息的Java的应用程序或对象(生产者和消费者) 
JMS生产者 —— 创建并发送消息的JMS客户。(activemq 中体现为生成消息对象,并将对象存入消息队列中。) 
JMS消费者 —— 接收消息的JMS客户。(activemq 中体现为获取消息队列中的消息对象,进行相应的业务处理) 
JMS消息 —— 在JMS客户之间传递的数据的对象 
JMS队列 —— 一个容纳那些被发送的等待阅读的消息的区域。与队列名字所暗示的意思不同,消息的接受顺序并不一定要与消息的发送顺序相同。 
JMS主题 —— 一种支持发送消息给多个订阅者的机制。

2.3 JMS对象类型 
连接工厂(ConnectionFactory)利用连接工厂创建一个JMS连接。 
JMS连接(Connection)表示JMS客户端和服务器端之间的一个活动的连接,是由客户端通过调用连接工厂的方法建立的。 
JMS会话(Session)表示JMS客户与JMS服务器之间的会话状态。JMS会话建立在JMS连接上,表示客户与服务器之间的一个会话线程。 
JMS目的(Destination),又称为消息队列,是实际的消息源。 
生产者(Message Producer)和消费者(Message Consumer)对象由Session对象创建,用于发送和接收消息。

2.4 JMS消息通常有两种类型: 
① 点对点(Point-to-Point)。在点对点的消息系统中,消息分发给一个单独的使用者。点对点消息往往与队列(javax.jms.Queue)相关联。【针对该消息,只有一个消费者将获得消息】 
② 发布/订阅(Publish/Subscribe)。发布/订阅消息系统支持一个事件驱动模型,消息生产者和消费者都参与消息的传递。生产者发布事件,而使用者订阅感兴趣的事件,并使用事件。该类型消息一般与特定的主题(javax.jms.Topic)关联。【针对该消息:多个消费者可以获得消息】

3、JMS和MQ的关系: 
JMS是一个用于提供消息服务的技术规范,它制定了在整个消息服务提供过程中的所有数据结构和交互流程。而MQ则是消息队列服务,是面向消息中间件(MOM)的最终实现,是真正的服务提供者;MQ的实现可以基于JMS,也可以基于其他规范或标准。

二. ActiveMQ 了解与操作 
对于MQ本次使用的activeMQ. 
1. ActiveMQ的安装(windows)

从官网下载安装包, http://activemq.apache.org/download.html 
直接解压,进入相应的bin目录下,选择相应的版本,点击active.bat即可 
如果想把其安装成服务,点击InstallService.bat即可安装成服务启动。 
图片如下: 


启动后,activeMQ会占用两个端口,一个是负责接收发送消息的tcp端口:61616,一个是基于web负责用户界面化管理的端口:8161。这两个端口可以在conf下面的xml中找到。 
启动完成后,管理界面访问地址为:http://localhost:8161/admin/ 默认的用户名 :admin 密码为:admin 具体可以在conf文件夹下的users.properties中查看 
图片如下: 


2、使用java 操作activemq

2.1 生产者:产生消息对象,放入队列中。具体代码如下:

 

/**
 * 生产者
 * @author onionflower
 *
 */
public class JMSProducer {


    private static final int SENDNUM = 10;

    public static void main(String[] args) {
        //连接工厂
        ConnectionFactory connectionFactory;
        //连接
        Connection connection  = null;
        //会话,接受或者发送消息的线程
        Session session;
        //消息的目的地
        Destination destination;
        //消息生产者
        MessageProducer messageProducer;
        //实例化工厂
        connectionFactory = new ActiveMQConnectionFactory(ConnectionConstants.BROKENURL);
        try {
            //获取连接
            connection = connectionFactory.createConnection(ConnectionConstants.USERNAME, ConnectionConstants.PASSWORD);
            //启动连接
            connection.start();
            //创建session
            //参数1:true:当记录被消费后,中间站中的数据不会被删除。false:当记录被消费后,中间站中的数据会被删除  【参数1为true,第二个参数无效】
            //参数2:Session.AUTO_ACKNOWLEDGE为自动确认,客户端发送和接收消息不需要做额外的工作。异常也会确认消息,应该是在执行之前确认的
            //Session.CLIENT_ACKNOWLEDGE为客户端确认。客户端接收到消息后,必须调用javax.jms.Message的acknowledge方法。jms服务器才会删除消息。可以在失败的
            //时候不确认消息,不确认的话不会移出队列,一直存在,下次启动继续接受。接收消息的连接不断开,其他的消费者也不会接受(正常情况下队列模式不存在其他消费者)
            //DUPS_OK_ACKNOWLEDGE允许副本的确认模式。一旦接收方应用程序的方法调用从处理消息处返回,会话对象就会确认消息的接收;而且允许重复确认。在需要考虑资源使用时,这种模式非常有效。
            session = connection.createSession(true, Session.AUTO_ACKNOWLEDGE);
            //创建一个消息队列
            destination = session.createQueue("firstDemo");
            //创建消息生成这
            messageProducer = session.createProducer(destination);
            //发送消息
            sendMessage(session, messageProducer);

            session.commit();
        } catch (JMSException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    public static void sendMessage(Session session,MessageProducer messageProducer) throws JMSException{
        for(int i=0;i<SENDNUM ;i++){
            TextMessage message = session.createTextMessage("ACTIVEMQ 生产者 生产消息,这是第"+i+"次生产");
            //发出消息
            messageProducer.send(message);
        }
    }
}


2.2 消费者:从队列中获取消息对象具体代码如下:

/**
 * 消息消费者
 * @author onionflower
 *
 */
public class JMSConSumer {

    public static void main(String[] args) {
        ConnectionFactory connectionFactory ;

        Connection connection;

        Session session;

        Destination destination;
        //消息消费者
        MessageConsumer messageConsumer;

        connectionFactory = new ActiveMQConnectionFactory(ConnectionConstants.BROKENURL);

        try {
            connection = connectionFactory.createConnection(ConnectionConstants.USERNAME, ConnectionConstants.PASSWORD);

            connection.start();

            session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);

            destination = session.createQueue("firstDemo");

            messageConsumer = session.createConsumer(destination);

            while (true) {
                TextMessage textMessage = (TextMessage) messageConsumer.receive(10000);
                if(textMessage != null){
                    System.out.println("ACTIVEMQ 消费者收到的消息:"+textMessage.getText());
                }else{
                    break;
                }
            }
        } catch (JMSException e) {
            e.printStackTrace();
        }

    }
}


常量辅助类:

/**
 * 常量使用类
 * @author onionflower
 *
 */
public class ConnectionConstants {

    //默认用户名
    public static final String USERNAME = ActiveMQConnection.DEFAULT_USER;
    //默认密码
    public static final String PASSWORD = ActiveMQConnection.DEFAULT_PASSWORD;
    //默认连接url地址
    public static final String BROKENURL = ActiveMQConnection.DEFAULT_BROKER_URL;
}


运行结果如下所示: 
1、启动生产着和消费者,启动之后,会在管理界面可以看到消息对象的生产和消费情况,如下: 


控制台运行情况如下: 


2、运行程序之后,我们可以返现,生成者和消费者程序启动之后, 程序一直处于监听状态。

源码下载地址如下:http://download.csdn.net/download/u012151597/10174263
--------------------- 
作者:洋葱花瓣 
来源:CSDN 
原文:https://blog.csdn.net/u012151597/article/details/78904171 
版权声明:本文为博主原创文章,转载请附上博文链接!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值