##ActiveMQ介绍
ActiveMQ是由Apache出品的,一款最流行的,能力强劲的开源消息总线。ActiveMQ是一个完全支持JMS1.1和J2EE 1.4规范的 JMS Provider实现,它非常快速,支持多种语言的客户端和协议,而且可以非常容易的嵌入到企业的应用环境中,并有许多高级功能。
什么情况下使用ActiveMQ?
多个项目之间集成
(1) 跨平台
(2) 多语言
(3) 多项目
降低系统间模块的耦合度,解耦
(1) 软件扩展性
系统前后端隔离
(1) 前后端隔离,屏蔽高安全区
##运行ActiveMQ
1、双击apache-activemq-5.5.1\bin\win64\activemq.bat运行ActiveMQ程序。
2、ActiveMQ默认启动时,启动了内置的jetty服务器,提供一个用于监控ActiveMQ的admin应用。 创建一个Queue,命名为FirstQueue
admin:http://127.0.0.1:8161/admin/
用户名和密码都是admin
3、ActiveMQ默认使用的TCP连接端口是61616, 通过查看该端口的信息可以测试ActiveMQ是否成功启动 netstat -an|find “61616”
C:\Documents and Settings\Administrator>netstat -an|find “61616”
TCP 0.0.0.0:61616 0.0.0.0:0 LISTENING
##实例测试
###接收者Receiver.java
package jms;
import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.MessageConsumer;
import javax.jms.Session;
import javax.jms.TextMessage;
import org.apache.activemq.ActiveMQConnection;
import org.apache.activemq.ActiveMQConnectionFactory;
public class Receiver {
public static void main(String[] args) {
ConnectionFactory connectionFactory;
Connection connection = null;
Session session;
Destination destination;
MessageConsumer consumer;
connectionFactory = new ActiveMQConnectionFactory(ActiveMQConnection.DEFAULT_USER,
ActiveMQConnection.DEFAULT_PASSWORD, "tcp://localhost:61616");
try {
connection = connectionFactory.createConnection();
connection.start();
// 获取操作连接
session = connection.createSession(Boolean.TRUE, Session.AUTO_ACKNOWLEDGE);
destination = session.createQueue("FirstQueue");
consumer = session.createConsumer(destination);
while(true){
TextMessage receive = (TextMessage) consumer.receive(100000);
if(receive!=null){
System.out.println("收到信息"+receive.getText());
}
}
} catch (JMSException e) {
e.printStackTrace();
}finally {
try {
if(connection!=null){
connection.close();
}
} catch (JMSException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
###发送者Sender .java
package activemq;
import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.DeliveryMode;
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;
public class Sender {
private static final int SEND_NUMBER = 5;
public static void main(String[] args) throws Exception {
// 连接工厂,JMS用它创建连接
ConnectionFactory connectionFactory;
// JMS客户端到JMS provider的连接
Connection connection = null;
// 一个发送或接收消息的线程
Session session;
// 消息目的地
Destination destination;
// 消息发送者
MessageProducer producer;
// 构造ConnectionFactory实例对象
connectionFactory = new ActiveMQConnectionFactory(ActiveMQConnection.DEFAULT_USER,
ActiveMQConnection.DEFAULT_PASSWORD, "tcp://localhost:61616");
try {
// 从工厂得到连接对象
connection = connectionFactory.createConnection();
// 启动
connection.start();
// 获取操作连接
session = connection.createSession(Boolean.TRUE, Session.AUTO_ACKNOWLEDGE);
destination = session.createQueue("FirstQueue");
producer = session.createProducer(destination);
producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
sendMessage(session, producer);
session.commit();
} catch (JMSException e) {
//
e.printStackTrace();
}finally {
if(connection!=null){
connection.close();
}
}
}
public static void sendMessage(Session session, MessageProducer producer) throws Exception {
for (int i = 1; i < SEND_NUMBER; i++) {
TextMessage message = session.createTextMessage("ActiveMq发送消息" + i);
System.out.println("发送消息:ActiveMq发送的消息" + i);
producer.send(message);
}
}
}
先运行Receiver,再运行Sender(Receiver和Sender需要在两个eclispe上运行)
Sender端运行结果
发送消息:ActiveMq发送的消息1
发送消息:ActiveMq发送的消息2
发送消息:ActiveMq发送的消息3
发送消息:ActiveMq发送的消息4
Recevier端运行结果
收到信息ActiveMq发送消息1
收到信息ActiveMq发送消息2
收到信息ActiveMq发送消息3
收到信息ActiveMq发送消息4
再运行一次Sender,Recevier端又收到四条信息
收到信息ActiveMq发送消息1
收到信息ActiveMq发送消息2
收到信息ActiveMq发送消息3
收到信息ActiveMq发送消息4
收到信息ActiveMq发送消息1
收到信息ActiveMq发送消息2
收到信息ActiveMq发送消息3
收到信息ActiveMq发送消息4
看一下ActiveMQ服务器
我们可以看到创建了一个名称为FirstQueue的消息队列,队列中有8条消息未被消费,我们也可以通过Browse查看是哪些消息
如果这些队列中的消息,被删除,消费者则无法消费。