多个springboot整合使用rabbitmq(使用注解的方式)
一、简述
先参考单个springboot使用rabbitmq和了解rabbitmq的五种模式
单个springboot整合rabbitmq_java-zh的博客-CSDN博客
二、创建项目
1、先创建两个springboot项目,一个做生产者,一个做消费者
2、导包(生产者和消费者对应的内容都是一样)
<?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.4.1</version><relativePath/></parent><groupId>com.mq</groupId><artifactId>mqcloud</artifactId><version>0.0.1-SNAPSHOT</version><properties><spring-cloud-alibaba.version>2021.1</spring-cloud-alibaba.version><java.version>1.8</java.version><spring-boot.version>2.5.3</spring-boot.version><lombok.version>1.18.14</lombok.version><mybaits.plus.version>3.3.2</mybaits.plus.version><alibaba.json.version>1.2.75</alibaba.json.version><spring-cloud-starter-bootstrap.version>3.0.2</spring-cloud-starter-bootstrap.version></properties><!-- <dependencyManagement>--><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><!--AOP--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId></dependency><!--bootstrap 启动器--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-bootstrap</artifactId><version>${spring-cloud-starter-bootstrap.version}</version></dependency><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>${alibaba.json.version}</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>${lombok.version}</version><optional>true</optional></dependency><!--jjwt--><dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt</artifactId><version>0.9.0</version></dependency><dependency><groupId>com.google.guava</groupId><artifactId>guava</artifactId><version>31.1-jre</version></dependency><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId><version>${spring-cloud-alibaba.version}</version></dependency><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId><version>${spring-cloud-alibaba.version}</version></dependency><dependency><groupId>org.apache.commons</groupId><artifactId>commons-lang3</artifactId><version>3.12.0</version></dependency><!--zhong 基础jar--><dependency><groupId>com.common</groupId><artifactId>base</artifactId><version>1.0-SNAPSHOT</version></dependency><!--消息队列 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId><version>3.0.4</version></dependency></dependencies><!-- </dependencyManagement>--></project>
3、编写配置文件
这里的配置文件生产者和消费者都一样
spring:rabbitmq:#如果是集群,用,隔开connection-timeout: 15000username: adminpassword: 123456#虚拟host,可以不设置virtual-host: /listener:simple:acknowledge-mode: auto #manual:手动处理 auto:自动处理#消费端监听个数(即@RabbitListenter开启几个线程去处理)concurrency: 10#消费端监听的最大个数max-concurrency: 10prefetch: 5default-requeue-rejected: true #消费不成功的消息,拒绝入队retry:enabled: true #开启消息重试max-attempts: 4 #重试次数max-interval: 10000 #重试最大间隔时间initial-interval: 2000 #重试初始间隔时间#消息确认方式,通过correlated来确认publisher-confirm-type: correlatedpublisher-returns: truehost: 192.168.139.128port: 5672
rabbitmq:#订阅模式(扇形模式) fanout:exchange:#交换机名称name1: exchange.fanoutqueue:#通道名称name1: exchange.fanout.queue_1name2: exchange.fanout.queue_2#交换机模式 direct:exchange:name1: exchange.directqueue:name1: exchange.direct.queue_1name2: exchange.direct.queue_2routing:name1: exchange.direct.routing.1name2: exchange.direct.routing.2#主题模式 topic:exchange: name1: exchange.topicqueue:name1: exchange.topic.queue_1name2: exchange.topic.queue_2routing:name1: '#.routingkey.#'name2: routingkey.*
三、编码代码和测试结果
这里以rabbitmq的订阅模式(扇形模式)、路由器模式、主题模式为案例
3.1 扇形模式
生产者
@Autowired
private RabbitTemplate rabbitTemplate;// 订阅模式的交换机名称
@Value("${rabbitmq.fanout.exchange.name1}")private String exchangeName;/*** 订阅模式(扇形模式)生产者** @param context*/
@GetMapping("/fanout/{context}")
public void sendMessage(@PathVariable String context) {System.out.println("需要发送得内容为:" + context);rabbitTemplate.convertAndSend(exchangeName, "", context);
}
消费者
注意:消费者绑定交换机和通道的值必须是固定常量值,所以我们直接从配置文件中读取
@RabbitListener(bindings = @QueueBinding(exchange = @Exchange(value = "${rabbitmq.fanout.exchange.name1}", type = ExchangeTypes.FANOUT),value = @Queue(value = "${rabbitmq.fanout.queue.name1}")))@RabbitHandlerpublic void consumerFanoutExchange(String context) {System.out.println("订阅模式,通道一接收到的内容为内容:" + context);}@RabbitListener(bindings = @QueueBinding(exchange = @Exchange(value = "${rabbitmq.fanout.exchange.name1}", type = ExchangeTypes.FANOUT),value = @Queue(value = "${rabbitmq.fanout.queue.name2}")))@RabbitHandlerpublic void consumerFanoutExchange2(String context) {System.out.println("订阅模式,通道二接收到的内容为内容:" + context);
}
3.2 路由器模式
生产者
@Autowired
private RabbitTemplate rabbitTemplate;// 路由器模式的交换机名称
@Value("${rabbitmq.direct.exchange.name1}")
private String directName;// 路由器模式的路由key1
@Value("${rabbitmq.direct.routing.name1}")
private String directRoutingKeyName1;//路由器模式的路由key2
@Value("${rabbitmq.direct.routing.name2}")
private String directRoutingKeyName2;/*** 路由器模式* @param context* @param routingkey*/
@GetMapping("/direct")
public void sendMessageDirect(@RequestParam("context") String context, @RequestParam("routingkey") Integer routingkey) {if (1 == routingkey) {rabbitTemplate.convertAndSend(directName, directRoutingKeyName1, context);} else if (2 == routingkey) {rabbitTemplate.convertAndSend(directName, directRoutingKeyName2, context);} else {System.out.println("数据非法");}
}
消费者
@RabbitListener(bindings = @QueueBinding(exchange = @Exchange(value = "${rabbitmq.direct.exchange.name1}", type = ExchangeTypes.DIRECT),value = @Queue(value = "${rabbitmq.direct.queue.name1}"),key = "${rabbitmq.direct.routing.name1}"))public void exchangeDirectRoutingKey1(String context, Message message) {System.out.println("key1:" + message.getMessageProperties().getReceivedRoutingKey());System.out.println("路由器模式1 接收到的消息为:" + context);}@RabbitListener(bindings = @QueueBinding(exchange = @Exchange(value = "${rabbitmq.direct.exchange.name1}", type = ExchangeTypes.DIRECT),value = @Queue(value = "${rabbitmq.direct.queue.name2}"),key = "${rabbitmq.direct.routing.name2}"))public void exchangeDirectRoutingKey2(String context, Message message) {System.out.println("key2:" + message.getMessageProperties().getReceivedRoutingKey());System.out.println("路由器模式2 接收到的消息为" + context);}
3.3 主题模式
生产者
// 主题模式的交换机名称@Value("${rabbitmq.topic.exchange.name1}")private String topicName;//用来匹配主题模式对应的keypublic static final String EXCHANGE_TOPIC_CASE_KEY_1 = "topic.routingkey.case1";//如果case_key_2这样写,那么绑定case_key_1的队列一样会接收到,因为case_key_2也一样和key1匹配上public static final String EXCHANGE_TOPIC_CASE_KEY_2 = "routingkey.case2";@GetMapping("/topic")public void sendMessageTopic(@RequestParam("context") String context, @RequestParam("routingkey") Integer routingkey) {if (1 == routingkey) {rabbitTemplate.convertAndSend(topicName, EXCHANGE_TOPIC_CASE_KEY_1, context + routingkey);} else if (2 == routingkey) {rabbitTemplate.convertAndSend(topicName, EXCHANGE_TOPIC_CASE_KEY_2, context + routingkey);} else {System.out.println("数据非法");}}
消费者
@RabbitListener(bindings = @QueueBinding(exchange = @Exchange(value = "${rabbitmq.topic.exchange.name1", type = ExchangeTypes.TOPIC),value = @Queue(value = "${rabbitmq.topic.queue.name1}"),key = "${rabbitmq.topic.routing.name1}"))@RabbitHandlerpublic void exchangeTopicRoutingKey1(String context, Message message) {System.out.println("key1:"+message.getMessageProperties().getReceivedRoutingKey());System.out.println("主题模式1:接收的内容为:"+ context);}@RabbitListener(bindings = @QueueBinding(exchange = @Exchange(value = "${rabbitmq.topic.exchange.name1", type = ExchangeTypes.TOPIC),value = @Queue(value = "${rabbitmq.topic.queue.name2}"),key = "${rabbitmq.topic.routing.name2}"))@RabbitHandlerpublic void exchangeTopicRoutingKey2(String context, Message message) {System.out.println("key2:"+message.getMessageProperties().getReceivedRoutingKey());System.out.println("主题模式2:接收的内容为:"+ context);}
3.4 全量代码
生产者
@RestController
@RequiredArgsConstructor
@RequestMapping("/test/mq")
public class ProductController {private final RabbitTemplate rabbitTemplate;// 订阅模式的交换机名称@Value("${rabbitmq.fanout.exchange.name1}")private String exchangeName;// 路由器模式的交换机名称@Value("${rabbitmq.direct.exchange.name1}")private String directName;// 路由器模式的路由key1@Value("${rabbitmq.direct.routing.name1}")private String directRoutingKeyName1;//路由器模式的路由key2@Value("${rabbitmq.direct.routing.name2}")private String directRoutingKeyName2;// 主题模式的交换机名称@Value("${rabbitmq.topic.exchange.name1}")private String topicName;//用来匹配主题模式对应的keypublic static final String EXCHANGE_TOPIC_CASE_KEY_1 = "topic.routingkey.case1";//如果case_key_2这样写,那么绑定case_key_1的队列一样会接收到,因为case_key_2也一样和key1匹配上public static final String EXCHANGE_TOPIC_CASE_KEY_2 = "routingkey.case2";/*** 订阅模式(扇形模式)生产者** @param context*/@GetMapping("/fanout/{context}")public void sendMessage(@PathVariable String context) {System.out.println("需要发送得内容为:" + context);rabbitTemplate.convertAndSend(exchangeName, "", context);}/*** 路由器模式* @param context* @param routingkey*/@GetMapping("/direct")public void sendMessageDirect(@RequestParam("context") String context, @RequestParam("routingkey") Integer routingkey) {if (1 == routingkey) {rabbitTemplate.convertAndSend(directName, directRoutingKeyName1, context);} else if (2 == routingkey) {rabbitTemplate.convertAndSend(directName, directRoutingKeyName2, context);} else {System.out.println("数据非法");}}@GetMapping("/topic")public void sendMessageTopic(@RequestParam("context") String context, @RequestParam("routingkey") Integer routingkey) {if (1 == routingkey) {rabbitTemplate.convertAndSend(topicName, EXCHANGE_TOPIC_CASE_KEY_1, context + routingkey);} else if (2 == routingkey) {rabbitTemplate.convertAndSend(topicName, EXCHANGE_TOPIC_CASE_KEY_2, context + routingkey);} else {System.out.println("数据非法");}}
}
消费者
@Component
public class ConsumerTest {@RabbitListener(bindings = @QueueBinding(exchange = @Exchange(value = "${rabbitmq.fanout.exchange.name1}", type = ExchangeTypes.FANOUT),value = @Queue(value = "${rabbitmq.fanout.queue.name1}")))@RabbitHandlerpublic void consumerFanoutExchange(String context) {System.out.println("订阅模式,通道一接收到的内容为内容:" + context);}@RabbitListener(bindings = @QueueBinding(exchange = @Exchange(value = "${rabbitmq.fanout.exchange.name1}", type = ExchangeTypes.FANOUT),value = @Queue(value = "${rabbitmq.fanout.queue.name2}")))@RabbitHandlerpublic void consumerFanoutExchange2(String context) {System.out.println("订阅模式,通道二接收到的内容为内容:" + context);}@RabbitListener(bindings = @QueueBinding(exchange = @Exchange(value = "${rabbitmq.direct.exchange.name1}", type = ExchangeTypes.DIRECT),value = @Queue(value = "${rabbitmq.direct.queue.name1}"),key = "${rabbitmq.direct.routing.name1}"))public void exchangeDirectRoutingKey1(String context, Message message) {System.out.println("key1:" + message.getMessageProperties().getReceivedRoutingKey());System.out.println("路由器模式1 接收到的消息为:" + context);}@RabbitListener(bindings = @QueueBinding(exchange = @Exchange(value = "${rabbitmq.direct.exchange.name1}", type = ExchangeTypes.DIRECT),value = @Queue(value = "${rabbitmq.direct.queue.name2}"),key = "${rabbitmq.direct.routing.name2}"))public void exchangeDirectRoutingKey2(String context, Message message) {System.out.println("key2:" + message.getMessageProperties().getReceivedRoutingKey());System.out.println("路由器模式2 接收到的消息为" + context);}@RabbitListener(bindings = @QueueBinding(exchange = @Exchange(value = "${rabbitmq.topic.exchange.name1", type = ExchangeTypes.TOPIC),value = @Queue(value = "${rabbitmq.topic.queue.name1}"),key = "${rabbitmq.topic.routing.name1}"))@RabbitHandlerpublic void exchangeTopicRoutingKey1(String context, Message message) {System.out.println("key1:"+message.getMessageProperties().getReceivedRoutingKey());System.out.println("主题模式1:接收的内容为:"+ context);}@RabbitListener(bindings = @QueueBinding(exchange = @Exchange(value = "${rabbitmq.topic.exchange.name1", type = ExchangeTypes.TOPIC),value = @Queue(value = "${rabbitmq.topic.queue.name2}"),key = "${rabbitmq.topic.routing.name2}"))@RabbitHandlerpublic void exchangeTopicRoutingKey2(String context, Message message) {System.out.println("key2:"+message.getMessageProperties().getReceivedRoutingKey());System.out.println("主题模式2:接收的内容为:"+ context);}}
相关文章:
多个springboot整合使用rabbitmq(使用注解的方式)
一、简述 先参考单个springboot使用rabbitmq和了解rabbitmq的五种模式 单个springboot整合rabbitmq_java-zh的博客-CSDN博客 二、创建项目 1、先创建两个springboot项目,一个做生产者,一个做消费者 2、导包(生产者和消费者对应的内容都是一样) <…...
《Effective C++中文版,第三版》读书笔记2
条款06:若不想使用编译器自动生成的函数,就该明确拒绝 为驳回编译器自动()提供的机能,可将相应的成员函数声明为私有的,同时不实现它。 #include <iostream>class MyClass { public:MyClass(int in…...
虫情测报系统的工作原理及功能优势
KH-CQPest虫情测报系统能够在不对虫体造成任何破坏的情况下,无公害的杀死虫子,利用高倍显微镜和高清摄像头拍摄虫体照片,并将虫体照片发送到远端平台,让工作人员无需要到现场,通过平台就可以观察害虫的种类和数量&…...
UWB定位技术详细介绍
UWB(Ultra-Wideband)定位技术是一种通过利用信号的超宽频带特性进行高精度定位的技术。其原理是通过测量信号在空间传播中的时间延迟差异来计算物体的位置。 UWB技术与传统无线通信技术不同,它利用非常宽的频带进行通信,通常超过…...
PiplineADC学习一:
PiplineADC结构: PiplineADC起源之FlashADC PiplineADC起源之Sub-Ranging-ADC 比较器存在失调: 因此每级1bit不实用,需要做冗余位设计。 多比较一次,两个阈值,三个区间,分别对于输出00,01,10。正常2bit应该…...
Linux elasticsearch设置为开机自启动服务
Linux elasticsearch怎么设置为设置为开机自启动服务 1、进入/etc/init.d目录 cd /etc/init.d 2、新建文件elasticsearch,注意,没有扩展名 vi elasticsearch 3、新建文件elasticsearch的内容如下 说明: (1)“su…...
WinForm内嵌Unity3D
Unity3D可以C#脚本进行开,使用vstu2013.msi插件,可以实现在VS2013中的调试。在开发完成后,由于项目需要,需要将Unity3D嵌入到WinForm中。WinForm中的UnityWebPlayer Control可以载入Unity3D。先看效果图。 一、为了能够动态设置ax…...
关于vue中v-for绑定数据重新渲染的问题
我修改被v-for绑定的数据,发现居然不能重新渲染。 查找后得知一下方法: $set 是 Vue 提供的一个全局方法,用于向响应式对象中添加或更新属性,并触发视图更新。它接受三个参数:对象、要添加/更新的属性名或索引,以及新…...
全面解析 Axios 请求库的基本使用方法
Axios 是一个流行的基于 Promise 的 HTTP 请求库,用于在浏览器和 Node.js 中进行 HTTP 请求。它提供了简单易用的 API,可以发送各种类型的请求(如 GET、POST、PUT、DELETE等),并处理响应数据,Axios 在前端工…...
rust踩雷笔记3——生命周期的理解
目录 概念和基本使用一个例子彻底理解最基本的内容 一个例子理解函数签名为什么要有生命周期标注⭐️能不能对编译器蒙混过关? 生命周期是rust中最难的概念——鲁迅 这一块内容即便是看rust圣经,第一遍也有点懵。今天早上二刷突然有了更直观的认识&…...
windows权限维持—黄金白银票据隐藏用户远控RustDeskGotoHttp
windows权限维持—黄金白银票据&隐藏用户&远控&RustDesk&GotoHttp 1. 前置1.1. 初始问题1.1.1. 解决办法 2. 隐藏用户2.1. 工具原理2.2. 案例操作2.2.1. 单机添加用户2.2.1.1. 工具添加用户2.2.1.2. 工具查看隐藏用户2.2.1.3. 本地查看隐藏用户 2.2.2. 域内添加…...
vscode conda activate激活环境出错
vscode conda activate 出错 conda-script.py: error: argument COMMAND: invalid choice: ‘activate’ To initialize your shell, run$ conda init <SHELL_NAME>Currently supported shells are:- bash- fish- tcsh- xonsh- zsh- powershellSee conda init --help f…...
信息与通信工程面试准备——数学知识|正态分布|中心极限定理
目录 正态分布 正态分布的参数 正态分布的第一个参数是均值 正态分布的第二个参数是标准差SD 所有正态分布的共同特征 标准正态分布:正态分布的特例 中心极限定理 理解定义 示例# 1 示例# 2 知道样本均值总是正态分布的实际含义是什么? 正态分…...
Mybatis多表查询与动态SQL的使用
目录 1. Mybatis多表查询 1.1 添加文章表实体类 1.2 文章Interface 1.3 文章.xml 1.4 lombok的toString()有关对象打印的说明 1.5 场景: 一个用户查询多篇文章 2. 复杂情况: 动态SQL的使用 2.1 为什么要使用动态SQL? 2.2 <if>标签 2.3 <trim>标签 2.4 <where&g…...
url 和 uri 有什么区别?
URL(Uniform Resource Locator)和URI(Uniform Resource Identifier)是两个与网络资源定位和标识相关的概念,它们有一些区别,但也存在一些重叠。 URI(Uniform Resource Identifier)是…...
HCIP VLAN实验
VLAN实验 拓扑图配置和分析分析配置LSW1LSW2R1 测试dhcp获取ipICMP测试 拓扑图 配置和分析 分析 从题目来看,因为 pc 1 3都是vlan2而且还是不同网段,pc 2 4 5 6在同一网段,所以可以将pc 1 2 5 4 6分在一个网段 pc4不通5 6 ,那就…...
无涯教程-Perl - waitpid函数
描述 该函数等待ID为PID的子进程终止,返回已故进程的进程ID。如果PID不存在,则返回-1。进程的退出状态包含在$?中。 可以将标志设置为各种值,这些值等于waitpid()UNIX系统调用使用的值。 FLAGS的值为0应该在支持进程的所有操作系统上工作。 语法 以下是此函数的简单语法- …...
Redis之缓存雪崩、缓存击穿、缓存穿透问题
文章目录 前言一、缓存雪崩1.1、原因分析2.2、常用解决方案 二、缓存击穿2.1、原因分析2.2、常用解决方案2.2.1、使用互斥锁2.2.2、逻辑过期方案2.3、方案对比 三、缓存穿透3.1、原因分析3.2、解决方案3.2.1、缓存空对象3.2.3、布隆过滤3.3、方案对比 总结 前言 本文谈谈Redis…...
九五从零开始的运维之路(其三十五)
文章目录 前言一、概述1.概念2.组成3.特点4.工作原理5.优点: 二、各节点及其ip地址三、构建MHA1.ssh免密登录2.构建mysql主从复制(一)安装mariadb数据库并启动(二)master服务器(三)slave服务器&…...
5G科技防汛,助力守护一方平安
“立秋虽已至,炎夏尚还在”,受台风席卷以及季节性影响全国多地正面临强降水的严峻挑战。“落雨又顺秋,绵绵雨不休”,正值“七下八上” 防汛关键时期,贵州省水文水资源局已全面进入备战状态。 为确保及时响应做好防汛抢…...
SkyWalking 10.2.0 SWCK 配置过程
SkyWalking 10.2.0 & SWCK 配置过程 skywalking oap-server & ui 使用Docker安装在K8S集群以外,K8S集群中的微服务使用initContainer按命名空间将skywalking-java-agent注入到业务容器中。 SWCK有整套的解决方案,全安装在K8S群集中。 具体可参…...
【入坑系列】TiDB 强制索引在不同库下不生效问题
文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...
PPT|230页| 制造集团企业供应链端到端的数字化解决方案:从需求到结算的全链路业务闭环构建
制造业采购供应链管理是企业运营的核心环节,供应链协同管理在供应链上下游企业之间建立紧密的合作关系,通过信息共享、资源整合、业务协同等方式,实现供应链的全面管理和优化,提高供应链的效率和透明度,降低供应链的成…...
多模态商品数据接口:融合图像、语音与文字的下一代商品详情体验
一、多模态商品数据接口的技术架构 (一)多模态数据融合引擎 跨模态语义对齐 通过Transformer架构实现图像、语音、文字的语义关联。例如,当用户上传一张“蓝色连衣裙”的图片时,接口可自动提取图像中的颜色(RGB值&…...
ffmpeg(四):滤镜命令
FFmpeg 的滤镜命令是用于音视频处理中的强大工具,可以完成剪裁、缩放、加水印、调色、合成、旋转、模糊、叠加字幕等复杂的操作。其核心语法格式一般如下: ffmpeg -i input.mp4 -vf "滤镜参数" output.mp4或者带音频滤镜: ffmpeg…...
DBAPI如何优雅的获取单条数据
API如何优雅的获取单条数据 案例一 对于查询类API,查询的是单条数据,比如根据主键ID查询用户信息,sql如下: select id, name, age from user where id #{id}API默认返回的数据格式是多条的,如下: {&qu…...
解决本地部署 SmolVLM2 大语言模型运行 flash-attn 报错
出现的问题 安装 flash-attn 会一直卡在 build 那一步或者运行报错 解决办法 是因为你安装的 flash-attn 版本没有对应上,所以报错,到 https://github.com/Dao-AILab/flash-attention/releases 下载对应版本,cu、torch、cp 的版本一定要对…...
零基础设计模式——行为型模式 - 责任链模式
第四部分:行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习!行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想:使多个对象都有机会处…...
R语言速释制剂QBD解决方案之三
本文是《Quality by Design for ANDAs: An Example for Immediate-Release Dosage Forms》第一个处方的R语言解决方案。 第一个处方研究评估原料药粒径分布、MCC/Lactose比例、崩解剂用量对制剂CQAs的影响。 第二处方研究用于理解颗粒外加硬脂酸镁和滑石粉对片剂质量和可生产…...
【分享】推荐一些办公小工具
1、PDF 在线转换 https://smallpdf.com/cn/pdf-tools 推荐理由:大部分的转换软件需要收费,要么功能不齐全,而开会员又用不了几次浪费钱,借用别人的又不安全。 这个网站它不需要登录或下载安装。而且提供的免费功能就能满足日常…...
