当前位置: 首页 > news >正文

Java学习五阶段-RabbitMQ-SpringBoot整合

文章目录

  • 新建项目
    • pom.xml
    • application.yml
    • 主程序
  • 简单模式
    • 主程序
    • 生产者
    • 消费者
    • 测试类
  • 工作模式
    • 主程序
    • 生产者
    • 消费者
    • 测试类
  • ack模式
    • 设置 ack 模式
    • 手动执行确认操作
  • 抓取数量
  • 发布和订阅模式
    • 主程序
    • 生产者
    • 消费者
    • 测试类
  • 路由模式
    • 主程序
    • 生产者
    • 消费者
    • 测试类
  • 主题模式
    • 主程序
    • 生产者
    • 消费者
    • 测试类
  • RPC异步调用
    • 主程序
    • 服务端
    • 客户端
    • 测试类

新建项目

新建项目
选择依赖

pom.xml

<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.2.4.RELEASE</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>cn.tedu</groupId><artifactId>rabbitmq-springboot</artifactId><version>0.0.1-SNAPSHOT</version><name>rabbitmq-springboot</name><description>Demo project for Spring Boot</description><properties><java.version>1.8</java.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope><exclusions><exclusion><groupId>org.junit.vintage</groupId><artifactId>junit-vintage-engine</artifactId></exclusion></exclusions></dependency><dependency><groupId>org.springframework.amqp</groupId><artifactId>spring-rabbit-test</artifactId><scope>test</scope></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build>

</project>

application.yml

spring:rabbitmq:host: 192.168.64.140username: adminpassword: admin

主程序

删除自动创建的主程序

我们为每种模式创建一个包,在每个包中创建各自的主程序,单独测试.

在这里插入图片描述

简单模式

主程序

Spring提供的Queue类,是队列的封装对象,它封装了队列的参数信息.

RabbitMQ的自动配置类,会发现这些Queue实例,并在RabbitMQ服务器中定义这些队列.

package cn.tedu.m1;
import org.springframework.amqp.core.Queue;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
@SpringBootApplication
public class Main {public static void main(String[] args) {SpringApplication.run(Main.class, args);}@Beanpublic Queue task_queue() {/** 可用以下形式: * new Queue("helloworld") - 持久,非排他,非自动删除* new Queue("helloworld",false,false,false,null)*/return new Queue("helloworld",false);}
}

生产者

AmqpTemplate是rabbitmq客户端API的一个封装工具,提供了简便的方法来执行消息操作.

AmqpTemplate由自动配置类自动创建

package cn.tedu.m1;
import org.springframework.amqp.core.AmqpTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component
public class SimpleSender {@AutowiredAmqpTemplate t;	public void send() {// 这里向 helloworld 队列发送消息t.convertAndSend("helloworld", "Hello world!! "+System.currentTimeMillis());System.out.println("消息已发送");}
}

消费者

通过@RabbitListener从指定的队列接收消息

使用@RebbitHandler注解的方法来处理消息

package cn.tedu.m1;
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;
@Component
@RabbitListener(queues = "helloworld")
public class SimpleReceiver {@RabbitHandlerpublic void receive(String msg) {System.out.println("收到: "+msg);}
}

这里还可以使用另一种形式:

@Component
public class SimpleReceiver {@RabbitListener(queues = "helloworld")public void receive(String msg) {System.out.println("收到: "+msg);}
}

另外,@RabbitListener 注解中也可以直接定义队列:

	@RabbitListener(queuesToDeclare = @Queue(name = "helloworld",durable = "false"))

测试类

在存放测试代码的目录中,创建测试类

package cn.tedu.m1;
import java.util.Scanner;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
class SimpleTests {@AutowiredSimpleSender simpleSender;@Testvoid test1() throws Exception {simpleSender.send();System.out.println("[按回车结束]");new Scanner(System.in).nextLine();}
}

在这里插入图片描述

工作模式

主程序

在主程序中创建名为task_queue持久队列

package cn.tedu.m2;
import org.springframework.amqp.core.Queue;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
@SpringBootApplication
public class Main {public static void main(String[] args) {SpringApplication.run(Main.class, args);}@Beanpublic Queue task_queue() {// 这个构造方法创建的队列参数为: 持久,非排他,非自动删除return new Queue("task_queue");}
}

生产者

package cn.tedu.m2;
import java.util.Scanner;
import org.springframework.amqp.core.AmqpTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component
public class WorkSender {@AutowiredAmqpTemplate t;public void send() {while (true) {System.out.print("输入:");String s = new Scanner(System.in).nextLine();		//spring 默认将消息的 DeliveryMode 设置为 PERSISTENT 持久化,t.convertAndSend("task_queue", s);}}
}

spring boot封装的 rabbitmq api 中, 发送的消息默认是持久化消息.
如果希望发送非持久化消息, 需要在发送消息时做以下设置:

  • 使用 MessagePostProcessor 前置处理器参数
  • 从消息中获取消息的属性对象
  • 在属性中把 DeliveryMode 设置为非持久化
	//如果需要设置消息为非持久化,可以取得消息的属性对象,修改它的deliveryMode属性t.convertAndSend("task_queue", (Object) s, new MessagePostProcessor() {@Overridepublic Message postProcessMessage(Message message) throws AmqpException {MessageProperties props = message.getMessageProperties();props.setDeliveryMode(MessageDeliveryMode.NON_PERSISTENT);return message;}});

消费者

package cn.tedu.m2;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;
@Component
public class WorkReceiver1 {@RabbitListener(queues="task_queue")public void receive1(String s) throws Exception {System.out.println("receiver1 - 收到: "+s);for (int i = 0; i < s.length(); i++) {if (s.charAt(i) == '.') {Thread.sleep(1000);}}}	@RabbitListener(queues="task_queue")public void receive2(String s) throws Exception {System.out.println("receiver2 - 收到: "+s);for (int i = 0; i < s.length(); i++) {if (s.charAt(i) == '.') {Thread.sleep(1000);}}}
}

测试类

package cn.tedu.m2;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
class WorkTests {@AutowiredWorkSender workSender;@Testvoid test1() throws Exception {workSender.send();}
}

在这里插入图片描述

ack模式

在 spring boot 中提供了三种确认模式:

  • NONE - 使用rabbitmq的自动确认
  • AUTO - 使用rabbitmq的手动确认, springboot会自动发送确认回执 (默认)
  • MANUAL - 使用rabbitmq的手动确认, 且必须手动执行确认操作

默认的 AUTO 模式中, 处理消息的方法抛出异常, 则表示消息没有被正确处理, 该消息会被重新发送.

设置 ack 模式

spring:rabbitmq:listener:simple:# acknowledgeMode: NONE # rabbitmq的自动确认acknowledgeMode: AUTO # rabbitmq的手动确认, springboot会自动发送确认回执 (默认)# acknowledgeMode: MANUAL # rabbitmq的手动确认, springboot不发送回执, 必须自己编码发送回执

手动执行确认操作

如果设置为 MANUAL 模式,必须手动执行确认操作

	@RabbitListener(queues="task_queue")public void receive1(String s, Channel c, @Header(name=AmqpHeaders.DELIVERY_TAG) long tag) throws Exception {System.out.println("receiver1 - 收到: "+s);for (int i = 0; i < s.length(); i++) {if (s.charAt(i) == '.') {Thread.sleep(1000);}}// 手动发送确认回执c.basicAck(tag, false);}

在这里插入图片描述

抓取数量

工作模式中, 为了合理地分发数据, 需要将 qos 设置成 1, 每次只接收一条消息, 处理完成后才接收下一条消息.

spring boot 中是通过 prefetch 属性进行设置, 改属性的默认值是 250.

spring:rabbitmq:listener:simple:prefetch: 1 # qos=1, 默认250

在这里插入图片描述

发布和订阅模式

主程序

创建 FanoutExcnahge 实例, 封装 fanout 类型交换机定义信息.

spring boot 的自动配置类会自动发现交换机实例, 并在 RabbitMQ 服务器中定义该交换机.

package cn.tedu.m3;
import org.springframework.amqp.core.FanoutExchange;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
@SpringBootApplication
public class Main {public static void main(String[] args) {SpringApplication.run(Main.class, args);}@Beanpublic FanoutExchange fanoutExchange() {return new FanoutExchange("logs");}
}

生产者

生产者向指定的交换机 logs 发送数据.

不需要指定队列名或路由键, 即使指定也无效, 因为 fanout 交换机会向所有绑定的队列发送数据, 而不是有选择的发送.

package cn.tedu.m3;
import java.util.Scanner;
import org.springframework.amqp.core.AmqpTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component
public class Publisher {@AutowiredAmqpTemplate t;public void send() {while (true) {System.out.print("输入:");String s = new Scanner(System.in).nextLine();// 指定向 logs 交换机发送, 不指定队列名或路由键t.convertAndSend("logs","",s);}}
}

消费者

消费者需要执行以下操作:

  1. 定义随机队列(随机命名,非持久,排他,自动删除)
  2. 定义交换机(可以省略, 已在主程序中定义)
  3. 将队列绑定到交换机

spring boot 通过注解完成以上操作:

@RabbitListener(bindings = @QueueBinding( //这里进行绑定设置value = @Queue, //这里定义随机队列,默认属性: 随机命名,非持久,排他,自动删除exchange = @Exchange(name = "logs", declare = "false") //指定 logs 交换机,因为主程序中已经定义,这里不进行定义
))
package cn.tedu.m3;
import org.springframework.amqp.rabbit.annotation.Exchange;
import org.springframework.amqp.rabbit.annotation.Queue;
import org.springframework.amqp.rabbit.annotation.QueueBinding;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;
@Component
public class Subscriber {@RabbitListener(bindings = @QueueBinding(value = @Queue, exchange = @Exchange(name = "logs", declare = "false")))public void receive1(String s) throws Exception {System.out.println("receiver1 - 收到: "+s);}@RabbitListener(bindings = @QueueBinding(value = @Queue, exchange = @Exchange(name = "logs", declare = "false")))public void receive2(String s) throws Exception {System.out.println("receiver2 - 收到: "+s);}
}

测试类

package cn.tedu.m3;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
class PublishSubscribeTests {@AutowiredPublisher publisher;@Testvoid test1() throws Exception {publisher.send();}
}

在这里插入图片描述

路由模式

与发布和订阅模式代码类似, 只是做以下三点调整:

  1. 使用 direct 交换机
  2. 队列和交换机绑定时, 设置绑定键
  3. 发送消息时, 指定路由键

主程序

主程序中使用 DirectExcnahge 对象封装交换机信息, spring boot 自动配置类会自动发现这个对象, 并在 RabbitMQ 服务器上定义这个交换机.

package cn.tedu.m4;
import org.springframework.amqp.core.DirectExchange;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
@SpringBootApplication
public class Main {public static void main(String[] args) {SpringApplication.run(Main.class, args);}@Beanpublic DirectExchange fanoutExchange() {return new DirectExchange("direct_logs");}
}

生产者

生产者向指定的交换机发送消息, 并指定路由键.

package cn.tedu.m4;
import java.util.Scanner;
import org.springframework.amqp.core.AmqpTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component
public class RouteSender {@AutowiredAmqpTemplate t;	public void send() {while (true) {System.out.print("输入消息:");String s = new Scanner(System.in).nextLine();System.out.print("输入路由键:");String key = new Scanner(System.in).nextLine();// 第二个参数指定路由键t.convertAndSend("direct_logs",key,s);}}
}

消费者

消费者通过注解来定义随机队列, 绑定到交换机, 并指定绑定键:

@RabbitListener(bindings = @QueueBinding( // 这里做绑定设置value = @Queue, // 定义队列, 随机命名,非持久,排他,自动删除exchange = @Exchange(name = "direct_logs", declare = "false"), // 指定绑定的交换机,主程序中已经定义过队列,这里不进行定义key = {"error","info","warning"} // 设置绑定键
))
package cn.tedu.m4;
import org.springframework.amqp.rabbit.annotation.Exchange;
import org.springframework.amqp.rabbit.annotation.Queue;
import org.springframework.amqp.rabbit.annotation.QueueBinding;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;
@Component
public class RouteReceiver {@RabbitListener(bindings = @QueueBinding(value = @Queue,exchange = @Exchange(name = "direct_logs", declare = "false"),key = {"error"}))public void receive1(String s) throws Exception {System.out.println("receiver1 - 收到: "+s);}@RabbitListener(bindings = @QueueBinding(value = @Queue, exchange = @Exchange(name = "direct_logs", declare = "false"),key = {"error","info","warning"}))public void receive2(String s) throws Exception {System.out.println("receiver2 - 收到: "+s);}
}

测试类

package cn.tedu.m4;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
class RouteTests {@AutowiredRouteSender sender;@Testvoid test1() throws Exception {sender.send();}
}

在这里插入图片描述

主题模式

主题模式不过是具有特殊规则的路由模式, 代码与路由模式基本相同, 只做如下调整:

  1. 使用 topic 交换机
  2. 使用特殊的绑定键和路由键规则

主程序

package cn.tedu.m5;
import org.springframework.amqp.core.TopicExchange;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
@SpringBootApplication
public class Main {public static void main(String[] args) {SpringApplication.run(Main.class, args);}@Beanpublic TopicExchange fanoutExchange() {return new TopicExchange("topic_logs");}
}

生产者

package cn.tedu.m5;
import java.util.Scanner;
import org.springframework.amqp.core.AmqpTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component
public class TopicSender {@AutowiredAmqpTemplate t;public void send() {while (true) {System.out.print("输入消息:");String s = new Scanner(System.in).nextLine();System.out.print("输入路由键:");String key = new Scanner(System.in).nextLine();		t.convertAndSend("topic_logs",key,s);}}
}

消费者

package cn.tedu.m5;
import org.springframework.amqp.rabbit.annotation.Exchange;
import org.springframework.amqp.rabbit.annotation.Queue;
import org.springframework.amqp.rabbit.annotation.QueueBinding;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;
@Component
public class TopicReceiver {@RabbitListener(bindings = @QueueBinding(value = @Queue,exchange = @Exchange(name = "topic_logs", declare = "false"),key = {"*.orange.*"}))public void receive1(String s) throws Exception {System.out.println("receiver1 - 收到: "+s);}@RabbitListener(bindings = @QueueBinding(value = @Queue, exchange = @Exchange(name = "topic_logs", declare = "false"),key = {"*.*.rabbit","lazy.#"}))public void receive2(String s) throws Exception {System.out.println("receiver2 - 收到: "+s);}
}

测试类

package cn.tedu.m5;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
class TopicTests {@AutowiredTopicSender sender;@Testvoid test1() throws Exception {sender.send();}
}

在这里插入图片描述

RPC异步调用

主程序

主程序中定义两个队列

  • 发送调用信息的队列: rpc_queue
  • 返回结果的队列: 随机命名
package cn.tedu.m6;
import java.util.UUID;
import org.springframework.amqp.core.Queue;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
@SpringBootApplication
public class Main {public static void main(String[] args) {SpringApplication.run(Main.class, args);}@Beanpublic Queue sendQueue() {return new Queue("rpc_queue",false);}@Beanpublic Queue rndQueue() {return new Queue(UUID.randomUUID().toString(), false);}
}

服务端

rpc_queue接收调用数据, 执行运算求斐波那契数,并返回计算结果.
@Rabbitlistener注解对于具有返回值的方法:

  • 会自动获取 replyTo 属性
  • 自动获取 correlationId 属性
  • replyTo 属性指定的队列发送计算结果, 并携带 correlationId 属性
package cn.tedu.m6;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;
@Component
public class RpcServer {@RabbitListener(queues = "rpc_queue")public long getFbnq(int n) {return f(n);
}private long f(int n) {if (n==1 || n==2) {return 1;}return f(n-1) + f(n-2);}
}

客户端

使用 SPEL 表达式获取随机队列名: "#{rndQueue.name}"

发送调用数据时, 携带随机队列名和correlationId

从随机队列接收调用结果, 并获取correlationId

package cn.tedu.m6;
import java.util.UUID;
import org.springframework.amqp.AmqpException;
import org.springframework.amqp.core.AmqpTemplate;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.core.MessagePostProcessor;
import org.springframework.amqp.core.MessageProperties;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.amqp.support.AmqpHeaders;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.messaging.handler.annotation.Header;
import org.springframework.stereotype.Component;
@Component
public class RpcClient {@AutowiredAmqpTemplate t;	@Value("#{rndQueue.name}")String rndQueue;	public void send(int n) {// 发送调用信息时, 通过前置消息处理器, 对消息属性进行设置, 添加返回队列名和关联idt.convertAndSend("rpc_queue", (Object)n, new MessagePostProcessor() {@Overridepublic Message postProcessMessage(Message message) throws AmqpException {MessageProperties p = message.getMessageProperties();p.setReplyTo(rndQueue);p.setCorrelationId(UUID.randomUUID().toString());return message;}});}	//从随机队列接收计算结果@RabbitListener(queues = "#{rndQueue.name}")public void receive(long r, @Header(name=AmqpHeaders.CORRELATION_ID) String correlationId) {System.out.println("\n\n"+correlationId+" - 收到: "+r);}
}

测试类

package cn.tedu.m6;
import java.util.Scanner;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
class TopicTests {@AutowiredRpcClient client;@Testvoid test1() throws Exception {while (true) {System.out.print("求第几个斐波那契数: ");int n = new Scanner(System.in).nextInt();client.send(n);}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.exyb.cn/news/show-35054.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

带你了解DDoS攻击的原理,让你轻松学会DDoS攻击原理及防护措施

DDoS攻击原理是什么? 随着网络时代的到来&#xff0c;网络安全变得越来越重要。在互联网的安全领域&#xff0c;DDoS(Distributed DenialofService)攻击技术因为它的隐蔽性&#xff0c;高效性一直是网络攻击者最青睐的攻击方式&#xff0c;它严重威胁着互联网的安全。接下来的…...

小区物业管理系统-物业管理员页面

小区物业管理系统-物业管理员页面 主页面 添加业主 Public Class PropertyManager_Pro_insertbug:插入&#xff1a;若删除一个&#xff0c;用count就会插入相同的&#xff0c;导致插入错误Dim proprietor As New ProprietorPublic Sub New(s As String)InitializeComponent()E…...

Python数学问题20:高空抛物

1. 问题描述 一球从100米高度自由落下&#xff0c;每次落地后反跳回原高度的一半&#xff1b;再落下&#xff0c;求它在第10次落地时&#xff0c;共经过多米&#xff1f;第10次反弹多高&#xff1f; 2. 实例代码 high 200 total 100 for i in range(10):high / 2total hi…...

SQL Server 执行计划(1)- 概述

在本系列文章中&#xff0c;我们将导航 SQL Server 执行计划的海洋&#xff0c;从定义执行计划的概念开始&#xff0c;遍历执行计划的类型、组件和运算符&#xff0c;分析执行计划&#xff0c;我们将完成如何保存和管理执行计划。 SQL Server 执行计划概述 当你提交一个 T-SQ…...

多域间访问之外部信任

前言&#xff1a;在同一个林内&#xff0c;通过自动建立可传递的&#xff0c;双向的信任关系&#xff0c;可以实现所有域间的相互信任。但是在不同林之间则不会自动建立信任关系&#xff0c;要实现两个林之间的访问需要手工建立信任关系。 林之间的信任关系又可分为外部信任和…...

阿里程序员的Java之路!Redis宕机数据丢失解决方案

二叉树 定义 二叉树是n(n>0)个结点的有限集合&#xff0c;该集合或者为空集&#xff08;称为空二叉树&#xff09;&#xff0c;或者由一个根结点和两棵互不相交的、分别称为根结点的左子树和右子树组成。 图解 二叉树特点 由二叉树定义以及图示分析得出二叉树有以下特点…...

最全面的 Spring 学习笔记

最全面的 Spring 学习笔记...

html基础

文章目录day01_web一、Web前端介绍1. 什么是网页2. 网页的组成3. 开发前的准备二、 HTML语法介绍1. HTML介绍2. 标签3. 使用三、常用标签介绍1. 基本结构解析2. body中常用标签3. 常用结构标签属性和属性值day01_web 一、Web前端介绍 1. 什么是网页 网页是基于浏览器的应用程…...

pt-osc工具原理与实践

MySQL在5.7版本对于online ddl支持的并不是非常优化&#xff0c;比如说将大表int字段类型修改成bigint或者对大表进行字符编码的改造。对于业务来说都是需要停业去处理的&#xff0c;对于高速发展的互联网行业来说&#xff0c;时间就是金钱&#xff0c;所以合理的应用pt-osc工具…...

Unity ILRuntime编译命令

C:\Windows\Microsoft.NET\Framework64\v4.0.30319\MSBuild.exe F:\UnityProjects\Test\Assets\Samples\ILRuntime\1.6.7\Demo\HotFix_Project~\HotFix_Project.csproj /t:Rebuild /p:ConfigurationRelease pause...

Keyhole Markup Language (KML)

5. KML-Keyhole Markup Language From https://developers.google.com/kml/documentation/kml_tut?hlzh-CN KML 是一种文件格式&#xff0c;用于在地球浏览器&#xff08;例如 Google 地球、Google 地图和谷歌手机地图&#xff09;中显示地理数据。KML 使用含有嵌套的元素和…...

idea复制当前行快捷键

仅作为记录&#xff0c;大佬请跳过。 在该行的任何位置&#xff0c;直接用ctrl和c即可 参考 感谢大佬博主文章&#xff1a;传送门...

不抛弃异常值的几种情况

异常数据是数据分布的常态,处于特定分布区域或范围之外的数据 通常会被定义为异常或“噪音”。产生数据“噪音”的原因很多,例如业务 运营操作、数据采集问题、数据同步问题等。对异常数据进行处理前, 需要先辨别出到底哪些是真正的数据异常。 从数据异常的状态看分为两 种…...

23种设计模式

一、什么是设计模式 设计模式&#xff08;Design pattern&#xff09;是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。 毫无疑问&#xff0c;设计模式于己于他人于系统都是多…...

Nacos 2.0.2正式版发布

一、介绍Nacos Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集&#xff0c;帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。 Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。 Nacos 是构建以“服务”为中心的现代应用…...

spring框架的各种注解基本意思

//在 spring 配置文件中开启生成代理对象 <!-- 开启 Aspect 生成代理对象--> <aop:aspectj-autoproxy></aop:aspectj-autoproxy>Autowired //根据属性类型进行自动装配 Aspect //生成代理对象 Qualifier //根据名称进行注 Resource //可以根据类型注…...

【Java45】旅游案例:数据回显,注销/退出,首页类别显示,精选

文章目录1.登陆数据回显1.1 前端2.登陆案例_注销/退出3.首页类别显示3.1 web3.2 service3.3 dao4.精选4.1 web4.2 service4.3 dao4.4 前端1.登陆数据回显 如上前端写在header.html中。 1.1 前端 //header.html <!-- 头部 start --><header id"header2"&g…...

axios跨域问题

项目配置 vue-cli3vue2element-ui-2.15.3 在网上找了很多方案&#xff0c;但是都没有生效&#xff0c;最后是前端添加了一段代码&#xff0c;后台添加了一段代码 解决了 添加了headers的配置 const instance axios.create({// baseURL: http://mall.huolida.com/,// baseUR…...

原创-Kafka原理

Kafka原理 2017年09月22日 22:39:45317人阅读 评论(0) 收藏 举报 分类&#xff1a; Kafka&#xff08;1&#xff09; 目录(?)[] Kafka 这段时间研究RabbitMQ、Kafka、RocketMQ消息队列&#xff0c;发现对她们原理的介绍都过于简单&#xff0c;所以整理了众多资料&…...

ef dbcontext

dbcontext class 用来crud数据库&#xff0c;也用来配置实体类&#xff0c;关系映射&#xff0c;缓存&#xff0c;事务&#xff0c;变化追踪等 using System.Data.Entity;public class SchoolContext : DbContext {public SchoolContext(){}// Entities public DbSet&l…...

----- ElasticSearch -----

1.什么是RestFul 2.什么是全文检索 3.什么是Elastic Search 开源 Apache Lucen 工具包 java api特别多 solr 全文检索服务器 底层封装了lucene ElasticSearch 开源搜索引擎 java 4.ES中基本概念 1&#xff09;接近实时(NRT Near Real Time 2&#xff09;索引(index) 3&am…...

光线跟踪算法技术 笔记

P53 这里好像QT 哈哈...

防火墙高可靠性

双机热备、BFD双向转发检测、IP-LINK链路检测、Link-Group逻辑组、ETH-Trunk链路捆绑、Bypass&#xff0c;跨数据中心集群&#xff0c;双主控、业务板备份、数据中心会话同步 双机热备 目的&#xff1a;为了防止单点故障 实现&#xff1a;两台硬件软件相同的FW之间通过一条独…...

SQL server安装时显示重启计算机失败问题解决办法

SQL server安装时显示重启计算机失败问题解决办法参考文章&#xff1a; &#xff08;1&#xff09;SQL server安装时显示重启计算机失败问题解决办法 &#xff08;2&#xff09;https://www.cnblogs.com/netflix/p/12074481.html 备忘一下。...

MATLAB基础语法之拟合算法

%data1.mat数据如下 %导入data1的数据 load data1%以x为自变量&#xff0c;y为因变量&#xff0c;o为点的形状作散点图 plot(x,y,o)% 给x和y轴加上标签 xlabel(x的值)ylabel(y的值)%返回data1数据行数n 19 n size(x,1); %最小二乘法求解拟合曲线参数 k (n*su…...

小码哥【Java从0到架构师】wangpan学习记录

Java 从 0 到 架构师 第一阶段&#xff1a;Java 基础语法 第二阶段&#xff1a;JavaEE 基石 基本概念 环境搭建 Servlet_JSP MySQL 基础 多表查询 JDBC、Spring JDBC、JUnit JS_jQuery_BootStrap Maven 会话跟踪 Cookie_Session Filter_Listener_AJAX 第二阶段项目实战 - 个人…...

STM32F103驱动无刷直流电机应用思路

一、STM32F103驱动无刷直流电机基本思路 无刷电机控制是基于6步换相法如下图所示&#xff1a; 二、STM32F103驱动无刷直流电机方法介绍 通常我们用的方法是使用高级定时器3通道互补输出去驱动mos管&#xff0c;用通用定时器连接霍尔传感器去触发中断&#xff0c;在中断中换相&…...

多域间访问之外部信任

前言&#xff1a;在同一个林内&#xff0c;通过自动建立可传递的&#xff0c;双向的信任关系&#xff0c;可以实现所有域间的相互信任。但是在不同林之间则不会自动建立信任关系&#xff0c;要实现两个林之间的访问需要手工建立信任关系。 林之间的信任关系又可分为外部信任和…...

Windows系统发布Asp.Net core应用到IIS上

如何在windows系统上发布一个Asp.net core应用的网站&#xff1f;踩了不少坑&#xff0c;现在简单总结如下。 亲测有效的系统&#xff1a; windows 7 x64windows 10 x64windows server 2016 x64 具体步骤如下&#xff1a; 1.Net Core SDK安装 .Net Core SDK是一组库和工具…...

Chrom 插件下载网址

https://chrome.zzzmh.cn/#index...

基于WEB的在线选课系统(asp.net)

目  录 摘要 I Abstract II 第1章 绪论 1 1.1 课题背景 1 1.2 目的和意义 1 1.3 系统设计思想 2 第2章 可行性分析 3 2.1 管理可行性 3 2.2 经济可行性 4 2.2.1 系统初期投资 4 2.2.2 系统货币的时间价值 4 2.2.3 投资回收期 5 2.2.4 纯收入 5 2.3 技术可行性 5 2…...

仿阿里云后台管理界面模板html源码——后台

链接&#xff1a;http://pan.baidu.com/s/1nuH2SPj 密码&#xff1a;ar8o 转载于:https://www.cnblogs.com/wordblog/p/6790899.html...

阿里云后台服务器IIS安装与配置

登陆服务器后找到服务器管理器 1、点击添加角色和功能&#xff0c;点击下一步 2、安装类型和服务器选择直接点击下一步即可 3、服务器角色选择对应的Web服务器&#xff08;IIS&#xff09; 选择所需功能&#xff0c;一般安全性、常见HTTP功能、性能、运行状态和诊断基本管理工…...

阿里云上发布自己的网站的方法

在阿里云上发布自己的网站的方法&#xff1a; 一、在阿里云上发布自己的网站的方法&#xff1a; 进入我的电脑&#xff0c;在头部输入ftp&#xff1a;//60.205.48.122&#xff08;IP地址为自己注册的阿里云账号上的IP地址&#xff09; 进入以后登录自己的账号 用户名&#x…...

阿里云oss文件服务器

目录1.后台提供OSS签名API1.1.OSS参数配置1.2.签名接口2.后台提供OSS签名API2.1.上传组件2.2. JS获取签名1.后台提供OSS签名API 1.1.OSS参数配置 file:alicloud:bucket-name: itsource-hrm #上传空间bucketaccess-key: LTAI4GBU4kV67teSKSzkKpxN #你的keysecret-key: 0f9Djm2…...

阿里云漏洞验证需要付费的解决方法

阿里云服务器提示漏洞&#xff0c;修复需要付费&#xff0c;验证需要付费&#xff0c;是因为阿里云帮你解决漏洞&#xff0c;收费也是应该的。咱们今天说的是免费解决方法。新用户会给个七天的免费修复验证&#xff0c;七天后就不能试用 咱们现在说非七天试用。 1、 修复漏洞&…...

阿里云添加管理员用户进行协作

阿里云怎么添加管理员来协助工作呢&#xff1f; 1.首先进入你的主账号&#xff0c;点击右上方的选项控制台&#xff0c;然后把鼠标放到右上角的头像上&#xff0c;会出现如下图的列表&#xff1a; 2.点击访问控制&#xff0c;进入并开启访问控制 RAM 3.在用户管理界面进行新建用…...

使用阿里云日志服务

主要采集的服务有&#xff1a; 1、nginx服务访问日志 2、服务端后台&#xff08;java&#xff09;总输出日志打印 3、服务端后台&#xff08;java&#xff09;错误日志打印本次主要讲解第二和第三种服务端日期输出1、nginx日志采集使用这个 2、服务端日志采集使用这个正则-文本…...

在阿里云服务器上搭建MQTT服务

在云服务器中搭建MQTT 文章目录在云服务器中搭建MQTT前言一、安装mosquitto二、配置1.不允许匿名访问2.可以匿名访问云服务器的配置mosquitto 的基本命令三 查看于测试连接、发布、订阅前言 MQTT&#xff08;Message Queuing Telemetry Transport&#xff0c;消息队列遥测传输协…...

阿里云服务器后台运行服务

xshell连接阿里云服务器下载东西的时候总是中断&#xff1a; 1&#xff09;可采用的一个方法&#xff0c;将命令换为&#xff1a; nohup git clone https://github.com/apache/flink.git >log.txt && &#xff1a; 指在后台运行nohup &#xff1a; 不挂断的运行&a…...

阿里云服务器搭建后台(Ubuntu)

前两天申请了阿里云服务器&#xff0c;开始了漫长的搭建服务器摸索之路&#xff0c;中间出现过太多的bug&#xff0c;为了大家可以少走弯路&#xff0c;将自己的方法和截图贴出来。正好有很多步骤只是为了验证&#xff0c;让服务器很乱&#xff0c;我也重新做一遍也好总结一下。…...

Jar包阿里云服务器后台运行

Jar包阿里云服务器后台运行 1、方法一 nohup java -jar xxx.jar &&&#xff1a;使用&命令后&#xff0c;作业被提交到后台运行&#xff0c;当前控制台没有被占用&#xff0c;但是一但把当前控制台关掉(退出帐户时)&#xff0c;作业就会停止运行。 nohub&#xf…...

阿里云后台部署全过程-1-云服务申请与配置

本文已收录至我的个人网站&#xff1a;阿里云后台部署全过程-1-云服务申请与配置 本系列文章&#xff0c;将分享我部署阿里云后台的整个过程&#xff0c;从云服务器的申请&#xff0c;到整个环境的搭建测试&#xff0c;再到域名的购买和ICP备案、网安备案&#xff0c;我都将进…...

阿里云后台部署全过程-6-HTTPS原理及配置

本文已收录至我的个人网站&#xff1a;阿里云后台部署全过程-6-HTTPS原理及配置 简介 web应用的网络通信&#xff0c;一般是基于HTTP协议&#xff0c;HTTP协议处于应用层&#xff0c;基于TCP/IP协议&#xff0c;又在其之上。 HTTP协议的一个特性是明文传输&#xff0c;这就决…...

微信小程序统一服务消息接口

微信小程序统一服务消息接口 公众号和小程序消息都可以在一个接口推送 统一服务消息下发接口&#xff0c;就是这个接口可以发送公众号或者小程序的消息。 之前小程序发送消息&#xff0c;有小程序的 api 接口&#xff0c;如果是发送公众号的消息&#xff0c;就有公众号的模板消…...

小程序接口签名及PHP验签

签名算法 所有参数按字典序排序后用&连接&#xff0c;然后拼接上&keyvalue,做MD5 小程序生成签名 sign.js var m require("./md5.js");function sort(data) {var keys Object.keys(data).sort();var result {};for(var i 0; i < keys.length; i){…...

小程序接口对接

wx.request({url: https://api.changching.cn/api/v4/sermanstars/,method: POST,header: {Accept: "*/*",Authorization: Token userInfo.thirdkey ,userid userInfo.id,},data: {userid: userInfo.id,sermanid: that.data.sermenid,star: score,},success: fu...

职场的边界感、底线原则与陷阱

引言 职场的边界感&#xff0c;是一个很玄的概念。 在互联网公司&#xff0c;如果一个人对工作边界感过于重视&#xff0c;对自己的职责范围划定的非常清晰&#xff0c;很容易被批评“边界感过强”&#xff0c;如果领导也对自己有这样的评价&#xff0c;往往与晋升无缘。但如果…...

2022年个人学习年度计划

1.掌握Python 2.掌握MySQL 3.了解R语言...

UE4个人学习知识点记录1

UE4个人学习知识点记录1 自定义游戏模式和角色蓝图 创建游戏模式 创建角色蓝图 调整角色蓝图 添加映射 编写蓝图 测试结果...