ActiveMQ是基于JMS实现的,JMS是J2EE规范中的一个。它有两种消息传播方式:点对点和发布/订阅模式。其中EJB的MDB(消息驱动bean)也是基于JMS实现的。ActiveMQ是一个开源的消息服务总线。下面通过一个实例逐步认识它。这里主要讲解点对点的方式。
一、启动avtivemq服务
1.首先下载avtivemq的压缩包
2.解压(E:\apache-activemq-5.12.0)
3.启动,在bin目录下,有32位和64位系统不同的文件夹,可自行选择进入不同的文件夹,执行activemq.bat脚本
启动成功如下:
成功后,ActiveMQ 服务启动地址:http://127.0.0.1:8161/admin/用户名/密码admin/admin,如下:
在第一行标题中看到queues,里面显示点对点消息的传播信息。
二、点对点模型(P2P)
在点对点模型中,相当于两个人打电话,两个人独享一条通信线路。一方发送消息,一方接收消息。
在p2p的模型中,双方通过队列交流,一个队列只有一个生产者和一个消费者。
三、生产者
1.新建一个java项目,引入上面解压的压缩包中的activemq-all-5.12.0.jar即可。
2.执行入口
package com.tgb.activemq;
import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.MessageProducer;
import javax.jms.Session;
import javax.jms.TextMessage;
import org.apache.activemq.ActiveMQConnection;
import org.apache.activemq.ActiveMQConnectionFactory;
/**
* 消息生产着
* @author xx
*
*/
public class JMSProducer {
//默认连接用户名
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;
//发送的消息数量
private static final int SENNUM = 10;
public static void main(String[] args){
ConnectionFactory factory ; //连接工厂
Connection connection = null ; //连接
Session session ; //会话,接收或者发送消息的线程
Destination destination; //消息的目的地
MessageProducer messageProducer; //消息生产者
//实例化连接工厂
factory = new ActiveMQConnectionFactory(JMSProducer.USERNAME, JMSProducer.PASSWORD, JMSProducer.BROKEURL);
//通过连接工厂获取connection
try {
connection = factory.createConnection();
connection.start(); //启动连接
//创建session
session = connection.createSession(Boolean.TRUE, Session.AUTO_ACKNOWLEDGE);
//创建消息队列
destination = session.createQueue("FirstQueue");
//创建消息生产者
messageProducer = session.createProducer(destination);
//发送消息
sendMessage(session, messageProducer);
session.commit();
} catch (JMSException e) {
e.printStackTrace();
}finally{
if (connection != null) {
try {
connection.close();
} catch (JMSException e) {
e.printStackTrace();
}
}
}
}
/**
* 发送消息
* @param session
* @param mp
* @throws JMSException
*/
public static void sendMessage(Session session, MessageProducer mp) throws JMSException{
for(int i = 0;i<JMSProducer.SENNUM;i++){
TextMessage message = session.createTextMessage("ActiveMq 发送的消息" + i);
System.out.println("发送消息:" + "ActiveMq 发送的消息" + i);
mp.send(message);
}
}
}
四、消费者
package com.tgb.activemq;
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.ActiveMQConnection;
import org.apache.activemq.ActiveMQConnectionFactory;
/**
* 消息的消费者
* @author xx
*/
public class JMSConsumer2 {
//默认连接用户名
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;
public static void main(String[] args) {
ConnectionFactory factory ; //连接工厂
Connection connection = null ; //连接
Session session ; //会话,接收或者发送消息的线程
Destination destination; //消息的目的地
MessageConsumer messageConsumer; //消息消费者
//实例化连接工厂
factory = new ActiveMQConnectionFactory(JMSConsumer2.USERNAME, JMSConsumer2.PASSWORD, JMSConsumer2.BROKEURL);
//通过连接工厂获取connection
try {
connection = factory.createConnection();
connection.start(); //启动连接
//创建session
session = connection.createSession(Boolean.FALSE, Session.AUTO_ACKNOWLEDGE);
//创建连接消息队列,消息到达的目的地
destination = session.createQueue("FirstQueue");
//创建消费者
messageConsumer = session.createConsumer(destination);
//注册消息监听
messageConsumer.setMessageListener(new Listener());
}catch(Exception e){
e.printStackTrace();
}
}
}
五、消息监听类
package com.tgb.activemq;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.TextMessage;
/**
* 消息监听类
* @author xx
*/
public class Listener implements MessageListener {
@Override
public void onMessage(Message message) {
try {
System.out.println("收到的消息:" + ((TextMessage)message).getText());
} catch (JMSException e) {
e.printStackTrace();
}
}
}
六、执行
1.首先执行生产者,消费者监听生产者,可以在activemq的服务页面中看到如下效果
生产者生产了10条消息放到队列中,消费者为0
2.执行消费者
消费者一个,(Messages Dequeued)出队列的消息10条,(number of pending message)等待消费的消息数0。
七、总结
点对点消息的传播,生产者向特定的消息队列传播消息,一个消费者从该队列读取消息。生产者不需要在接收者接收消息时处于运行,消费者也不需要生产者在发送消息时处于运行状态,队列相当于一个中间的仓库,生产者发送消息,立即返回状态发送成功。等消费者上线时 ,才接受消息。