刚好遇见你----ActiveMQ

406 阅读3分钟

因为我刚好遇见你,所以我要更懂你!初次见面,老规矩,比较害羞,先从入门教程说起!

1、ActiveMQ 简介

Apache ActiveMQ 是最流行和最强大的开源消息传递和集成模式服务器。

Apache ActiveMQ速度很快,支持许多跨语言客户端和协议,随附易于使用的企业集成模式和许多高级功能。

说到底是一个中间件!

2、首先从官网下载安装包

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

下载之后解压,然后进入bin目录,执行下面命令

activemq start

如果看到如下界面,说明启动成功!

浏览器登陆http://127.0.0.1:8161/admin/queues.jsp即可看到管理页面!

其中QUEUES,TOPIC分别对应点-点模型,订阅/发布模型

3、编写消息消费者,模拟消费消息

编写流程依据JMS API标准,如图:

import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.Destination;
import javax.jms.MessageConsumer;
import javax.jms.Session;
import javax.jms.TextMessage;

import org.apache.activemq.ActiveMQConnectionFactory;

/**
 * 消息的消费者(接受者)
 * 
 * @author Administrator
 * 
 */
public class JMSConsumer {

    public static void main(String[] args)  {
        try {
        	//创建'链接工厂',用于创建Connection,此处用到工厂设计模式,以后去了解一下
            ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(
            		ActiveMQConnectionFactory.DEFAULT_USER, //默认用户名
                    ActiveMQConnectionFactory.DEFAULT_PASSWORD, //默认密码
                    "tcp://localhost:61616");//默认连接
            //通过工厂创建链接
            Connection connection = connectionFactory.createConnection();
            //Connection默认是关闭的。
            connection.start();//
            
            //创建会话,是否启动事务,选择相应的应答模式(因为消费者消费完消息之后必须向队列报告)
            Session session = connection.createSession(Boolean.FALSE, Session.AUTO_ACKNOWLEDGE);
            
            //通过Session创建Destination对象,指的是一个客户端用来指定生产消息目标和消费消息来源的对象,在PTP模式中,Destination被称作Queue即队列;在Pub/Sub模式,Destination被称作Topic即主题。在程序中可以使用多个Queue和Topic。
            Destination destination = session.createQueue("HelloWorld");
            //创建消费者
            MessageConsumer consumer = session.createConsumer(destination);
            
            while(true){
                TextMessage msg = (TextMessage)consumer.receive();
                if(msg == null) {
                    break;
                }
                System.out.println("收到的内容:" + msg.getText());
            }            
        } catch (Exception e) {
            e.printStackTrace();
        }
        
    }

}

4、编写消息提供者,模拟上传20条消息

import javax.jms.*;

import org.apache.activemq.ActiveMQConnectionFactory;

/**
 * 消息的生产者(发送者)
 * 
 * @author Administrator
 * 
 */
public class JMSProducer {

    
    public static void main(String[] args) {
        try {
            ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(
                    ActiveMQConnectionFactory.DEFAULT_USER, 
                    ActiveMQConnectionFactory.DEFAULT_PASSWORD, 
                    "tcp://localhost:61616");
            
            Connection connection = connectionFactory.createConnection();
            connection.start();
            
            Session session = connection.createSession(Boolean.TRUE, Session.AUTO_ACKNOWLEDGE);
            
            Destination destination = session.createQueue("HelloWorld");
            
            MessageProducer producer = session.createProducer(destination);
            
            for(int i = 0 ; i < 10 ; i ++){
                TextMessage msg = session.createTextMessage("我是消息内容" + i);
                // 第一个参数目标地址
                // 第二个参数 具体的数据信息
                // 第三个参数 传送数据的模式
                // 第四个参数 优先级
                // 第五个参数 消息的过期时间(这个参数需要特别注意,设置太少则消费者找不到信息,因为消息都过期了)
                producer.send(destination, msg, DeliveryMode.NON_PERSISTENT, 0 , 100000L);
                System.out.println("发送消息:" + msg.getText());
                session.commit(); //启用事务时记得提交事务,不然消费端接收不到消息
                Thread.sleep(1000);
            }

            if(connection != null){
                connection.close();
            }            
        } catch (Exception e) {
            e.printStackTrace();
        }
        
    }

}

5、先运行提供者,再运行消费者

6、体会

虽然说JMS API支持订阅/发布模型,但是实际运用中往往先考虑需求,而不是一致地应用技术!

我举个栗子:

现在有这么一个需求,就像微博的关注,假设有5千万人关注了范冰冰,当范冰冰发表一条微博的时候,这5千万人都会收到一个系统通知吗?很显然不会这么做,为什么?因为这对服务器来说一个人虽没有什么压力,但1000000个有大量粉丝的人(不一定要是明星)在同一时间发微博呢?显然服务器就有压力了!况且这么多粉丝,活跃的有多少呢?僵死粉还有必要给他通知吗?那怎么做呢?往往采用结合的方法,就像你看微信朋友圈一样,你会执行一个操作就是下拉刷新,这就是,即当你有需求时,我再向服务器请求数据回来,这不很nice吗?

像微博中的特别关心就不一样了!想想一个人特别关心的人不是非常的多,这种采用直接即可!