1,ActiveMQ
Apache ActiveMQ是Apache软件基金会所研发的开放源代码消息中间件;由于ActiveMQ是一个纯Java程序,因此只需要操作系统支持Java虚拟机,ActiveMQ便可执行。
2, ActiveMQ 的安装
1.下载ActiveMQ 去官方网站下载:http://activemq.apache.org/activemq-5152-release.html 2.运行ActiveMQ 解压缩apache-activemq-5.5.1-bin.zip到C盘,然后双击C:\apache-activemq-5.15.2\bin\win64\activemq.bat运行ActiveMQ程序。 配置环境变量path 启动ActiveMQ以后,登陆:http://localhost:8161/admin/,进入管理界面。 用户名与密码均为:admin 点对点方式中 消费者集群默认采用均摊方式 发布订阅模式 需要先订阅,才能获取消息(实时模式)分组模式
3,
4,ActiveMQ ---JMS 规范----点对点通讯
producer:
public class Producer {
private static final String URL = "tcp://localhost:61616";
private static final String QUEUENAME = "queue_one";
public static void main(String[] args) throws JMSException {
// 创建工厂
ActiveMQConnectionFactory factory = new ActiveMQConnectionFactory(URL);
// 创建连接
Connection connection = factory.createConnection();
// 启动连接
connection.start();
/**
* static final int AUTO_ACKNOWLEDGE = 1; static final int
* CLIENT_ACKNOWLEDGE = 2; static final int DUPS_OK_ACKNOWLEDGE = 3;
* static final int SESSION_TRANSACTED = 0;
*/
// 不开启事务,自动签收
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
// 创建队列
Queue queue = session.createQueue(QUEUENAME);
// 创建生产者
MessageProducer producer = session.createProducer(queue);
for (int i = 0; i < 10; i++) {
TextMessage message = session.createTextMessage("message: " + i);
producer.send(message);
System.out.println(message.toString());
}
connection.close();
}
}
consumer:
public class Consumer {
private final static String URL = "tcp://localhost:61616";
private final static String QUEUENAME = "queue_one";
public static void main(String[] args) throws JMSException {
// 1.创建ActiveMQFactory
ActiveMQConnectionFactory factory = new ActiveMQConnectionFactory(URL);
// 2.创建连接
Connection cnnection = factory.createConnection();
cnnection.start();
// 4.创建Session 不开启事务,自动签收模式
Session session = cnnection.createSession(false, Session.AUTO_ACKNOWLEDGE);
// 5.创建一个目标
Queue queue = session.createQueue(QUEUENAME);
// 6.创建消费者
MessageConsumer consumer = session.createConsumer(queue);
// 7. 创建消息监听
consumer.setMessageListener(new MessageListener(){
public void onMessage(Message message) {
TextMessage textMessage = (TextMessage) message;
try {
System.out.println("消费者消费消息:" + textMessage.getText());
} catch (JMSException e) {
e.printStackTrace();
}
}
});
}
}
5, ActiveMQ ---JMS 规范----发布订阅模式
producer:
public class Producer {
private final static String URL = "tcp://localhost:61616";
private static final String TOPICNAME = "topic_2";
public static void main(String[] args) throws JMSException {
// 创建连接工厂
ActiveMQConnectionFactory factory = new ActiveMQConnectionFactory(URL);
// 创建连接
Connection connection = factory.createConnection();
// 自动连接
connection.start();
// 创建会话 不开启事务 自动签收模式
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
// 创建topic 发布订阅模式
Topic topic = session.createTopic(TOPICNAME);
// 创建生产者
MessageProducer producer = session.createProducer(topic);
// 消息设置持久化
producer.setDeliveryMode(DeliveryMode.PERSISTENT);
for (int i = 1; i <= 10; i++) {
// 7.创建消息
TextMessage textMessage = session.createTextMessage("消息" + i);
// 8.发送消息
producer.send(textMessage);
System.out.println(textMessage.toString());
}
// 9.关闭连接
connection.close();
}
}
consumer:
public class Consumer {
private final static String URL = "tcp://localhost:61616";
private static final String TOPICNAME = "topic_2";
public static void main(String[] args) throws JMSException {
ActiveMQConnectionFactory factory = new ActiveMQConnectionFactory(URL);
Connection connection = factory.createConnection();
connection.start();
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
Topic topic = session.createTopic(TOPICNAME);
//创建消费者
MessageConsumer consumer = session.createConsumer(topic);
consumer.setMessageListener(new MessageListener() {
//监听,有消息则消费
public void onMessage(Message message) {
TextMessage textMessage = (TextMessage) message;
try {
System.out.println("消费者消费消息:"+textMessage.getText());
} catch (JMSException e) {
e.printStackTrace();
}
}
});
}
}
6, ActiveMQ的持久化机制
默认是将消息存在内存中,但是如果出现网络中断,断电等情况,还没被消费的消息怎么办,可以使用本地持久化,存储在硬盘上。
// 消息设置持久化 producer.setDeliveryMode(DeliveryMode.PERSISTENT);
7, ActiveMQ JMS 消息可靠机制
1,ActiveMQ 采用的是自动签收模式:
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
当消费者接收到消息,并且从消息监听方法中返回的时候,就默认告诉消息中间件(ActiveMQ)这个消息已经被消费了
consumer.setMessageListener(new MessageListener() {
//监听,有消息则消费
public void onMessage(Message message) {
TextMessage textMessage = (TextMessage) message;
try {
System.out.println("消费者消费消息:"+textMessage.getText());
} catch (JMSException e) {
e.printStackTrace();
}
}
});
但是,如果,这个消息在消费中出现了问题,也有可能认为被消费了,不可靠
2,ActiveMQ 手动签收模式:我是让消费者采用手动签收模式,消息消费之后,需要手动ack 确认,告知消息中间件
Session session = cnnection.createSession(false, Session.CLIENT_ACKNOWLEDGE);
consumer.setMessageListener(new MessageListener(){
public void onMessage(Message message) {
TextMessage textMessage = (TextMessage) message;
try {
System.out.println("消费者消费消息:" + textMessage.getText());
//告诉消息中间件,这个消息已经被消费
textMessage.acknowledge();
} catch (JMSException e) {
e.printStackTrace();
}
}
});
3,消息可靠机制,还可以通过事务,具体过程:
生产者,向消息中间件发送消息前开启事务,发送消息没有问题,提交事务
Session session = connection.createSession(true, Session.AUTO_ACKNOWLEDGE);
// 创建队列
Queue queue = session.createQueue(QUEUENAME);
// 创建生产者
MessageProducer producer = session.createProducer(queue);
for (int i = 0; i < 10; i++) {
TextMessage message = session.createTextMessage("message: " + i);
producer.send(message);
session.commit();
System.out.println(message.toString());
}
消费者,消费消息前开启事务,消费成功,提交事务,消息的数量在消息中间件里面才会更新
final Session session = cnnection.createSession(true, Session.AUTO_ACKNOWLEDGE);
consumer.setMessageListener(new MessageListener(){
public void onMessage(Message message) {
TextMessage textMessage = (TextMessage) message;
try {
System.out.println("消费者消费消息:" + textMessage.getText());
//告诉消息中间件,这个消息已经被消费
session.commit();
} catch (JMSException e) {
e.printStackTrace();
}
}
});