JMS编码步骤和总体架构
Activemq遵循了JMS规范,总体的流程分为以下几步:
- 创建ConnectionFactory
- 使用ConnectionFactory创建一个Connection
- 使用Connection创建一个Session
- 使用Session创建消息的生产者(Message Producer)和消息的消费者(MessageConsumer)
- 生产者往Destination发送消息
- 消费者从Destination消费消息
ActiveMQ的入门案例
创建maven工程,导入pom 依赖
<!--
<dependency>
<groupId>org.apache.activemq</groupId>
<artifactId>activemq-all</artifactId>
<version>5.15.12</version>
</dependency>
queue模式
- 该模式下,生产者生成一个消息,只能被一个消费者消费,别的消费者无法收到消息
- 如果有多个消费者,生产者生产的消息会被负载均衡给每一个消费者。
即:假如有3个消费者,生产者生产3个消息,3个消费者只能每个消费者消费一个消息。
生产者:queues模式
public class ActivemqProducer {
static String BROCKER_URL = "tcp://192.168.72.129:61616";
static String QUEUE_NAME = "queue_name01";
public static void main(String[] args) throws JMSException {
// 1. 创建连接工厂
ActiveMQConnectionFactory activeMQConnectionFactory = new ActiveMQConnectionFactory(BROCKER_URL);
// 2. 获取连接 并启动
Connection connection = activeMQConnectionFactory.createConnection();
connection.start();
// 3. 创建session ,参数一:事务,参数二:签收
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
//4. 创建目的地,队列
Queue queue = session.createQueue(QUEUE_NAME);
// 5.创建消息生产者
MessageProducer messageProducer = session.createProducer(queue);
// 6.通过 messageProducer 发送3条消息
for (int i = 1; i <= 3; i++) {
TextMessage textMessage = session.createTextMessage("消息 ->" + i);
messageProducer.send(textMessage);
}
System.out.println("发送消息完成......");
// 7.关闭资源
messageProducer.close();
session.close();
connection.close();
}
}
消费者一:
使用receive() 方法取消息,没有消息会阻塞
public class ActivemqConsumer {
static String BROKER_URL = "tcp://192.168.72.129:61616";
static String QUEUE_NAME = "queue_name01";
public static void main(String[] args) throws JMSException {
// 1.创建连接工厂
ActiveMQConnectionFactory activeMQConnectionFactory = new ActiveMQConnectionFactory(BROKER_URL);
// 2.创建连接并启动
Connection connection = activeMQConnectionFactory.createConnection();
connection.start();
// 3.创建session
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
// 4.创建目的地
Queue queue = session.createQueue(QUEUE_NAME);
// 5.创建消费者
MessageConsumer consumer = session.createConsumer(queue);
// 6.从目的去取消息
while (true) {
// 如果没有消息,g该方法会阻塞
TextMessage message = (TextMessage) consumer.receive();
if (message != null) {
System.out.println("消费者收到消息:" + message.getText());
} else
break;
}
// 7.关闭资源
consumer.close();
session.close();
connection.close();
}
}
运行结果:如果消费没有收到消息,会一直阻塞在receive() 方法上
消费者二:
消费者使用监听器是否有消息发送。代码不会阻塞,生产者发送消费,消费者立马消费,使用方法setMessageListener()
public class ActivemqConsumerWithListener {
static String BROKER_URL = "tcp://192.168.72.129:61616";
static String QUEUE_NAME = "queue_name01";
public static void main(String[] args) throws JMSException, IOException {
// 1.创建连接工厂
ActiveMQConnectionFactory activeMQConnectionFactory = new ActiveMQConnectionFactory(BROKER_URL);
// 2.创建连接并启动
Connection connection = activeMQConnectionFactory.createConnection();
connection.start();
// 3.创建session
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
// 4.创建目的地
Queue queue = session.createQueue(QUEUE_NAME);
// 5.创建消费者
MessageConsumer consumer = session.createConsumer(queue);
// 6. 给消费者添加监听器,监听生产者发送的消息
consumer.setMessageListener(new MessageListener() {
public void onMessage(Message message) {
TextMessage textMessage = (TextMessage) message;
try {
System.out.println("消费者收到消息:" + textMessage.getText());
} catch (JMSException e) {
e.printStackTrace();
}
}
});
// 不让程序执行完成
System.in.read();
// 7.关闭资源
consumer.close();
session.close();
connection.close();
}
}
Topic 模式
- 该模式是订阅模式,消费者订阅一个topic,当生产者向该 topic 生产消息,那么订阅了该 topic 的消费者都会收到消息 。
生产者 :
public class ActivemqProducerWithTopic {
static String BROCKER_URL = "tcp://192.168.72.129:61616";
static String TOPIC_NAME = "topic_name01";
public static void main(String[] args) throws JMSException {
// 1. 创建连接工厂
ActiveMQConnectionFactory activeMQConnectionFactory = new ActiveMQConnectionFactory(BROCKER_URL);
// 2. 获取连接 并启动
Connection connection = activeMQConnectionFactory.createConnection();
connection.start();
// 3. 创建session ,参数一:事务,参数二:签收
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
//4. 创建目的地,topic
Topic topic = session.createTopic(TOPIC_NAME);
// 5.创建消息生产者
MessageProducer messageProducer = session.createProducer(topic);
// 6.通过 messageProducer 发送3条消息
for (int i = 1; i <= 3; i++) {
TextMessage textMessage = session.createTextMessage("消息 ->" + i);
messageProducer.send(textMessage);
}
System.out.println("发送消息完成......");
// 7.关闭资源
messageProducer.close();
session.close();
connection.close();
}
}
消费者:
public class ActivemqConsumerWithTopic {
static String BROKER_URL = "tcp://192.168.72.129:61616";
static String TOPIC_NAME = "topic_name01";
public static void main(String[] args) throws JMSException, IOException {
System.out.println("==========消费者 3 =================");
// 1.创建连接工厂
ActiveMQConnectionFactory activeMQConnectionFactory = new ActiveMQConnectionFactory(BROKER_URL);
// 2.创建连接并启动
Connection connection = activeMQConnectionFactory.createConnection();
connection.start();
// 3.创建session
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
// 4.创建目的地 topic
Topic topic = session.createTopic(TOPIC_NAME);
// 5.创建消费者
MessageConsumer consumer = session.createConsumer(topic);
// 6. 给消费者添加监听器,监听生产者发送的消息
consumer.setMessageListener(new MessageListener() {
public void onMessage(Message message) {
TextMessage textMessage = (TextMessage) message;
try {
System.out.println("消费者收到消息:" + textMessage.getText());
} catch (JMSException e) {
e.printStackTrace();
}
}
});
// 不让程序执行完成
System.in.read();
// 7.关闭资源
consumer.close();
session.close();
connection.close();
}
}
先启动3个消费者,在启动生产者,运行结果如下:
从结果可以看出每一个消费者都接收到了消息。