Activemq 是由Apache出品的一款开源消息中间件,旨在为应用程序提供高效、可扩展、稳定、安全的企业级消息通信。它的设计目标是提供标准的、面向消息的、多语言的应用集成消息通信中间件。ActiveMQ 实现了JMS1.1并提供了很多附加的特性,比如JMX管理、主从管理、消息组通信、消息优先级、延迟接收消息、虚拟接收者、消息持久化、消息队列监控等。
一、基本概念:
(1)消息传送模型
* 点对点模型。使用队列作为消息通信载体,满足生产者与消费者模式。一条消息只能被一个消费者使用,未被消费的消息在队列中保留知道被消费或者超时。
* 发布-订阅模型。使用主题作为消息通信载体,类似于广播模式,发布者发布一条消息,该消息通过主题传递给所有的订阅者,在一条消息被广播之后才订阅的用户是收不到该条消息的。
(2)基本组件
broker(消息代理),producer(消息生产者),consumer(消息消费者),topic(主题),queue(队列),message(消息)
(3)连接器
ActiveMQ Broker的主要作用是为客户端应用提供一种通信机制。为此ActiveMQ 提供了一种连接机制,并用连接器(Connector)来描述这种连接机制。
(4)消息存储
在JMS规范中对消息的分发方式有两种:非持久化和持久化。非持久化消息,JMS实现者尽力分发消息,但消息不会持久化存储;而采用持久化方式分发的消息则必须进行持久化存储。
二、代码实例
1、Java访问ActiveMQ实例
官网下载apache-activemq-5.15.2-bin.zip包
根据机器类型执行activemq.bat启动服务。端口是默认的
创建java或者maven工程,引入依赖activemq-all-5.15.2.jar
*****************************我是分割线*******************************
package com.my.activemq;
import javax.jms.*;
import org.apache.activemq.ActiveMQConnection;
import org.apache.activemq.ActiveMQConnectionFactory;
public class TopicPublisher {
public static final String USERNAME = ActiveMQConnection.DEFAULT_USER;
public static final String PASSWORD = ActiveMQConnection.DEFAULT_PASSWORD;
public static final String BROKER_URL = ActiveMQConnection.DEFAULT_BROKER_URL;
public static void main(String[] args) {
ConnectionFactory connectionFactory = new ActiveMQConnectionFactory
(USERNAME,PASSWORD,BROKER_URL);
try {
Connection connection = connectionFactory.createConnection();
connection.start();
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
Topic myTestTopic = session.createTopic("topic1");
MessageProducer producer = session.createProducer(myTestTopic);
for(int i=1;i<=3 ;i++){
TextMessage message = session.createTextMessage("send message " + i);
producer.send(myTestTopic,message);
}
//close resource
session.close();
connection.close();
}catch(JMSException e){
e.printStackTrace();
}
}
}
*****************************我是分割线*******************************
package com.huawei.activemq;
import javax.jms.*;
import org.apache.activemq.ActiveMQConnectionFactory;
import org.apache.activemq.ActiveMQConnection;
public class TopicSubscriber {
public static final String USERNAME = ActiveMQConnection.DEFAULT_USER;
public static final String PASSWORD = ActiveMQConnection.DEFAULT_PASSWORD;
public static final String BROKER_URL = ActiveMQConnection.DEFAULT_BROKER_URL;
public static void main(String[] args){
ConnectionFactory connectionFactory = new ActiveMQConnectionFactory
(USERNAME,PASSWORD,BROKER_URL);
try {
Connection connection = connectionFactory.createConnection();
connection.start();
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
Topic myTestTopic = session.createTopic("topic1");
MessageConsumer messageConsumer = session.createConsumer(myTestTopic);
messageConsumer.setMessageListener(new MessageListener(){
@Override
public void onMessage(Message message) {
// TODO Auto-generated method stub
try{
System.out.println("receiver1: " + ((TextMessage)message).getText() );
}catch(JMSException e){
e.printStackTrace();
}
}
});
MessageConsumer messageConsumer2 = session.createConsumer(myTestTopic);
messageConsumer2.setMessageListener(new MessageListener(){
@Override
public void onMessage(Message message) {
// TODO Auto-generated method stub
try{
System.out.println("receiver1: " + ((TextMessage)message).getText() );
}catch(JMSException e){
e.printStackTrace();
}
}
});
MessageConsumer messageConsumer3 = session.createConsumer(myTestTopic);
messageConsumer3.setMessageListener(new MessageListener(){
@Override
public void onMessage(Message message) {
// TODO Auto-generated method stub
try{
System.out.println("receiver1: " + ((TextMessage)message).getText() );
}catch(JMSException e){
e.printStackTrace();
}
}
});
Thread.sleep(100*1000);
//close resource
session.close();
connection.close();
}catch(JMSException e){
e.printStackTrace();
}catch(InterruptedException ee){
ee.printStackTrace();
}
}
}
本例创建了3个消费者并订阅了同一个主题。需要先运行topicsubscriber类的main方法,这样发布者发送消息时订阅者爱能接收到消息。日志如下:
INFO | Successfully connected to tcp://localhost:61616
receiver1: send message 1
receiver1: send message 1
receiver1: send message 1
receiver1: send message 2
receiver1: send message 2
receiver1: send message 2
receiver1: send message 3
receiver1: send message 3
receiver1: send message 3