1.JMS(Java Message Service)
1)JMS简介: JAVA提供的一组Java消息服务的规范,是一个Java平台中关于面向消息中间件(MOM)的API,用于在两个应用程序之间,或分布式系统中发送消息,进行异步通信。
2)API对象:
ActiceMQConnectionFactory: 连接工厂,客户用来创建连接的对象;
Connection: 连接对象
Session:会话对象,是发送和接收消息的上下文,用于创建消息生产者,消息消费者,相比RecketMQ,Session提供事务性。
Destination:指定生产消息的目的地和消费信息的来源对象。
生产者、Consumer: 消费者,会话创建的对象
3)消息通信机制:
a. 点对点(p2p): 一个消息只有一个消费者(Consumer),一旦消费,消息就不再存在消息队列中。发送者和接收者之间没有时间上的依赖性,不关发送者在发送消息后接受者是否正在运行,都不会印象消息被发送大队列。接收者在成功接收消息后需向队列应答成功。 应用场景: 订单商品扣库存 目的地:Queue 队列
b. 发布订阅(Pub/Sub): 每个消息可以有多个消费者。发布者和订阅者有时间上的依赖性,先有订阅者订阅,才能消费发布者的消息,且订阅者必须保持在运行状态。为了缓和严格的时间相关性,JMS 允许订阅者创建一个可持久化的订阅。 应用场景: 消息推送 目的地 : Topic 主题
2.消息中间件使用场景
1、异步处理: 减少程序的处理时间,优化用户体验,
2、应用解耦: 通过消息队列处理一些系统故障无法处理的信息
3、流量削峰: 控制活动人数,缓解短时间内高流量对服务器的压力
4、消息通讯: 在不同应用中相互通讯
使用场景详解
3.ActiveMQ的使用
# a.安装JDK
1.导入JDK压缩包
2.解压 tar -zxvf ....
3.vi /etc/profile (系统)
4.添加
export JAVA_HOME=JDK安装的路径
export PATH=$PATH:$JAVA_HOME/bin
5.source /etc/profile
6.java -version
# b.安装 ActiveMQ
1.导入ActiveMQ的压缩包
2.解压
3.启动
./activeMq start
4.开启日志
data 目录下 activeMq.log
tail -f activeMq.log 开启实时的日志
5.通过客户端工具连接
ip:8161/admin
用户名:admin
密码:admin
用户名,密码在哪看
vi /conf/users.properties
admin=admin
实际代码:
//生产者
@Test//生产者
public void shouldAnswerWithTrue() throws JMSException {
//1.创建ActiveMq 的连接工厂
String borkerUrl = "tcp://192.168.40.30:61616";
ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory(borkerUrl);
//2.创建连接
Connection connection = connectionFactory.createConnection();
//3.创建会话
//参数1:true:开启事务控制 Session.AUTO_ACKNOWLEDGE: 开启自动回执
Session session = connection.createSession(true, Session.AUTO_ACKNOWLEDGE);
//4.创建生产者并制定目的地
Destination des = new ActiveMQQueue("180-firstQueue");
MessageProducer producer = session.createProducer(des);
//5.生产者发布消息
ActiveMQTextMessage msg = new ActiveMQTextMessage();
msg.setText("First-Msg");
producer.send(msg);
//6.会话 提交
session.commit();
//7.资源的释放
connection.close();
session.close();
producer.close();
}
// 消费者
@Test//消费者
public void test() throws JMSException {
//1.创建连接的工厂
String url = "tcp://192.168.40.30:61616";
ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory(url);
//2.创建连接
Connection connection = connectionFactory.createConnection();
//消费 必须开启连接
connection.start();
//3.创建会话
Session session = connection.createSession(true, Session.AUTO_ACKNOWLEDGE);
//4.创建消费者
Destination des = new ActiveMQQueue("180-firstQueue");
MessageConsumer consumer = session.createConsumer(des);
//5.消费
TextMessage msg = (TextMessage) consumer.receive();
System.out.println(msg.getText());
//6.会话提交
session.commit();
//7.释放资源
connection.close();
session.close();
consumer.close();
}
// 发布
@Test//发布
public void shouldAnswerWithTrue() throws JMSException {
String url = "tcp://192.168.40.30:61616";
//1.创建连接工厂
ActiveMQConnectionFactory activeMQConnectionFactory = new ActiveMQConnectionFactory(url);
//2.创建连接
TopicConnection topicConnection = activeMQConnectionFactory.createTopicConnection();
//3.创建主题会话
TopicSession topicSession = topicConnection.createTopicSession(true, Session.AUTO_ACKNOWLEDGE);
//4.创建发布
Topic topic = new ActiveMQTopic("180-Topic");
TopicPublisher publisher = topicSession.createPublisher(topic);
//5.发布消息
ActiveMQTextMessage msg = new ActiveMQTextMessage();
msg.setText("FirstTestTopic");
publisher.publish(msg);
//6.会话提交
topicSession.commit();
//7.资源释放
topicConnection.close();
topicSession.close();
publisher.close();
}
// 订阅
@Test//订阅者1号
public void test() throws JMSException {
String url = "tcp://192.168.40.30:61616";
ActiveMQConnectionFactory activeMQConnectionFactory = new ActiveMQConnectionFactory(url);
TopicConnection topicConnection = activeMQConnectionFactory.createTopicConnection();
topicConnection.start();
TopicSession topicSession = topicConnection.createTopicSession(true, Session.AUTO_ACKNOWLEDGE);
Topic topic = new ActiveMQTopic("180-Topic");
TopicSubscriber subscriber = topicSession.createSubscriber(topic);
while (true) {
Message msg = subscriber.receive();
TextMessage textMessage = (TextMessage) msg;
if (textMessage != null) {
System.out.println("1 号"+textMessage.getText());
}else{
break;
}
}
}
ActiveMQ集成Spring
//依赖
<dependency>
<groupId>org.apache.activemq</groupId>
<artifactId>activemq-core</artifactId>
<version>5.7.0</version>
</dependency>
<dependency>
<groupId>org.apache.activemq</groupId>
<artifactId>activemq-pool</artifactId>
<version>5.12.1</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jms</artifactId>
<version>5.1.1.RELEASE</version>
</dependency>
// 配置
<context:component-scan base-package="com.baizhi.service"></context:component-scan>
<!-- 1.activeMqFactory -->
<bean id="connectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">
<property name="password" value="admin"/>
<property name="userName" value="admin"/>
<property name="brokerURL" value="tcp://192.168.150.142:61616"/>
</bean>
<!-- P2p -->
<bean id="activeMQQueue" class="org.apache.activemq.command.ActiveMQQueue">
<property name="physicalName" value="Spring-150-Queue"/>
</bean>
<!-- Jms -->
<bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">
<property name="connectionFactory" ref="connectionFactory"/>
<property name="defaultDestination" ref="activeMQQueue"/>
<property name="pubSubDomain" value="false"/>
</bean>
<!--
将自定义的 监听器交由spring管理
-->
<bean id="consumerMessageListener" class="com.baizhi.conf.ConsumerMessageListener"></bean>
<!--
配置监听器容器 在监听器容器中可以配置多个监听器
-->
<bean id="defaultMessageListenerContainer" class="org.springframework.jms.listener.DefaultMessageListenerContainer">
<property name="connectionFactory" ref="connectionFactory"/>
<property name="destination" ref="activeMQQueue"/>
<property name="pubSubDomain" value="false"/>
<property name="messageListener" ref="consumerMessageListener"/>
</bean>
//代码
product
@Autowired
private JmsTemplate jmsTemplate;
public void sendMsg(String msg) {
jmsTemplate.send(new MessageCreator() {
public Message createMessage(Session session) throws JMSException {
TextMessage textMessage = session.createTextMessage(msg);
return textMessage;
}
});
}
consumer
@Autowired
private JmsTemplate jmsTemplate;
public void consume() {
TextMessage receive = (TextMessage) jmsTemplate.receive();
System.out.println(receive);
}
// 自定义监听器
public class ConsumerListenner implements MessageListener {
public void onMessage(Message message) {
TextMessage msg = (TextMessage) message;
try {
System.out.println("被监听了"+msg.getText());
} catch (JMSException e) {
e.printStackTrace();
}
}
}
Active MQ 集成 SpringBoot
//依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-activemq</artifactId> </dependency>
//配置文件
server:
port: 9090
spring:
activemq:
broker-url: tcp://192.168.150.142:61616
user: admin
password: admin
//代码
controller
@Component
public class ProductSend {
@Autowired
private JmsTemplate jmsTemplate;
public void sendMsg(String msg){
Destination destination = new ActiveMQQueue("Springboot-150-Queue");
jmsTemplate.convertAndSend(destination,msg);
}
}
@Component
public class ProductSend {
@Autowired
private JmsTemplate jmsTemplate;
public void sendMsg(String msg){
Destination destination = new ActiveMQQueue("Springboot-150-Queue");
jmsTemplate.convertAndSend(destination,msg);
}
}
@Component
public class ConsumerListenner {
@JmsListener(destination = "Springboot-150-Queue")
public void consum(Message message){
TextMessage textMessage = (TextMessage) message;
try {
System.out.println("springboot被监听"+textMessage.getText());
} catch (JMSException e) {
e.printStackTrace();
}
}
}