一、介绍
ActiveMQ 是Apache出品,最流行的,能力强劲的开源消息总线。ActiveMQ 是一个完全支持JMS1.1和J2EE 1.4规范的 JMS Provider实现,尽管JMS规范出台已经是很久的事情了,但是JMS在当今的J2EE应用中间仍然扮演着特殊的地位。
二、下载
下面是官网下载连接,可以下载最新版本,安装非常简单,解压后就可以直接使用,本地访问是http://localhost:8161/admin,会有登录用户名和密码,默认都是admin
ActiveMQ官网下载链接: http://activemq.apache.org/download.html
三、Java代码实现消息队列
(1).实现POT模型——主动消费
①消息队列生产者的Java代码实现
package ActiveMQTest;
import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageProducer;
import javax.jms.Session;
import org.apache.activemq.ActiveMQConnectionFactory;
public class PTPProducer {
public static void sendMessage(String data) {
//连接工厂
ConnectionFactory connectionFactory = null;
//连接
Connection connection = null;
//目的地
Destination destination = null;
//会话
Session session = null;
//消息发送者
MessageProducer messageProducer = null;
//消息对象
Message message = null;
try {
//创建连接工厂,连接ActiveMQ服务的工厂
connectionFactory = new ActiveMQConnectionFactory("admin", "admin", "tcp://127.0.0.1:61616");
//通过工厂创建连接对象
connection = connectionFactory.createConnection();
//启动连接
connection.start();
/**
* 通过连接对象,创建会话对象,绑定目的地
* 有两个参数,第一个是是否支持事务,一般是false,第二个是如何确认消息的处理
* session = connection.createSession 或者 Session.AUTO_ACKNOWLEDGE
*/
session = connection.createSession(false, Session.CLIENT_ACKNOWLEDGE);
//创建目的地
destination = session.createQueue("testActiveMQ");
//确定消息的发送者
messageProducer = session.createProducer(destination);
//创建文本消息对象,作为具体数据的载体
message = session.createTextMessage(data);
//发送消息到目的地
messageProducer.send(message);
// System.out.println("消息发送成功");
} catch (JMSException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
try {
if(messageProducer != null) {
messageProducer.close();
}
if(session != null) {
session.close();
}
if(connection != null) {
connection.close();
}
}catch(Exception e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
sendMessage("csdnTest");
}
}
②消息队列消费者Java代码实现
package ActiveMQTest;
import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageConsumer;
import javax.jms.Session;
import javax.jms.TextMessage;
import org.apache.activemq.ActiveMQConnectionFactory;
public class PTPConsumer {
public static String reciveMessage() {
String result = "";
//连接工厂
ConnectionFactory connectionFactory = null;
//连接
Connection connection = null;
//目的地
Destination destination = null;
//会话
Session session = null;
//消息消费者
MessageConsumer messageConsumer = null;
//消息对象
Message message = null;
try {
//创建连接工厂,连接ActiveMQ服务的工厂
connectionFactory = new ActiveMQConnectionFactory("admin", "admin", "tcp://127.0.0.1:61616");
//通过工厂创建连接对象
connection = connectionFactory.createConnection();
//启动连接
connection.start();
/**
* 通过连接对象,创建会话对象,绑定目的地
* 有两个参数,第一个是是否支持事务,一般是false,第二个是如何确认消息的处理
* session = connection.createSession 或者 Session.AUTO_ACKNOWLEDGE
*/
session = connection.createSession(false, Session.CLIENT_ACKNOWLEDGE);
//创建目的地
destination = session.createQueue("testActiveMQ");
//创建消费者对象,指定目的地
messageConsumer = session.createConsumer(destination);
//接收消息
message = messageConsumer.receive();
//处理文本消息
// //确认消息已经接收
message.acknowledge();
result = ((TextMessage)message).getText();
} catch (JMSException e) {
e.printStackTrace();
}
return result;
}
public static void main(String[] args) {
System.out.println(reciveMessage());
}
}
(2)PTP模型——观察者消费
①消息队列生产者的Java代码实现
package ActiveMQTest;
import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageProducer;
import javax.jms.Session;
import org.apache.activemq.ActiveMQConnectionFactory;
public class ProducerListener {
public static void sendMessage(String data) {
//连接工厂
ConnectionFactory connectionFactory = null;
//连接
Connection connection = null;
//目的地
Destination destination = null;
//会话
Session session = null;
//消息发送者
MessageProducer messageProducer = null;
//消息对象
Message message = null;
try {
//创建连接工厂,连接ActiveMQ服务的工厂
connectionFactory = new ActiveMQConnectionFactory("admin", "admin", "tcp://127.0.0.1:61616");
//通过工厂创建连接对象
connection = connectionFactory.createConnection();
//启动连接
connection.start();
/**
* 通过连接对象,创建会话对象,绑定目的地
* 有两个参数,第一个是是否支持事务,一般是false,第二个是如何确认消息的处理
* session = connection.createSession 或者 Session.AUTO_ACKNOWLEDGE
*/
session = connection.createSession(false, Session.CLIENT_ACKNOWLEDGE);
//创建目的地
destination = session.createQueue("testActiveMQ");
//确定消息的发送者
messageProducer = session.createProducer(destination);
//创建文本消息对象,作为具体数据的载体
message = session.createObjectMessage(data);
//发送消息到目的地
messageProducer.send(message);
// System.out.println("消息发送成功");
} catch (JMSException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
try {
if(messageProducer != null) {
messageProducer.close();
}
if(session != null) {
session.close();
}
if(connection != null) {
connection.close();
}
}catch(Exception e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
for(int i = 0; i < 100; i++) {
sendMessage(i + "");
}
}
}
②消息队列消费者Java代码实现
package ActiveMQTest;
import java.io.IOException;
import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageConsumer;
import javax.jms.MessageListener;
import javax.jms.ObjectMessage;
import javax.jms.Session;
import javax.jms.TextMessage;
import org.apache.activemq.ActiveMQConnectionFactory;
public class ConsumerListener {
public void reciveMessage() {
//连接工厂
ConnectionFactory connectionFactory = null;
//连接
Connection connection = null;
//目的地
Destination destination = null;
//会话
Session session = null;
//消息消费者
MessageConsumer messageConsumer = null;
try {
//创建连接工厂,连接ActiveMQ服务的工厂
connectionFactory = new ActiveMQConnectionFactory("admin", "admin", "tcp://127.0.0.1:61616");
//通过工厂创建连接对象
connection = connectionFactory.createConnection();
//启动连接
connection.start();
/**
* 通过连接对象,创建会话对象,绑定目的地
* 有两个参数,第一个是是否支持事务,一般是false,第二个是如何确认消息的处理
* session = connection.createSession 或者 Session.AUTO_ACKNOWLEDGE
*/
session = connection.createSession(false, Session.CLIENT_ACKNOWLEDGE);
//创建目的地
destination = session.createQueue("testActiveMQ");
//创建消费者对象,指定目的地
messageConsumer = session.createConsumer(destination);
//注册监听器,一旦监听器出发后,就会自动接收消息
messageConsumer.setMessageListener(new MessageListener() {
/**
* 监听器一旦注册,就永久有效
* 监听器可以注册多个
*/
public void onMessage(Message message) {
try {
//acknowledge是消息确认的方法,代表consumer接收到消息,接收消息后ActiveMQ会自动删除
message.acknowledge();
ObjectMessage objectMessage = (ObjectMessage)message;
Object data = objectMessage.getObject();
System.out.println(data);
} catch (JMSException e) {
e.printStackTrace();
}
}
});
//阻塞当前代码,代表Listener代码未结束,如果代码结束,监听器会自动关闭
System.in.read();
} catch (JMSException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
ConsumerListener consumerListener = new ConsumerListener();
consumerListener.reciveMessage();
}
}
(3).PUB&SUB模型——发布订阅模式
①生产者(发布者)的Java代码实现
package ActiveMQTest;
import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageProducer;
import javax.jms.Session;
import org.apache.activemq.ActiveMQConnectionFactory;
public class TopicProducer {
public static void sendMessage(String data) {
//连接工厂
ConnectionFactory connectionFactory = null;
//连接
Connection connection = null;
//目的地
Destination destination = null;
//会话
Session session = null;
//消息发送者
MessageProducer messageProducer = null;
//消息对象
Message message = null;
try {
//创建连接工厂,连接ActiveMQ服务的工厂
connectionFactory = new ActiveMQConnectionFactory("admin", "admin", "tcp://127.0.0.1:61616");
//通过工厂创建连接对象
connection = connectionFactory.createConnection();
//启动连接
connection.start();
/**
* 通过连接对象,创建会话对象,绑定目的地
* 有两个参数,第一个是是否支持事务,一般是false,第二个是如何确认消息的处理
* session = connection.createSession 或者 Session.AUTO_ACKNOWLEDGE
*/
session = connection.createSession(false, Session.CLIENT_ACKNOWLEDGE);
//创建目的地
destination = session.createTopic("topicTest");
//确定消息的发送者
messageProducer = session.createProducer(destination);
//创建文本消息对象,作为具体数据的载体
message = session.createTextMessage(data);
//发送消息到目的地
messageProducer.send(message);
// System.out.println("消息发送成功");
} catch (JMSException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
try {
if(messageProducer != null) {
messageProducer.close();
}
if(session != null) {
session.close();
}
if(connection != null) {
connection.close();
}
}catch(Exception e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
sendMessage("testTopic");
}
}
②消费者(订阅者)Java代码实现
package ActiveMQTest;
import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageConsumer;
import javax.jms.Session;
import javax.jms.TextMessage;
import org.apache.activemq.ActiveMQConnectionFactory;
public class TopicConsumer {
public static String reciveMessage() {
String result = "";
//连接工厂
ConnectionFactory connectionFactory = null;
//连接
Connection connection = null;
//目的地
Destination destination = null;
//会话
Session session = null;
//消息消费者
MessageConsumer messageConsumer = null;
//消息对象
Message message = null;
try {
//创建连接工厂,连接ActiveMQ服务的工厂
connectionFactory = new ActiveMQConnectionFactory("admin", "admin", "tcp://127.0.0.1:61616");
//通过工厂创建连接对象
connection = connectionFactory.createConnection();
//启动连接
connection.start();
/**
* 通过连接对象,创建会话对象,绑定目的地
* 有两个参数,第一个是是否支持事务,一般是false,第二个是如何确认消息的处理
* session = connection.createSession 或者 Session.AUTO_ACKNOWLEDGE
*/
session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
//创建目的地
destination = session.createTopic("topicTest");
//创建消费者对象,指定目的地
messageConsumer = session.createConsumer(destination);
//接收消息
message = messageConsumer.receive();
//处理文本消息
result = ((TextMessage)message).getText();
} catch (JMSException e) {
e.printStackTrace();
}
return result;
}
public static void main(String[] args) {
System.out.println(reciveMessage());
}
}