初识消息队列--ActiveMq
消息队列
即MessageQueue,是一种消息中间件,在遇到系统请求量比较大的情况下,导致请求堆积过多无法及时返回,可以通过它进行异步的消息处理,从而缓解系统压力。
ActiveMq
ActiveMQ是纯Java编写的消息中间件服务,完全支持JMS规范。支持多种语言编写客户端:C、C++、C#、Java、PHP、Python等。应用协议包括:OpenWire、STOMP、WS-Notification、MQTT以及AMQP。对Spring的支持非常好,可以很容易的集成到现有的Spring系统中去使用。在消息的持久化上,支持jdbc和journal两种方式的使用。
在这里穿插说一下JMS
JMS,即Java Message Service,JMS是一套Java的面向消息中间件的API接口规范,用于在不同应用程序中异步的发送消息。JMS本身语言无关,绝大多数的消息中间件厂商都提供了对JMS的支持。使用ActiveMq的基本流程,也是参考JMS规范(下文)。
ActiveMq准备工作
安装就不多说了,但是装好后可能会出现问题,那就是在admin界面不能查看queue、topic等界面,且报503错误,这里的错误是因为ip映射的问题,只需要将/etc/host的hostname标签后加上自己服务器的主机名然后重启mq就可以了,查看主机名命令为hostname,之后别忘了把服务器的端口打开。(阿里云服务器添加安全组)
JMS规范:
JMS使得我们能够通过消息收发服务,由一个JMS客户机向另外一个客户机发送信息,消息是JMS的一种类型对象,由报头和消息主体组成,报头携带路由信息和有关该消息的元数据 ,消息主体携带应用程序数据和有效负载。有效负载有以下几种类型:
StreamMessage Java原始值点数据流
MapMessage 键值对
TextMessage 字符串对象
ObjectMessage 序列化的Java对象
BytesMessage 字节的数据流
JMS流程中的重要部分:
连接工厂,即ConnectionFactory,用于创建JMS连接
JMS连接,即Connection,表示两个端之间点连接
JMS会话,即Session,表示两端之间点会话状态,建立在连接之上,表示一个会话线程
JMS目的,即Destination,是实际点消息源
JMS生产者和消费者,即MessageProducer和MessageConsumer,分别负责发送和接收消息
两种模式:点对点/发布订阅
1,点对点,消息分发给一个单独的使用者,使用JMS中点Queue来表示。
特点是:
每一个消息只有一个消费者,一旦消息被消费则不再在队列中
发送和接收端之间时间上没有依赖性,发送者发送消息之后,不管接收者有没有在运行,都不影响消息被发送到队列
接收者在成功接收之后需要向队列应答成功
2,发布订阅,生产者发布事件,使用者订阅感兴趣的事件,使用JMS中点Topic来表示。
特点是:
每个消息有多个消费者
两端之间有时间上点依赖性,必须创建订阅者之后才能消费发布者的消息
订阅者必须保持运行状态
在Spring中配置使用(以Topic为例)
添加依赖:
<dependency>
<groupId>org.apache.activemq</groupId>
<artifactId>activemq-all</artifactId>
<version>5.11.2</version>
</dependency>
生产者配置:
由于Spring的特性,需要用Spring的连接工厂来管理JMS的连接工厂,然后加入JMSTemplate来负责发送消息,毕竟依照JMS规范来一步一步老老实实发送还是麻烦
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p"
xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.2.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.2.xsd
http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.2.xsd"> <!--可以产生Connection的工厂-->
<bean id="targetConnectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">
<property name="brokerURL" value="tcp://47.106.72.170:61616"/>
</bean>
<!--Spring管理工厂的工厂-->
<bean id="connectionFactory"
class="org.springframework.jms.connection.SingleConnectionFactory">
<property name="targetConnectionFactory" ref="targetConnectionFactory"/>
</bean>
<!--JMS模板-->
<bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">
<property name="connectionFactory" ref="connectionFactory"/>
</bean>
<!--目的地-->
<bean id="test-queue" class="org.apache.activemq.command.ActiveMQQueue">
<constructor-arg name="name" value="test=queue"/>
</bean>
<bean id="item_add_topic" class="org.apache.activemq.command.ActiveMQTopic">
<constructor-arg name="name" value="item-add-topic"/>
</bean>
</beans>
applicationContext-mq.xml
编写发送端:
先提前注入JMSTemplate和Destination
@Autowired
private JmsTemplate jmsTemplate; @Resource(name = "item_add_topic")
private Destination destination;
发送信息:
//发送消息
System.out.println("send message "+itemId);
MessageCreator messageCreator = new MessageCreator(String.valueOf(itemId));
jmsTemplate.send(destination,messageCreator);
这里MessageCreator是自己创建的继承于org.springframework.jms.core.MessageCreator的类,当然也可以直接采用匿名内部类的形式。
package cn.izzer.MessageUtils; import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.Session;
import javax.jms.TextMessage; /**
* @author yintianhao
* @createTime 21 1:15
* @description
*/
public class MessageCreator implements org.springframework.jms.core.MessageCreator { private String textMesage;
public MessageCreator(String message){
textMesage = message;
}
@Override
public Message createMessage(Session session) throws JMSException {
System.out.println("所发送的消息:"+textMesage);
TextMessage tm = session.createTextMessage(textMesage);
return tm;
}
}
MessageCreator.java
编写接收端:
接收端自然是需要监听器的
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p"
xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.2.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.2.xsd
http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.2.xsd"> <!--可以产生Connectio的工厂-->
<bean id="targetConnectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">
<property name="brokerURL" value="tcp://47.106.72.170:61616"/>
</bean>
<!--Spring管理工厂的工厂-->
<bean id="connectionFactory"
class="org.springframework.jms.connection.SingleConnectionFactory">
<property name="targetConnectionFactory" ref="targetConnectionFactory"/>
</bean>
<!--接受者-->
<bean class="org.springframework.jms.listener.DefaultMessageListenerContainer">
<property name="connectionFactory" ref="connectionFactory"/>
<property name="destination" ref="item_add_topic"/>
<property name="messageListener" ref="itemAddListener"/>
</bean>
<bean id="itemAddListener" class="cn.izzer.search_listener.ItemAddListener"/>
<bean id="item_add_topic" class="org.apache.activemq.command.ActiveMQTopic">
<constructor-arg name="name" value="item-add-topic"/>
</bean>
</beans>
applicationContext-mq.xml
这里MessageListener也和前面Createor一样,也可以采用匿名内部类。
package cn.izzer.search_listener; import cn.izzer.common.pojo.SearchItem;
import cn.izzer.search_mapper.SearchItemMapper;
import org.apache.solr.client.solrj.SolrServer;
import org.apache.solr.client.solrj.SolrServerException;
import org.apache.solr.common.SolrInputDocument;
import org.springframework.beans.factory.annotation.Autowired; import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.TextMessage; /**
* @author yintianhao
* @createTime 20200121 1:34
* @description 监听
*/
public class ItemAddListener implements MessageListener { @Override
public void onMessage(Message message) {
try {
TextMessage tm = (TextMessage)message;
String text = tm.getText();
long itemId = Long.parseLong(text);
System.out.println("接收到的id:"+itemId);
} catch (Exception e) {
e.printStackTrace();
}
}
}
Listener
之后在两端都启动,然后发送端发送信息。
看一下控制台信息:
发送端
接收端
可以看到是成功发送成功接收了的。
初识消息队列--ActiveMq的更多相关文章
- 消息队列ActiveMQ的使用详解
通过上一篇文章 <消息队列深入解析>,我们已经消息队列是什么.使用消息队列的好处以及常见消息队列的简单介绍. 这一篇文章,主要带大家详细了解一下消息队列ActiveMQ的使用. 学习消息队 ...
- Java消息队列--ActiveMq 实战
1.下载安装ActiveMQ ActiveMQ官网下载地址:http://activemq.apache.org/download.html ActiveMQ 提供了Windows 和Linux.Un ...
- lesson5:利用jmeter来压测消息队列(activemq)
本文讲述了利用jmeter来压测消息队列,其中消息队列采用apache的activemq,jmeter本身是支持符合jms标准消息队列的压测,由于jmeter的官方sampler配置比较复杂,本文直接 ...
- 深入浅出 消息队列 ActiveMQ(转)
一. 概述与介绍 ActiveMQ 是Apache出品,最流行的.功能强大的即时通讯和集成模式的开源服务器.ActiveMQ 是一个完全支持JMS1.1和J2EE 1.4规范的 JMS Provide ...
- JMS(Java消息服务)与消息队列ActiveMQ基本使用(一)
最近的项目中用到了mq,之前自己一直在码农一样的照葫芦画瓢.最近几天研究了下,把自己所有看下来的文档和了解总结一下. 一. 认识JMS 1.概述 对于JMS,百度百科,是这样介绍的:JMS即Java消 ...
- Java消息队列--ActiveMq 初体验
1.下载安装ActiveMQ ActiveMQ官网下载地址:http://activemq.apache.org/download.html ActiveMQ 提供了Windows 和Linux.Un ...
- java消息队列--ActiveMQ
1.下载安装ActiveMQ ActiveMQ官网下载地址:http://activemq.apache.org/download.html ActiveMQ 提供了Windows 和Linux.Un ...
- 第十一章 企业项目开发--消息队列activemq
注意:本章代码基于 第十章 企业项目开发--分布式缓存Redis(2) 代码的github地址:https://github.com/zhaojigang/ssmm0 消息队列是分布式系统中实现RPC ...
- 消息队列—ActiveMQ
1. 学习计划 1.什么是MQ 2.MQ的应用场景 3.ActiveMQ的使用方法. 4.使用消息队列实现商品同步. 2. 同步索引库分析 方案一:在manager(后台)中,添加商品的业务逻 ...
随机推荐
- KVM | centos 安装 window 虚拟机
KVM | centos 安装 window 虚拟机 环境: CENTOS 7.3 1. 准备 1.1 检查是否支持虚拟化 cat /proc/cpuinfo | egrep 'vmx|svm' 要求 ...
- Win10多用户同时登陆远程桌面
想记录一下最近解决的一些问题,发现还是博客最合适,虽然之前从来没写过,希望以后能养成这个好习惯. 家里有一台台式机装着Win10,还有一台macbook,平时遇到需要用Win系统又不想坐在书桌前时,我 ...
- 什么是kafka,怎么使用? (3)
上次我因为在windows上解压一个.gz的包没有解压出来,故需要在linux使用kafka,而且这kafka的快速开始上有个zookeeper的文件配置 所以我感觉有必要把dubbo-zookeep ...
- 牛客网剑指offer第13题——调整数组顺序使得奇数位于偶数前面
题目来源:剑指offer 题目: 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变 ...
- linux命令——find
简介:find是Linux系统中的常用命令(应用程序)之一.它是用来在指定目录层次结构(指定目录的子目录以及子目录的子目录)中查找符合指定条件的文件和目录 一:语法结构 find [directory ...
- 纪中集训2020.02.09【NOIP提高组】模拟B 组总结反思
目录 JZOJ.1747[NOIP2014模拟11.5]无穷迷宫 比赛时 之后 总结 JZOJ1478.[NOIP2014模拟11.5]近似乘积 比赛时 之后 总结 JZOJ3926. [NOIP20 ...
- 一文看懂AI深度学习丨曼孚科技
深度学习(Deep Learning)是机器学习的一种,而机器学习是实现人工智能的必经途径. 目前大部分表现优异的AI应用都使用了深度学习技术,引领了第三次人工智能的浪潮. 一. 深度学习的概念 深度 ...
- 【笔记】机器学习 - 李宏毅 - 4 - Gradient Descent
梯度下降 Gradient Descent 梯度下降是一种迭代法(与最小二乘法不同),目标是解决最优化问题:\({\theta}^* = arg min_{\theta} L({\theta})\), ...
- js获取页面缩放比例
今天在网上看到一位大神写的一篇文章,出处记不得了,只是因为我在做项目的时候需要用到所以看了一眼. 经理要求我把两张图表上下排列(非响应式的)改成可以适配浏览器的,刚开始只是想改样式,看到代码才发现原来 ...
- E11000 duplicate key error index: test.collection.$a.b_1 dup key: { : null } 报错记录
这个一般分为两种情况,第一新增数据出现约束.而你在orm里面写了唯一约束.这种情况就比较简单,添加数据时保证数据字段唯一性就好了. 第二种情况比较难找,因为你发现你在orm里面并没有写约束,但是还是插 ...