什么是队列,如何在Springboot项目中使用ActiveMq队列,让你一看就懂。_springboot queue使用-程序员宅基地

技术标签: spring  activemq  spring boot  java  队列  

队列是什么,怎么用,如何在springboot项目中集成ActiveMq队列。

什么是消息队列

1,消息队列,一般我们会简称它为MQ,英文的意思就是Message Queue,列入RubbtyMq、ActiveMq等。
2、消息队列,队列先进先出的数据结构,这里我们需要记住栈是先进后出。

有什么用处

1、流量削峰
2、异步通讯
3、应用解耦
这里我就不赘述了,不清楚的可以私聊我。

有哪些模式

1、 queue(一对一):也就是生产的只能一个人用,用了就没有了,也称点对点。
2、 topic (一对多):也就是生产的东西可供多个人用,比如报纸可以一个人读了另一个人再读,也称发布/订阅。

队列数据结构

这里我简易的画了一个图,类似一根水管。
队列数据结构

ActiveMq下载安装

这里我下载了liunx版本的5.x的activemq。
链接:https://pan.baidu.com/s/18zqxAxmtqBgcHLjU_GyfSA
提取码:srli
1、下载包,上传到服务器,选择需要解压的位置,利用解压命令解压到当前文件架。

 tar -zxvf apache-activemq-5.15.5-bin.tar.gz

2、打开bin目录会看见

cd activemq-5.13.2/bin

3、启动activemq

./activemq console

到这里我们的activeMq就安装完毕了,接下来就是如何在项目中使用activemq
4、netstat -tunlp查看是否启动起来了,这里我们可以看见8161 activemq的客户端端口已经启动,
在这里插入图片描述
5、浏览器测试客户端是否可用
在这里插入图片描述
看到以上画面,说明已经启动成功了。

springboot整合activemq

1、利用IEDA构建Springboot项目,和一般的springboot项目一样,这里我就省略构建的步骤了
2、构建pom
主要是
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-activemq</artifactId>
</dependency>
<!--消息队列连接池-->
<dependency>
    <groupId>org.apache.activemq</groupId>
    <artifactId>activemq-pool</artifactId>
    <version>${activemq.version}</version>
</dependency>

这两个坐标,这里为了测试方便所以我们添加了一个springboot整合junt的坐标。

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>


    <!-- 继承Spring父项目-->
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.10.RELEASE</version>
    </parent>

    <groupId>com.ztkj</groupId>
    <artifactId>18-spring-boot-activemq1</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <java-version>1.8</java-version>
    </properties>
    <dependencies>
        <!--springboot的web启动器-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!--  activemq包-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-activemq</artifactId>
        </dependency>
        <!--消息队列连接池-->
        <dependency>
            <groupId>org.apache.activemq</groupId>
            <artifactId>activemq-pool</artifactId>
            <version>${
    activemq.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin><!-- SpringBoot 编译插件 -->
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>


</project>
3、配置springboot项目的配置文件application.properties,(注:注意配置文件的位置是在类路径下),这里了我们使用刚才我们在服务器上安装启动的mq.
spring.activemq.broker-url=tcp://服务器ip:61616
#true 表示使用内置的MQ,false则连接服务器
spring.activemq.in-memory=false
#true表示使用连接池;false时,每发送一条数据创建一个连接
spring.activemq.pool.enabled=true
#连接池最大连接数
spring.activemq.pool.max-connections=10
#空闲的连接过期时间,默认为30秒
spring.activemq.pool.idle-timeout=30000
#强制的连接过期时间,与idleTimeout的区别在于:idleTimeout是在连接空闲一段时间失效,而expiryTimeout不管当前连接的情况,只要达到指定时间就失效。默认为0,never
spring.activemq.pool.expiry-timeout=0
4、编写测试类TestActiveMq

一、生产者的编写

package com.ztkj.activemq;

import com.ztkj.service.ConsumerService;
import org.apache.activemq.broker.region.Queue;
import org.apache.activemq.command.ActiveMQQueue;
import org.junit.Test;
import com.ztkj.App2;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.jms.annotation.JmsListener;
import org.springframework.jms.core.JmsMessagingTemplate;
import org.springframework.messaging.handler.annotation.SendTo;
import org.springframework.stereotype.Component;
import org.springframework.test.context.junit4.SpringRunner;

@RunWith(SpringRunner.class)
@SpringBootTest(classes = App2.class)
public class TestActiveMq {
    
    //注入springboot封装的工具类
    @Autowired
    private JmsMessagingTemplate jmsMessagingTemplate;

	//注入存放消息的队列,用于下列方法一
    @Autowired
    private ActiveMQQueue activeMQQueue;

   /**
     * 生产者
     * 第一种方式:直接填到消息队列中。
     */
    @Test
    public void privted() {
    

        //方法一:这种方式不需要手动创建activeMQQueue,系统会自行创建名为testQueue的队列
        jmsMessagingTemplate.convertAndSend("testQueue", "测试队列1");
    }

 /**
     * 生产者
     * 第二种方式:直接填到消息队列中。
     */
    @Test
    public void privted1() {
    
        //方法二:添加消息到消息队列
        jmsMessagingTemplate.convertAndSend(activeMQQueue, "测试队列2");

    }
}

二、测试生产者
运行生产者的测试类,在浏览器端查看activemq的队列,查看到在testQueue的队列中有一条信息,表明生产成功!
出现了一调信息
二、消费者的编写
1、因为这里我们需要使用activemq的注解,我们需要先编写一个service。

package com.ztkj.service;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jms.annotation.JmsListener;
import org.springframework.jms.core.JmsMessagingTemplate;
import org.springframework.jms.support.converter.MessageConverter;
import org.springframework.messaging.handler.annotation.SendTo;
import org.springframework.stereotype.Service;

@Service
public class ConsumerService {
    

    @Autowired
    private JmsMessagingTemplate jmsMessagingTemplate;

    // 使用JmsListener配置消费者监听的队列,其中name是接收到的消息
    @JmsListener(destination = "testQueue")
    // SendTo 会将此方法返回的数据, 写入到 OutQueue 中去.
    @SendTo("SQueue")
    public String handleMessage(String name) {
    
        System.out.println("成功接受内容为:" + name);
        return "成功接受内容为:" + name;
    }
}

2、测试消费者

package com.ztkj.activemq;

import com.ztkj.service.ConsumerService;
import org.apache.activemq.broker.region.Queue;
import org.apache.activemq.command.ActiveMQQueue;
import org.junit.Test;
import com.ztkj.App2;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.jms.annotation.JmsListener;
import org.springframework.jms.core.JmsMessagingTemplate;
import org.springframework.messaging.handler.annotation.SendTo;
import org.springframework.stereotype.Component;
import org.springframework.test.context.junit4.SpringRunner;

@RunWith(SpringRunner.class)
@SpringBootTest(classes = App2.class)
public class TestActiveMq {
    
    //注入springboot封装的工具类
    @Autowired
    private JmsMessagingTemplate jmsMessagingTemplate;

    @Autowired
    private ConsumerService consumerService;
    //消费者1
    @Test
    public void Consumers() {
    
        consumerService.handleMessage("testQueue");
    }
}

运行消费者的测试类,在浏览器端查看activemq的队列,查看到在testQueue的队列中消费者信息列出现一条消费,表明消费成功!也就是说刚才生产的一条数据被消费了。
消费者一条

以上就是我个人对消息队列的认识,SpringBoot简单整合ActiveMq就到此结束了,有什么不正确的地方欢迎指正,共同学习。
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_42547726/article/details/103873888

智能推荐

DataGuard主备库上修改redo大小_dataguard 调整redo日志大小-程序员宅基地

文章浏览阅读419次。测试环境:RDBMS 11.2.0.4步骤:1 停掉备库的MRP2 在备库上添加standby logfile,大小100M (standby_file_management='manual';注意下这个参数)3 在备库上删除standby logfile,删除掉50M的4 在主库添加redo,大小为100M5 在主库删除redo ,大小为50M6 备库添加redo,大小为100M7 备库删除redo ,大小为50M8 主库添加standby ,大小为100M9 主库删除stand._dataguard 调整redo日志大小

利用matlab从TXT中读数据1_matlab读取txt中的科学计数-程序员宅基地

文章浏览阅读4.5w次,点赞12次,收藏48次。TXT是纯文本文件,常用的几种函数有load函数,importdata函数,dlmread函数,textread函数。科学计数法如1.03乘10的8次方,可简写为“1.03e+08”的形式1:examp0204.txt中只包含没有文字说明,且每行数据个数相同,只是有多种数据分隔符,此数据同样可以使用数据导入向导。9.5550 2.7027, 8.6014; 5.615..._matlab读取txt中的科学计数

洛谷P1996 约瑟夫问题【队列】_8个人站成一圈,从第1个人开始报数,报到5的人出圈,第6个人再从1开始报。依次类-程序员宅基地

文章浏览阅读340次。题目背景约瑟夫是一个无聊的人!!!题目描述n个人(n&lt;=100)围成一圈,从第一个人开始报数,数到m的人出列,再由下一个人重新从1开始报数,数到m的人再出圈,……依次类推,直到所有的人都出圈,请输出依次出圈人的编号.输入输出格式输入格式: n m 输出格式: 出圈的编号 输入输出样例输入样例#1: 复制10 3输出样例#1: ..._8个人站成一圈,从第1个人开始报数,报到5的人出圈,第6个人再从1开始报。依次类

使用JavaScript代码制作网页年历_javascript年历-程序员宅基地

文章浏览阅读5.6k次,点赞5次,收藏43次。年历使用js代码制作网页年历生成<!doctype html><html> <head> <meta charset="utf-8"> <title>年历</title> <script> var year = parseInt(prompt('输入年份:','2019')); document.write(calendar(year)); _javascript年历

python 数据图像修正_在OpenCV中修正失真的裁剪图像(Python)-程序员宅基地

文章浏览阅读352次。由于空白部分在图像中间具有最大值/最小值,因此您可以查找中间线并查看颜色何时发生变化.下图可能会澄清这一点: 您只需要找到图像中显示的x1,y1,x2和y2.这可以按如下方式完成:import cv2# Reads the image in grayscaleimg = cv2.imread('Undistorted.jpg', 0)h, w = img.shapex1, x2, y1, y2 =..._opencv 截取图片一部分后失真

TORCH MAXIMUM_module 'torch' has no attribute 'maximum-程序员宅基地

文章浏览阅读3.5k次。import torcha = torch.tensor((1, 2, -1))b = torch.tensor((3, 0, 4))torch.maximum(a, b)结果应该是:tensor([3, 2, 4])AttributeError: module 'torch' has no attribute 'maximum'torch版本:1.6.0+cu101_module 'torch' has no attribute 'maximum

随便推点

JavaMail API详解_有关javamail api的描述以下( )正确-程序员宅基地

文章浏览阅读5.4k次,点赞3次,收藏13次。JavaMail API详解cleverpig 发表于 2006-01-01 14:34:28作者:cleverpig&nbsp;&nbsp;&nbsp;&nbsp; 来源:Matrix摘要:JavaMail API是读取、撰写、发送电子信息的可选包。我们可用它来建立如Eudora、Foxmail、MS Outlook Express一般的邮件用户代理程序(Mail User Age..._有关javamail api的描述以下( )正确

百度天工笔记_端口1884是什么服务-程序员宅基地

文章浏览阅读883次。百度天工笔记参考资料:初识百度天工百度产品文档简介百度天工是融合了百度ABC(AI、Big Data、Cloud)的“一站式、全托管”智能物联网平台。 从端到云,从数据采集、传输、计算、存储、展现到分析,天工提供了全面的基础产品和服务。赋能物联网应用开发商和生态合作伙伴从”连接”、”理解”到”唤醒“的各项关键能力,从而轻松构建各类智能物联网应用,促进行业变革。连接:互联互通,让..._端口1884是什么服务

The 2021 ICPC Asia Jinan Regional Contest - C Optimal Strategy - 2021ICPC济南站C题 组合数学_2021 济南站icpc optimal strategy-程序员宅基地

文章浏览阅读3k次。题目大意Ena和Mizuki正在玩一个游戏。他们面前有n个项目,编号从1到n。第i个项目的价值是.Ena和Mizuki轮流操作,而Ena先操作。在一次移动中,玩家选择一个尚未被拿走的物品并将其带走。当所有物品都被拿走时,游戏结束。任何一方的目标都是使他们拿走的物品的价值之和最大。鉴于双方都以最佳方式行动,有多少个可能的游戏过程?由于这个数字可能太大,你应该输出998244353的模数。如果存在某个整数i(1≤i≤n),使第i次移动中拿走的物品的指数不同,则认为两个过程不同。输入描述._2021 济南站icpc optimal strategy

数据分析学习路线图_技术路线图颜色-程序员宅基地

文章浏览阅读1.8k次,点赞4次,收藏24次。个人欠缺1-数据库类必修:NoSQL(MangoDB, Redis)选修:了解各类NoSQL,基于图的数据库Neo4j,基于Column的数据库BigTable,基于key-value的数据库redis/cassendra2-大数据开发hadoop基础,包括hdfs、map-reduce、hive之类;后面接触spark和storm再说3-工具类可视化:http://plot.ly、d3.js、echarts.jsPython:seaborn, boken其他:爬虫(req_技术路线图颜色

【Java EE】--Contexts and Dependency Injection(上下文和依赖注入) 03_hasinjectioncontext什么意思-程序员宅基地

文章浏览阅读730次。bean作为可注入对象注入的概念已经成为Java技术的一部分。 由于引入了Java EE 5平台,注释使得可以将资源和其他类型的对象注入到容器管理的对象中。 CDI使得可以注入更多种类的对象并将其注入到不是容器管理的对象中。可以注入以下几种对象:(几乎)任何Java类会话beanJava EE资源:数据源,Java消息服务主题,队列,连接工厂等持久性上下文(Java Persistence_hasinjectioncontext什么意思

vux里x-address清空时遇到的坑_x-address的hide-district-程序员宅基地

文章浏览阅读1.6k次。先说说遇到的坑吧!其实,此处是一个细节性的问题。用起来一切都是正常的。但是,当你选择的城市为北京的时候,你点击提交成功后,把值给清空了,当你再次选择默认的北京时,你会发现此时是赋不上值的。原因是因为x-address里面的@on-shadow-change没有触发。解决方案其实很简单,提前定义一个变量存储一下@on-shadow-change里面的index。然后在@on-hide里面重新赋值就行..._x-address的hide-district

推荐文章

热门文章

相关标签