1.什么是ActiveMQ?
ActiveMQ 是Apache出品,最流行的,能力强劲的开源消息总线。
当我们想要低耦合,也不希望工程的启动有先后顺序之分,此时的最佳选择就是采用消息队列来实现。
2.ActiveMQ有两种消息方式。分别为queue以及topic。
queue是点对点式。即一个生产者和一个消费者一一对应
topic是订阅/发布式。即一个生产者产生消息并进行发送后,可以由多个消费者进行接收。
3.如何使用ActiveMQ
使用ActiveMQ,分为服务端以及客户端。要先启动服务端后,才能实现客户端。
服务端的启动,则需要在服务端安装ActiveMQ。(可参见笔者之前的写在Linux下安装ActiveMQ)
ActiveMQ的客户端支持多种语言,比如java,c,c++,等等,笔者这里以java为例来演示ActiveMQ的使用。
第一种:queue(点对点)
01ActiveMQ_queue_producer
@Test
public void TestQueueProducer() throws Exception {
// 创建工厂,指定连接url,固定端口号61616以及tcp协议
ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://192.168.25.131:61616");
Connection connection = connectionFactory.createConnection();
connection.start();
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
Queue queue = session.createQueue("test-queue");
MessageProducer producer = session.createProducer(queue);
TextMessage string = session.createTextMessage("hello activemq");
producer.send(string);
producer.close();
session.close();
connection.close();
}
把消息发布到服务端,服务端持久化保存起来,直到有消费者把该消息取出,服务端就把该消息清楚掉。
02ActiveMQ_queue_concustomer
@Test
public void testQueueCustomer() throws Exception {
ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://192.168.25.131:61616");
Connection connection = connectionFactory.createConnection();
connection.start();
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
Queue queue = session.createQueue("test-queue");
MessageConsumer consumer = session.createConsumer(queue);
consumer.setMessageListener(new MessageListener() {
@Override
public void onMessage(Message message) {
TextMessage textMessage = (TextMessage) message;
String text;
try {
text = textMessage.getText();
System.out.println(text);
} catch (JMSException e) {
e.printStackTrace();
}
}
});
System.in.read();
consumer.close();
session.close();
connection.close();
}
消费者取出该消息,服务端则会销毁生产者发布的那个消息。
第二种:topic(发布-订阅)
01ActiveMQ_topic_producer
@Test
public void testTopicProducer() throws Exception {
ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://192.168.25.131:61616");
Connection connection = connectionFactory.createConnection();
connection.start();
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
Topic topic = session.createTopic("test-topic");
MessageProducer producer = session.createProducer(topic);
TextMessage textMessage = session.createTextMessage("topic");
producer.send(textMessage);
producer.close();
session.close();
connection.close();
}
生产者发布完消息,服务端是不会持久化保存该消息的,不管消费者是否接受到。若要消费者收到消息,则必须消费者必须在生产者之情启动。
02ActiveMQ_topic_concustomer
@Test
public void testTopicCustomer() throws Exception {
ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://192.168.25.131:61616");
Connection connection = connectionFactory.createConnection();
connection.start();
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
Topic topic = session.createTopic("test-topic");
MessageConsumer consumer = session.createConsumer(topic);
consumer.setMessageListener(new MessageListener() {
@Override
public void onMessage(Message message) {
TextMessage textMessage = (TextMessage) message;
String text;
try {
text = textMessage.getText();
System.out.println(text);
} catch (JMSException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
System.out.println("topic消费者03已经启动。。。。");
// System.out.println("topic消费者02已经启动。。。。");
// System.out.println("topic消费者01已经启动。。。。");
System.in.read();
consumer.close();
session.close();
connection.close();
}
分别启动01 02 03 三个消费者。再启动生产者的发布消息的时候,这样三个消费者就可以接受消息了。