ActiveMQ简介
Activemq是众多开源消息中间件的一种,支持集群,同等网络,自动检测,TCP,SSL,广播,持久化,和J2EE1.4容器无缝结合。它是apache基金会的一个项目,而且经过多年发展,有了很高的稳定性。目前被很多知名项目使用,比如Apache serviceMix、FuseESB
适用场景
消息中间件一般被用在异步消息通信、整合多个系统的场景,比如你注册CSDN论坛,你填写完注册信息点提交时,它会发一份验证邮箱的验证邮件给到你,这封邮件就可以通过消息中间异步发送给你。再举一个场景,原先有一个客户购买我们的工作管理平台,他用该平台模拟公司整个行政办公,业务流程,前提是把他原先的财务系统相关数据以单据的形式也要在我们的平台上走流程。这就涉及到数据整合问题了,当然解决方法有很多种,一种方法是可以通过在财务系统开发一个webservice接口,然后管理平台去访问该接口,也可以直接通过quartz做一个计划,不定时的去取相关数据,当然也可以在管理平台与财务系统之间弄一个消息总线,财务系统产生数据时,发送一份到消息中间件,然后管理平台去取。用消息中间件的好处是不仅数据实时性高,而且让管理平台与财务系统之间解耦了,将来生管系统有什么数据要走流程,也可以这样做,呵呵
不适合场景
如果系统生态环境很单一,无需跟其他第三方进行通信,或是虽然要简单的通信但是数据量不大,业务不太复杂,其实个人认为是无需用MQ这种重量级的解决方案的,直接暴露接口就好了,总之就是一个权衡了,呵呵
API介绍
用 ActiveMQ 最好还是了解下 JMS
JMS 公共 |
点对点域 |
发布/订阅域 |
ConnectionFactory |
QueueConnectionFactory |
TopicConnectionFactory |
Connection |
QueueConnection |
TopicConnection |
Destination |
Queue |
Topic |
Session |
QueueSession |
TopicSession |
MessageProducer |
QueueSender |
TopicPublisher |
MessageConsumer |
QueueReceiver |
TopicSubscriber |
JMS 定义了两种方式:Queue(点对点);Topic(发布/订阅)。
·ConnectionFactory 是连接工厂,负责创建Connection。
·Connection 负责创建 Session。
·Session 创建 MessageProducer(用来发消息) 和 MessageConsumer(用来接收消息)。
·Destination 是消息的目的地。
详细的可以网上找些 JMS 规范(有中文版),本文对这两种方式都会有讲解。
Queue(点到点)模式
在点对点的传输方式中,消息数据被持久化,每条消息都能被消费,没有监听QUEUE地址也能被消费,数据不会丢失,一对一的发布接受策略,保证数据完整。
创建MAVEN项目
点击下一步,填写grupId为me.czp,artifactId为example-mq,name为exampleMq,点完成
然后在Package Explorer看到example-mq项目,如下:
创建生产者
package mq.p2p;
import java.util.Date;
import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.MapMessage;
import javax.jms.MessageProducer;
import javax.jms.Session;
import org.apache.activemq.ActiveMQConnection;
importorg.apache.activemq.ActiveMQConnectionFactory;
public class Producer {
publicstatic void main(String[] args) {
Stringuser = ActiveMQConnection.DEFAULT_USER;
Stringpassword = ActiveMQConnection.DEFAULT_PASSWORD;
Stringurl = ActiveMQConnection.DEFAULT_BROKER_URL;
Stringsubject = "test.queue";
ConnectionFactorycontectionFactory = new ActiveMQConnectionFactory( user, password, url);
try{
Connectionconnection = contectionFactory.createConnection();
connection.start();
Sessionsession = connection.createSession(Boolean.TRUE, Session.AUTO_ACKNOWLEDGE);
Destinationdestination = session.createQueue(subject);
MessageProducerproducer = session.createProducer(destination);
for(int i = 0; i <= 20; i++) {
MapMessagemessage = session.createMapMessage();
Datedate = new Date();
message.setLong("count",date.getTime());
Thread.sleep(1000);
producer.send(message);
System.out.println("--发送消息:" +date);
}
Thread.sleep(2000);
session.commit();
session.close();
connection.close();
}catch (JMSException e) {
e.printStackTrace();
}catch (InterruptedException e) {
e.printStackTrace();
}
}
}
创建消费者
package mq.p2p;
import java.util.Date;
import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.MapMessage;
import javax.jms.Message;
import javax.jms.MessageConsumer;
import javax.jms.MessageListener;
import javax.jms.Session;
import org.apache.activemq.ActiveMQConnection;
import org.apache.activemq.ActiveMQConnectionFactory;
public classCustomer {
public static void main(String[] args) {
Stringuser = ActiveMQConnection.DEFAULT_USER;
Stringpassword = ActiveMQConnection.DEFAULT_PASSWORD;
Stringurl = ActiveMQConnection.DEFAULT_BROKER_URL;
Stringsubject = "test.queue";
ConnectionFactoryconnectionFactory = new ActiveMQConnectionFactory( user, password, url);
Connectionconnection;
try {
connection= connectionFactory.createConnection();
connection.start();
final Session session =connection.createSession(Boolean.TRUE, Session.AUTO_ACKNOWLEDGE);
Destinationdestination = session.createQueue(subject);
MessageConsumermessage = session.createConsumer(destination);
message.setMessageListener(new MessageListener() {
publicvoid onMessage(Message msg){
MapMessagemessage = (MapMessage) msg;
try {
System.out.println("--收到消息:" +new Date());
session.commit();
}catch(JMSException e) {
e.printStackTrace();
}
}
});
Thread.sleep(30000);
session.close();
Thread.sleep(30000);
connection.close();
Thread.sleep(30000);
}catch(JMSException e) {
e.printStackTrace();
}catch(InterruptedException e) {
e.printStackTrace();
}
}
}
package mq.p2p;
import java.util.Date;
import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.MapMessage;
import javax.jms.Message;
import javax.jms.MessageConsum