ActiveMQ
一.概述
ActiveMQ是Apache提供的一个消息代理,它完全实现了JMS API,并支持各种跨语言客户端和协议,如Java,C,C ++,C#,Ruby,Perl,Python等。这使得不同语言开发的不同应用程序之间的集成更容易。
二.安装
ActiveMQ官网下载地址:http://activemq.apache.org/download.html,提供了Windows和Linux等版本。本文以Windows为例,下载解压后,进入bin/win64目录,运行activemq.bat便可启动ActiveMQ服务,在浏览器中输入http://127.0.0.1:8161/admin/ , 在登录界面输入账号:admin,密码:admin即可进入ActiveMQ后台管理界面。
三.示例
1.点对点(queue)
在点对点的模式下,消息与消费者一一对应,即:一个消息只能被一个消费者接收,如果消费者一直不接收消息,消息会一直保存在服务器上,一旦接收,该消息就会删除,如果多个消费者同时监听同一个消息,则一旦有一个消费者接收到,其他消费者不会再收到,代码如下:
- 生产者:
public class ActiveQueueProducer {
public static void main(String[] args) throws JMSException {
ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://127.0.0.1:61616");
Connection connection = connectionFactory.createConnection();
connection.start();
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
Queue queue = session.createQueue("Active-Queue");
MessageProducer producer = session.createProducer(queue);
TextMessage message = session.createTextMessage("hello world");
producer.send(message);
producer.close();
session.close();
connection.close();
}
}
- 消费者:
public class ActiveQueueConsumer {
public static void main(String[] args) throws Exception{
ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://127.0.0.1:61616");
Connection connection = connectionFactory.createConnection();
connection.start();
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
Queue queue = session.createQueue("Active-Queue");
MessageConsumer consumer = session.createConsumer(queue);
consumer.setMessageListener(new MessageListener() {
public void onMessage(Message message) {
try {
System.out.println("获取ActiveMQ消息:" + ((TextMessage) message).getText());
} catch (JMSException e) {
e.printStackTrace();
}
}
});
System.in.read();
consumer.close();
session.close();
connection.close();
}
}
- maven引入:
<dependency>
<groupId>org.apache.activemq</groupId>
<artifactId>activemq-client</artifactId>
<version>5.13.4</version>
</dependency>
2.发布/订阅模式(topic)
在该模式下,一个消息可以被多个消费者接收,但是这种模式下的消息不会保留在服务器上,即:当产生消息时,如果消费者没有启动,就不会收到消息。 代码如下:
- 生产者:
public class ActiveTopicProducer {
public static void main(String[] args) throws JMSException {
ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://127.0.0.1:61616");
Connection connection = connectionFactory.createConnection();
connection.start();
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
Topic topic = session.createTopic("Active-Topic");
MessageProducer producer = session.createProducer(topic);
TextMessage textMessage = session.createTextMessage("hello word");
producer.send(textMessage);
producer.close();
session.close();
connection.close();
}
}
- 消费者:
public class ActiveTopicConsumer {
public static void main(String[] args) throws JMSException, IOException {
ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://127.0.0.1:61616");
Connection connection = connectionFactory.createConnection();
connection.start();
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
Topic topic = session.createTopic("Active-Topic");
MessageConsumer consumer = session.createConsumer(topic);
consumer.setMessageListener(new MessageListener() {
public void onMessage(Message message) {
try {
System.out.println("获取ActiveMQ消息:" + ((TextMessage) message).getText());
} catch (JMSException e) {
e.printStackTrace();
}
}
});
System.in.read();
consumer.close();
session.close();
connection.close();
}
}