在分布式系统中,消息系统的应用十分的广泛,消息可以作为应用通信的一种方式。消息被保存在队列中,直到被消息接受者取出,由于消息发送者不需要同步等待消息接收者的响应,异步的接收降低了系统集成的耦合度,提升了系统协作效率提高了系统吞吐量。分布式消息队列还可以作为缓冲,缓解集群压力。
ActiveMQ是apache的一个开源消息系统, 完全采用java实现,能够很好的支持JMS规范
Jms支持消息类型包括简单的文本(TextMessage)、可序列化对象(ObjectMessage)、键值对(MapMessage)、字节流(BytesMessage)、流(StreamMessage),
Jms支持两种消息的发送一种是P2P 点对点另一种是publish/subscribe (发布/订阅)
p2p模型是基于queue(队列)的,消息生产者发送消息到队列消息消费者从队列中接受消息。
publish/subscribe 定义了如何向一个内容节点发布和订阅消息,这个内容节点被称为topic(主题)主题可以认为是消息传递的中介
消息发部者将消息发布到主题上,而消息订阅者从主题订阅消息,主题使得消息的订阅者与消息的发布者互相保持独立,不需要进行接触即可保证消息的传递,发布/订阅模型在消息的一对多广播时候采用。
安装ActiveMQ
wget http://apache.dataguru.cn/activemq/apache-activemq/5.9.0/apache-activemq-5.9.0-bin.tar.gz
解压安装软件:
tar -xf apache-activemq-5.9.0-bin.tar.gz
相关的配置放在{ACTIVEMQ_HOME}/conf 目录下,可以对配置文件进行修改:
ls /usr/activemq
启动
./activemq start
ActiveMq 实现了JMS规范提供的一系列接口,如创建Session、建立连接,发送消息等通过这些接口能够实现消息发送、消息接收、消息发布、消息订阅的功能
使用JMS来完成ActiveMQ 基于queue的点对点消息发送
ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(ActiveMQConnection.DEFUT_USER,ActiveMQConnection.DEFAULT_PASSWORD,tcp://192.168.136.135:61616)
Connection connection = connectionFactory.createConnection();
connection.start();
Session session = connection.createSession(Boolean.TRUE,Session.AUTO_ACKNOWEDGE)
DEStination destination = session.createQueue("MessageQueue")
MessageProducer producer = session.createProducer(destination);
producer.setDeliverMode(DeliveryMode.NON_PERSISTENT);
objectMessage message =session.createObjectMessage("hello everyone!")
producer.send(message);
session.commit();
创建一个ActiveMQConnectionFactory通过ActiveMQConnectionFactory来创建到ActiveMQ的连接通过连接创建Session
创建Session时有两个非常重要的参数,第一个boolean类型的参数用来表示是否采用事物消息。如果消息是事务的,对应的该参数设置为true。此时消息的提交自动由comit处理,消息的回滚自动由rollback处理。假如消息不是事物的。则对应的参数应该设置成false
queue 的点对点接收:
ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(ActiveMQConnection.DEFAUT_USER,ActiveMQConnection.DEFAULT_PASSWORD,
"tcp//192.168.110.111:61616;");
Connection connection = connectionFactory.createConnection();
connection.start();
Session session = connection.createSession(Boolean.False,Session.AUTO_ACKNOWLEDE);
Destination destinaation =session.createQueue("MessageQueue")
MessageConsumer consumer = session.createConsumer(destination);
while(true){
ObjectMessage message =(ObjectMeaage)consumer.receive(10000);
if(null!=message){
String messageContent =message.getObject();
System.out.pritnln(messageContent);
}else{
break;
}
}