因为我刚好遇见你,所以我要更懂你!初次见面,老规矩,比较害羞,先从入门教程说起!
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吗?
像微博中的特别关心就不一样了!想想一个人特别关心的人不是非常的多,这种采用直接推即可!