首先,需要理解什么是队列和主题模式以及二者的区别,然后根据需要来应用到特定场景。
MS规范:Java消息服务(Java Message Service),是一个Java平台中关于面向消息的中间件的API,用于两个应用程序之间或者分布式 系统中发布消息,进行异步通信。
JMS相关概念:
- 提供者 : 实现JMS规范的消息中间件服务器
- 客户端 : 发送或接受消息的应用程序
- 生成者/发布者 : 创建并发送消息的客户端
- 消费者/订阅者 : 接受并处理消息的客户端
- 消息 : 应用程序之间传递的数据内容
- 消息模式 : 在客户端之间传递消息的方式,JMS中定义了主题和队列两种模式
JMS消息模式:
- 队列模式
- 客户端包括生产者和消费者
- 消费者可以随时消费队列中的消息(消息发布者发布消息之前之后都可以)
- 多个消费者会平均分担消息消费的任务
- 主题模式
- 客户端包括发布者和订阅者
- 订阅者只能够在发布者发布消息之后之后进行消息的消费
- 每个订阅者都会消费到相同的消息
1、Linux安装activemq、启动、进入管理页面
(我的地址是:http://66.112.220.202:8161/admin/index.jsp)
2、创建maven项目、引入依赖
<dependency>
<groupId>org.apache.activemq</groupId>
<artifactId>activemq-all</artifactId>
<version>5.9.0</version>
</dependency>
3、队列模式:编写消息创建者、消息消费者(生产者消费者模式)
(1)、消息创建者 AppProducer.java:
import org.apache.activemq.ActiveMQConnectionFactory;
import javax.jms.*;
public class AppProducer {
// 指定ActiveMQ服务的地址
private static final String URL = "tcp://66.112.220.202:61616";
// 指定队列的名称
private static final String QUEUE_NAME = "queue-demo";
public static void main(String[] args) throws JMSException {
// 1.创建ConnectionFactory
ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(URL);
// 2.创建Connection
Connection connection = connectionFactory.createConnection();
// 3.启动连接
connection.start();
// 4.创建会话(第一个参数:是否在事务中处理)
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
// 5. 创建一个目标
Destination destination = session.createQueue(QUEUE_NAME);
// 6.创建一个生产者
MessageProducer producer = session.createProducer(destination);
for (int i = 0; i < 20; i++) {
// 7.创建消息
TextMessage textMessage = session.createTextMessage("test" + i);
// 8.发布消息
producer.send(textMessage);
System.out.println("消息发送:" + textMessage.getText());
}
// 9.关闭连接
connection.close();
}
(2)、消息消费者 AppConsumer.java:
import org.apache.activemq.ActiveMQConnectionFactory;
import javax.jms.*;
public class AppConsumer {
private static final String URL = "tcp://66.112.220.202:61616";
private static final String QUEUE_NAME = "queue-demo";
public static void main(String[] args) throws JMSException {
// 1.创建ConnectionFactory
ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(URL);
// 2.创建Connection
Connection connection = connectionFactory.createConnection();
// 3.启动连接
connection.start();
// 4.创建会话(第一个参数:是否在事务中处理)
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
// 5.创建一个目标
Destination destination = session.createQueue(QUEUE_NAME);
// 6.创建一个消费者
MessageConsumer consumer = session.createConsumer(destination);
// 7.创建一个监听器
consumer.setMessageListener(new MessageListener() {
public void onMessage(Message message) {
TextMessage textMessage = (TextMessage)message;
try {
System.out.println("接收消息:" + textMessage.getText());
} catch (JMSException e) {
System.out.println("接收消息异常:");
e.printStackTrace();
}
}
});
// 8.关闭连接
//connection.close();
}
}
声明一点,测试的时候这里的消费者的关闭连接处需要注释掉,因为消费过程是一异步的,所以在还没有消费的情况下就进行连接关闭,是不会进行消息消费的。
4、测试环节
启动AppProducer.java:
消息发送:test0
消息发送:test1
消息发送:test2
消息发送:test3
消息发送:test4
消息发送:test5
消息发送:test6
消息发送:test7
消息发送:test8
消息发送:test9
消息发送:test10
消息发送:test11
消息发送:test12
消息发送:test13
消息发送:test14
消息发送:test15
消息发送:test16
消息发送:test17
消息发送:test18
消息发送:test19
进入activemq管理界面:
启动AppConsumer.java:
接收消息:test0
接收消息:test1
接收消息:test2
接收消息:test3
接收消息:test4
接收消息:test5
接收消息:test6
接收消息:test7
接收消息:test8
接收消息:test9
接收消息:test10
接收消息:test11
接收消息:test12
接收消息:test13
接收消息:test14
接收消息:test15
接收消息:test16
接收消息:test17
接收消息:test18
接收消息:test19
然后可以进行另外一种测试:首先开启两个消费者,进行消息产生监听,然后开启消息创建者进行创建,会发现两个消费者共同消费者20个消息,分别是第1、3、5、7… 和 2、4、6、8…
5、主题模式
这里不再赘述代码,因为代码演示上与队列模式区别仅仅在于一处代码片段的不同:
// 5. 创建一个目标
Destination destination = session.createTopic(TOPIC_NAME);
测试结果请自行演练。
这时的管理界面查看: