技术标签: spring activemq spring boot java 队列
1,消息队列,一般我们会简称它为MQ,英文的意思就是Message Queue,列入RubbtyMq、ActiveMq等。
2、消息队列,队列先进先出的数据结构,这里我们需要记住栈是先进后出。
1、流量削峰
2、异步通讯
3、应用解耦
这里我就不赘述了,不清楚的可以私聊我。
1、 queue(一对一):也就是生产的只能一个人用,用了就没有了,也称点对点。
2、 topic (一对多):也就是生产的东西可供多个人用,比如报纸可以一个人读了另一个人再读,也称发布/订阅。
这里我简易的画了一个图,类似一根水管。
这里我下载了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、浏览器测试客户端是否可用
看到以上画面,说明已经启动成功了。
主要是
<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>
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
一、生产者的编写
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的队列中消费者信息列出现一条消费,表明消费成功!也就是说刚才生产的一条数据被消费了。
文章浏览阅读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日志大小
文章浏览阅读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中的科学计数
文章浏览阅读340次。题目背景约瑟夫是一个无聊的人!!!题目描述n个人(n<=100)围成一圈,从第一个人开始报数,数到m的人出列,再由下一个人重新从1开始报数,数到m的人再出圈,……依次类推,直到所有的人都出圈,请输出依次出圈人的编号.输入输出格式输入格式: n m 输出格式: 出圈的编号 输入输出样例输入样例#1: 复制10 3输出样例#1: ..._8个人站成一圈,从第1个人开始报数,报到5的人出圈,第6个人再从1开始报。依次类
文章浏览阅读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年历
文章浏览阅读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 截取图片一部分后失真
文章浏览阅读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
文章浏览阅读5.4k次,点赞3次,收藏13次。JavaMail API详解cleverpig 发表于 2006-01-01 14:34:28作者:cleverpig 来源:Matrix摘要:JavaMail API是读取、撰写、发送电子信息的可选包。我们可用它来建立如Eudora、Foxmail、MS Outlook Express一般的邮件用户代理程序(Mail User Age..._有关javamail api的描述以下( )正确
文章浏览阅读883次。百度天工笔记参考资料:初识百度天工百度产品文档简介百度天工是融合了百度ABC(AI、Big Data、Cloud)的“一站式、全托管”智能物联网平台。 从端到云,从数据采集、传输、计算、存储、展现到分析,天工提供了全面的基础产品和服务。赋能物联网应用开发商和生态合作伙伴从”连接”、”理解”到”唤醒“的各项关键能力,从而轻松构建各类智能物联网应用,促进行业变革。连接:互联互通,让..._端口1884是什么服务
文章浏览阅读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_技术路线图颜色
文章浏览阅读730次。bean作为可注入对象注入的概念已经成为Java技术的一部分。 由于引入了Java EE 5平台,注释使得可以将资源和其他类型的对象注入到容器管理的对象中。 CDI使得可以注入更多种类的对象并将其注入到不是容器管理的对象中。可以注入以下几种对象:(几乎)任何Java类会话beanJava EE资源:数据源,Java消息服务主题,队列,连接工厂等持久性上下文(Java Persistence_hasinjectioncontext什么意思
文章浏览阅读1.6k次。先说说遇到的坑吧!其实,此处是一个细节性的问题。用起来一切都是正常的。但是,当你选择的城市为北京的时候,你点击提交成功后,把值给清空了,当你再次选择默认的北京时,你会发现此时是赋不上值的。原因是因为x-address里面的@on-shadow-change没有触发。解决方案其实很简单,提前定义一个变量存储一下@on-shadow-change里面的index。然后在@on-hide里面重新赋值就行..._x-address的hide-district