宋子宪博客 - Spring Boot
type: channel
link: https://www.songzixian.com/tag/Spring-Boot
items: Spring Boot整合Redisson实现分布式锁
items: Spring Boot整合ZXing实现二维码和条形码生成
items: Spring Boot 优雅进行数据脱敏
items: 在Linux中部署和管理Spring Boot应用脚本教程
items: Spring Boot优雅实现注解切换多数据源
items: Java整合Jsch实现SFTP连接对服务器文件增删改查操作
items: Spring Boot启动jar包动态添加配置文件参数
items: spring boot整合WebSocket实现群聊功能 通俗易懂教程
items: Spring Boot整合RocketMQ实现延迟消息消费
items: spring boot项目使用maven插件将项目和jar包依赖以及静态资源分离打包

Spring Boot整合Redisson实现分布式锁
type: item
date: 2023-12-25T21:35:00+08:00
description: Redisson的分布式锁解决的问题并发控制：在分布式系统中，多个节点可能同时操作同一个资源，引起数据不一致。分布式锁确保在任一时刻，只有一个节点可以操作该资源。数据同步：通过锁机制，可以同步不同节点间对共享资源的访问，保证数据的一致性。避免死锁和减少阻塞死锁问题：Redisson的分布式锁实现中，如果锁已被其他线程持有，当前线程会等待直到锁被释放。Redisson提供了锁的超时机制，可以防止永久等待，从而降低死锁发生的风险。阻塞问题：分布式锁可能会导致线程阻塞，特别是在高并发环境下。Redisson允许自定义等待和持锁时间，以此减少阻塞时间。Redisson还提供了tryLock方法，它可以在无法立即获取锁时返回，从而避免长时间阻塞。环境准备添加依赖：在Spring Boot项目的pom.xml文件中添加Redisson依赖。<dependency> <groupId>org.redisson</groupId> <artifactId>redisson-spring-boot-starter</artifactId> <version>3.25.2</version> </dependency>配置Redisson配置文件设置：在application.yml或application.properties中配置Redisson。示例application.yml配置：spring: redis: host: 127.0.0.1 # Redis服务器地址 port: 6379 # Redis服务器端口 password: 12345678 # Redis密码，如果没有设置密码，则此项可以省略使用Redisson注入RedissonClient：在Spring Boot应用中，可以直接注入RedissonClient。/** * 自动注入RedissonClient */ @Autowired private RedissonClient redissonClient;操作Redis数据结构：使用注入的RedissonClient操作Redis。// 操作Redis中的Map @GetMapping("/setValue") public String setValue() { // 获取Redis Map RMap<String, String> map = redissonClient.getMap("myMap"); // 向Map中添加数据 map.put("key", "value"); return "Value set"; } @GetMapping("/getValue") public String getValue() { // 获取Redis Map RMap<String, String> map = redissonClient.getMap("myMap"); // 从Map中获取数据 return "Value: " + map.get("key"); }高级特性分布式服务：利用Redisson实现分布式锁、同步器等。@GetMapping("/lock") public String lockResource() { String orderId = "12345"; // 假设这是一个订单号 RLock lock = redissonClient.getLock("orderLock:" + orderId); // 根据订单号动态生成锁名称 // 加锁 lock.lock(); try { // 执行业务操作 } finally { // 释放锁 lock.unlock(); } return "Resource locked and unlocked"; }以上是Redisson与Spring Boot整合使用的基本方法和步骤。这种整合方式允许您在Spring Boot应用中轻松地利用Redisson提供的高级特性，如分布式数据结构和服务，特别是在处理分布式锁和并发控制方面。如果您在实践中遇到任何问题或有更多的疑问，欢迎随时提问和探讨。锁的自动续租（Watchdog）机制默认行为：当一个服务获取锁之后，Redisson内部的watchdog会自动启动。如果服务持续运行，watchdog会定期（默认每10秒）向Redis发送命令，以维持锁的持有时间。如果锁的持有者服务宕机或无法续租锁（例如因为网络问题），锁会在最后一次成功续租后的30秒内自动释放。自定义锁过期时间：可以在获取锁时指定锁的过期时间，这会覆盖默认的30秒设置。示例以下是获取锁并设置自定义过期时间的示例：RLock lock = redissonClient.getLock("someLock"); try { // 尝试获取锁，…

Spring Boot整合ZXing实现二维码和条形码生成
type: item
date: 2023-12-18T11:30:00+08:00
description: 1. 添加ZXing依赖到Spring Boot项目场景描述: 在需要快速、高效地生成二维码或条形码的应用中，如电子票务、产品追踪、个人身份验证等，集成ZXing库至Spring Boot项目是至关重要的一步。在项目的pom.xml文件中添加以下依赖以引入ZXing库：xmlCopy code<dependencies> <dependency> <groupId>com.google.zxing</groupId> <artifactId>core</artifactId> <version>3.5.2</version> </dependency> </dependencies>使用最新版本的ZXing库可以确保你的应用具备最新的二维码和条形码生成能力，包括更好的性能和支持更多格式。2. 创建二维码生成服务场景描述: 此服务类适用于需要将URL、文本信息或其他数据快速转换为二维码图像的场合，如商业广告、社交媒体共享、安全验证等。代码示例与注释:import com.google.zxing.BarcodeFormat; import com.google.zxing.EncodeHintType; import com.google.zxing.MultiFormatWriter; import com.google.zxing.common.BitMatrix; import javax.imageio.ImageIO; import java.awt.*; import java.awt.image.BufferedImage; import java.io.File; import java.util.HashMap; import java.util.Map; /** * 生成二维码图像类 * * @author songzixian */ public class QRCodeService { /** * 生成二维码图像 * * @param text 要编码的文本 * @param width 二维码图像宽度 * @param height 二维码图像高度 * @param filePath 文件存储路径 * @return 生成的二维码图像的字节数组 */ public void generateQRCode(String text, int width, int height, String filePath) { try { // 定义二维码参数 Map<EncodeHintType, Object> hints = new HashMap<>(); // 设置字符编码 hints.put(EncodeHintType.CHARACTER_SET, "UTF-8"); // 错误纠正级别 hints.put(EncodeHintType.ERROR_CORRECTION, com.google.zxing.qrcode.decoder.ErrorCorrectionLevel.H); // 二维码边距 hints.put(EncodeHintType.MARGIN, 1); // 使用QRCodeWriter生成二维码矩阵信息 MultiFormatWriter writer = new MultiFormatWriter(); BitMatrix bitMatrix = writer.encode(text, BarcodeFormat.QR_CODE, width, height, hints); // 将二维码矩阵信息转换为图像 BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); for (int x = 0; x < width; x++) { for (int y = 0; y < height; y++) { image.setRGB(x, y, bitMatrix.get(x, y) ? Color.BLACK.getRGB() : Color.WHITE.getRGB()); } } // 江二维码保存成文件 File qrCodeFile = new File(filePath); ImageIO.write(image, "png", qrCodeFile); System.out.println("二维码生成成功: " + filePath); } catch (Exception e) { e.printStackTrace(); } } /** * 测试 */ public static void main(String[] args) { QRCodeServi…

Spring Boot 优雅进行数据脱敏
type: item
date: 2023-09-24T19:59:00+08:00
description: 文详细解析在Spring Boot应用中优雅地脱敏敏感信息，如手机号、邮箱、身份证等，使用的是Jackson库中的JsonSerializer。1. 创建自定义脱敏序列化器首先，创建一个继承自JsonSerializer<String>的序列化器。以MobileSerializer为例，代码如下：import cn.hutool.core.util.DesensitizedUtil; import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.databind.JsonSerializer; import com.fasterxml.jackson.databind.SerializerProvider; import java.io.IOException; /** * * 自定义手机序列号器 * * * @author snogzixian * @since 2023-09-24 */ public class MobileSerializer extends JsonSerializer<String> { /** * 自定义序列化方法，用于对手机号进行脱敏处理并写入JSON生成器。 * * @param mobile 要序列化的手机号 * @param jsonGenerator JSON生成器，用于写入序列化后的数据 * @param serializerProvider 序列化提供者，提供序列化所需的服务 * @throws IOException 如果在序列化过程中发生I/O错误 */ @Override public void serialize(String mobile, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException { // 检查手机号是否为null或者是否是有效的手机号 if (mobile == null || !isValidMobile(mobile)) { // 如果手机号无效，直接输出原始手机号 jsonGenerator.writeString(mobile); return; } // 调用脱敏工具类对手机号进行脱敏处理 String mobileDesensitized = DesensitizedUtil.mobilePhone(mobile); // 将脱敏后的手机号字符串写入到JSON生成器jsonGenerator中 jsonGenerator.writeString(mobileDesensitized); } /** * 检查手机号的合法性 * * @param mobile 手机号 * @return 如果手机号合法则返回true，否则返回false */ private boolean isValidMobile(String mobile) { // 在此处添加对手机号合法性的检查逻辑 return true; } }其中，serialize方法用于处理数据的脱敏逻辑，isValidMobile用于检查数据的合法性。2. 使用自定义序列化器在实体类中，使用@JsonSerialize注解指定字段使用自定义序列化器。例如，对于一个用户的手机号，我们在实体类中如下使用：/** * * 实体类 * * * @author snogzixian * @since 2023-09-24 */ public class User { @JsonSerialize(using = MobileSerializer.class) private String mobile; // 其他字段和getter、setter }3. 扩展性 - 支持多类型数据脱敏为支持多类型数据（如邮箱、身份证等）脱敏，你可以为每种数据类型创建对应的序列化器类，类似于MobileSerializer。例如，创建一个EmailSerializer处理邮箱脱敏：public class EmailSerializer extends JsonSerializer<String> { // 实现邮箱的脱敏逻辑 }在实体类中，对应字段使用@JsonSerialize注解指定使用EmailSerializer。public class User { @JsonSerialize(using = EmailSerializer.class) private String email; // 其他字段和getter、setter }

在Linux中部署和管理Spring Boot应用脚本教程
type: item
date: 2023-08-11T11:20:00+08:00
description: Spring Boot是Java的一个流行框架，用于开发企业级应用程序。本脚本可以在Linux服务器上部署Spring Boot应用，并通过一个脚本实现启动、停止、重启等操作,本脚本由博主亲自编写和测试没问题,请方式使用。步骤1: 准备环境确保你的Linux服务器上已经安装了合适版本的Java。通过运行java -version来验证。步骤2: 上传你的JAR文件将你的Spring Boot应用的JAR文件上传到服务器上的某个目录，例如/opt/myapp/myapp.jar。步骤3: 创建管理脚本在Linux服务器上创建一个新文件，例如szxblog.sh，并粘贴以下内容：#!/bin/bash # 公共路径 BASE_PATH="/usr/local/java/jar/api-service" # 应用名称(就是jar包名称,不包含后缀) JAR_NAME="api-service" # 定义JAR文件的路径 JAR_PATH="$BASE_PATH/$JAR_NAME.jar" # 1.定义Java虚拟机的选项,初始化值大小需要一样,减少fu gc频率,降低波动 # 2.添加-XX:+HeapDumpOnOutOfMemoryError参数 JAVA_OPTS="-Xms2048m -Xmx2048m -XX:+HeapDumpOnOutOfMemoryError" # 定义PID文件的路径 自定义用法 PID_PATH="/usr/local/java/jar/api-service/$JAR_NAME.pid" # 定义日志文件的路径 LOG_PATH="$BASE_PATH/$JAR_NAME.log" start() { # 检查是否已运行 if [ -f $PID_PATH ] && ps -p $(cat $PID_PATH) > /dev/null; then echo "应用程序已经在运行。" exit 0 fi # 启动应用 echo "开始启动应用程序" nohup java $JAVA_OPTS -jar $JAR_PATH > $LOG_PATH 2>&1 & echo $! > $PID_PATH # 检查应用是否启动 sleep 5 # 等待一些秒来确保应用有时间启动 if ps -p $(cat $PID_PATH) > /dev/null; then echo "应用程序启动成功." else echo "应用程序启动失败." exit 1 fi } stop() { # 检查是否正在运行 if [ ! -f $PID_PATH ] || ! ps -p $(cat $PID_PATH) > /dev/null; then echo "应用程序没有在运行。" exit 0 fi # 停止应用 echo "开始停止应用程序." SIGNAL=${2:-15} # 默认信号是SIGTERM (15)，除非指定了其他信号 kill -${SIGNAL} $(cat $PID_PATH) rm $PID_PATH echo "应用程序已停止成功." } restart() { SIGNAL=${1:-15} # 使用第一个参数作为停止信号，默认为SIGTERM (15) stop $SIGNAL start } # 基于命令行参数执行相应操作 case $1 in start) start ;; stop) stop $2 ;; restart) restart $2 # 仅传递停止信号给restart函数 ;; *) echo "用法: $0 {start|stop|restart} [信号]" exit 1 ;; esac # 使用命令示例： # 启动应用: ./script.sh start # 停止应用: ./script.sh stop # 重启应用: ./script.sh restart请确保修改JAR_PATH、JAVA_OPTS、PID_PATH和LOG_PATH等变量的值，以匹配你的具体情况。步骤4: 赋予脚本执行权限在终端中，导航到脚本所在的目录，并运行以下命令赋予执行权限：chmod +x szxblog.sh步骤5: 使用脚本管理应用你现在可以使用以下命令来启动、停止和重启你的Spring Boot应用：启动: ./szxblog.sh start停止: ./szxblog.shh stop重启: ./szxblog.sh restart结论这个脚本提供了一个简单而强大的方法来管理你的Spring Boot应用程序。通过修改几个关键的变量，你可以轻松地将其适应到你自己的项目中。

Spring Boot优雅实现注解切换多数据源
type: item
date: 2023-03-15T11:36:00+08:00
description: 请帮我完善这篇文档,并且里面的代码添加注释实现注解切换多数据源需要以下步骤：1.首先添加了AOP、MyBatis、Druid和MySQL的依赖。 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>2.2.0</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spring-boot-starter</artifactId> <version>1.2.6</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.27</version> </dependency>2.配置两个数据源，一个是master，一个是slave，同时设置了Druid连接池的参数，以及MyBatis的相关配置。spring: datasource: druid: defaultAutoCommit: true initialSize: 5 maxActive: 20 maxWait: 60000 minIdle: 5 testOnBorrow: false testOnReturn: false testWhileIdle: true timeBetweenEvictionRunsMillis: 60000 validationQuery: SELECT 1 FROM DUAL filters: stat,wall,log4j2 connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000 master: url: jdbc:mysql://localhost:3306/master?useUnicode=true&characterEncoding=utf-8&useSSL=false username: root password: root driver-class-name: com.mysql.jdbc.Driver slave: url: jdbc:mysql://localhost:3306/slave?useUnicode=true&characterEncoding=utf-8&useSSL=false username: root password: root driver-class-name: com.mysql.jdbc.Driver mybatis: mapper-locations: classpath:mapper/*.xml type-aliases-package: com.example.demo.entity configuration: map-underscore-to-camel-case: true3.创建一个枚举类，用于区分不同的数据源。/** * * 枚举类，用于区分不同的数据源 * * * @author snogzixian * @Url 宋子宪博客 www.songzixian.com * @since 2023-03-15 */ public enum DataSourceType { /** * 主数据源 */ MASTER("master"), /** * 从数据源 */ SLAVE("slave"); private final String value; DataSourceType(String value) { this.value = value; } public String getValue() { return value; } }4.创建一个注解类，用于标识需要使用哪个数据源。import com.songzixian.enums.DataSourceType; import java.lang.annotation.*; /** * * 注解类，用于标识需要使用哪个数据源 * * * @author snogzixian * @Url 宋子宪博客 www.songz…

Java整合Jsch实现SFTP连接对服务器文件增删改查操作
type: item
date: 2023-03-13T15:37:00+08:00
description: 我们在开发中，有时候需要操作服务器上的文件，Spring Boot可以使用JSch库来连接SFTP并进行操作服务器上的文件读写。创建一个SFTP连接需要以下步骤：1.创建JSch对象2.使用JSch对象创建Session对象3.使用Session对象连接到SFTP服务器4.打开SFTP通道5.使用SFTP通道打开SFTP连接1.添加依赖在pom.xml文件中添加以下依赖：<dependency> <groupId>com.jcraft</groupId> <artifactId>jsch</artifactId> <version>0.1.55</version> </dependency>2.创建SftpConfig配置类import lombok.Getter; import lombok.Setter; /** * * SFTP连接参数配置类 * description: 如果后续只需要操作一台固定不变的服务器,可以从配置文件中读取 * * * @author snogzixian * @Url 宋子宪博客 www.songzixian.com * @since 2023-03-13 */ @Setter @Getter public class SftpConfig { /** * SFTP服务器地址 */ private String host; /** * SFTP服务器端口 */ private int port; /** * SFTP服务器用户名 */ private String username; /** * SFTP服务器密码 如果不使用密码方式则留空 */ private String password; /** * 密钥文件路径，如果不使用密钥连接则留空 */ private String privateKeyPath; /** * 密钥文件口令，如果不使用密钥连接则留空 */ private String passphrase; /** * 连接SFTP服务器超时时间 2秒 */ private Integer sessionConnectTimeoutTime = 2000; /** * 打开通道超时时间 2秒 */ private Integer channelSftpConnectTimeoutTime = 2000; /** * 密码方式连接方法 * * @param host SFTP服务器地址 * @param port SFTP服务器端口 * @param username SFTP服务器用户名 * @param password SFTP服务器密码 如果不使用连接则留空 */ public SftpConfig(String host, int port, String username, String password) { this.host = host; this.port = port; this.username = username; this.password = password; } /** * 秘钥方式连接方法 * * @param host SFTP服务器地址 * @param port SFTP服务器端口 * @param username SFTP服务器用户名 * @param privateKeyPath 密钥文件路径，如果不使用密钥连接则留空 * @param passphrase 密钥文件口令，如果不使用密钥连接则留空 */ public SftpConfig(String host, int port, String username,String privateKeyPath, String passphrase) { this.host = host; this.port = port; this.username = username; this.privateKeyPath = privateKeyPath; this.passphrase = passphrase; } }3.创建SFTP操作工具类import com.jcraft.jsch.*; import com.risk.riskControl.config.SftpConfig; import java.io.*; import java.util.List; import java.util.stream.Collectors; import java.util.stream.Stream; /** * * SFTP操作工具类 * * * @author snogzixian * @Url 宋子宪博客 www.songzixian.com * @since 2023-03-1…

Spring Boot启动jar包动态添加配置文件参数
type: item
date: 2023-03-12T22:15:00+08:00
description: Spring Boot项目动态启动设置参数的好处有以下几点：灵活性：通过动态设置参数，可以根据不同的环境和需求来灵活地配置应用程序，适应不同的场景。可维护性：动态设置参数可以避免硬编码，使得应用程序更易于维护和升级。安全性：通过动态设置参数，可以避免敏感信息（如数据库密码、密钥等）被硬编码到代码中，提高应用程序的安全性。可扩展性：通过动态设置参数，可以方便地扩展应用程序的功能，增加新的配置项，而不需要修改应用程序的代码。自动化部署：通过动态设置参数，可以方便地实现自动化部署，使得部署过程更加简洁、高效。以下可以设置的参数大概有这些--server.port：指定服务端口号。 --spring.profiles.active：指定激活的Spring配置文件。 --logging.level.root：指定日志级别。 --management.server.port：指定管理端口号。 --spring.config.name：指定配置文件的名称。 --spring.config.location：指定配置文件的路径。 --spring.application.name：指定应用程序名称。 --spring.datasource.url：指定数据源URL。 --spring.datasource.username：指定数据源用户名。 --spring.datasource.password：指定数据源密码。 --spring.jpa.show-sql：指定是否显示SQL语句。 --spring.jpa.hibernate.ddl-auto：指定Hibernate的DDL模式。 --spring.main.banner-mode：指定启动Banner模式。 --spring.main.web-application-type：指定应用程序类型。 --spring.main.allow-bean-definition-overriding：指定是否允许Bean覆盖。 --spring.main.lazy-initialization：指定是否启用懒加载。 --spring.main.sources：指定应用程序的源。 --spring.main.web-environment：指定Web环境类型。 --spring.profiles.include：指定需要包含的Spring配置文件。 --spring.profiles.exclude：指定需要排除的Spring配置文件。使用示例:例如启动szxBlog.jar包指定服务端口号为8080：java -jar szxblog.jar --server.port=8080指定激活的Spring配置文件为dev：java -jar szxblog.jar --spring.profiles.active=dev指定日志级别为DEBUG：java -jar szxblog.jar --logging.level.root=DEBUG指定管理端口号为8081：java -jar szxblog.jar --management.server.port=8081指定配置文件的名称为application：java -jar szxblog.jar --spring.config.name=application指定配置文件的路径为/etc/szxblog/：java -jar szxblog.jar --spring.config.location=file:/etc/szxblog/指定应用程序名称为szxblog：java -jar szxblog.jar --spring.application.name=szxblog指定数据源URL为jdbc:mysql://localhost:3306/szxblog：java -jar szxblog.jar --spring.datasource.url=jdbc:mysql://localhost:3306/szxblog指定数据源用户名为myuser：java -jar szxblog.jar --spring.datasource.username=myuser指定数据源密码为mypassword：java -jar szxblog.jar --spring.datasource.password=mypassword注意：以上命令中的参数值需要根据实际情况进行修改。

spring boot整合WebSocket实现群聊功能 通俗易懂教程
type: item
date: 2023-03-11T23:35:00+08:00
description: 首先获取消息的内容，即payload。将payload转换为JSONObject对象，并从中获取消息类型type。如果消息类型是"join"，则从消息中获取群组ID，并将当前WebSocketSession的ID加入到该群组对应的Set中。如果消息类型是"leave"，则从消息中获取群组ID，并从该群组对应的Set中移除当前WebSocketSession的ID。如果消息类型是"message"，则从消息中获取群组ID，并获取该群组对应的所有WebSocketSession，逐一向这些Session发送消息。其中，groups和sessions是两个Map，分别用来存储群组与其对应的WebSocketSessions。computeIfAbsent和computeIfPresent方法分别用来向Map中添加元素和更新元素。sendMessage方法用来向客户端发送消息。导入依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-websocket</artifactId> </dependency>创建MyWebSocketHandler类import com.songzixain.service.MyWebSocketHandler; import org.springframework.context.annotation.Configuration; import org.springframework.web.socket.config.annotation.EnableWebSocket; import org.springframework.web.socket.config.annotation.WebSocketConfigurer; import org.springframework.web.socket.config.annotation.WebSocketHandlerRegistry; import org.springframework.web.socket.server.standard.ServerEndpointExporter; /** * * Description: WebSocketConfig配置类 * * * @author songzixian * @version v2.0.0 * @create 2023-03-11 15:57 * @see com.songzixain.config */ @Configuration @EnableWebSocket public class WebSocketConfig implements WebSocketConfigurer { @Override public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) { registry.addHandler(new MyWebSocketHandler(), "/ws").setAllowedOrigins("*"); 创建MyWebSocketHandler类这段代码是一个WebSocket处理器中的消息处理方法，用来处理WebSocket客户端发送的消息/** * * Description: MyWebSocketHandler用 来处理WebSocket客户端发送的消息 * * * @author songzixian * @version v2.0.0 * @create 2023-03-11 22:44 * @see com.songzixain.service */ @Slf4j public class MyWebSocketHandler implements WebSocketHandler { private static final Map<String, WebSocketSession> sessions = new ConcurrentHashMap<>(); private static final Map<String, Set<String>> groups = new ConcurrentHashMap<>(); @Override public void afterConnectionEstablished(WebSocketSession session) throws Exception { sessions.put(session.getId(), session); } @Override public void handleM…

Spring Boot整合RocketMQ实现延迟消息消费
type: item
date: 2023-03-11T13:45:00+08:00
description: 导包 <dependency> <groupId>org.apache.rocketmq</groupId> <artifactId>rocketmq-spring-boot-starter</artifactId> <version>2.0.3</version> </dependency> 添加配置信息application配置文件# rocketMq地址 rocketmq.name-server=106.52.60.215:9876 # 生产者分组 rocketmq.producer.group=myGroup rocketmq.producer.topics=topic1 # 消费者分组 rocketmq.consumer.group=myGroup # topic rocketmq.consumer.topics=topic1 # 表示顺序消费模式 rocketmq.consumer.consume-mode=ORDERLY # 消费者的最大线程数，即消费消息的线程池大小。默认值为20，如果不需要处理大量的消息，可以将其调小。 rocketmq.consumer.consume-thread-max=1 # 表示每次消费消息的最大数量，即一次性消费的最大消息数。默认值为1，即每次只消费一条消息。如果需要批量消费消息，可以将其调大。但是需要注意的是，批量消费消息可能会影响消费的效率和消息的顺序性。 rocketmq.consumer.consume-message-batch-max-size=1yml配置文件rocketmq: consumer: consume-message-batch-max-size: 1 consume-mode: ORDERLY consume-thread-max: 1 group: myGroup topics: topic1 name-server: 106.52.60.215:9876 producer: group: myGroup topics: topic1 生产者发送消息同步发现消息在Spring Boot中，可以使用RocketMQTemplate来发送消息。设置消息的延迟级别，可以使用RocketMQTemplate的send(Message message, long timeout, int delayLevel)方法，其中delayLevel为延迟级别，单位为秒RocketMQ支持18个级别的延迟时间，分别为1s、5s、10s、30s、1m、2m、3m、4m、5m、6m、7m、8m、9m、10m、20m、30m、1h、2himport com.songzixain.Blog; import lombok.extern.slf4j.Slf4j; import org.apache.rocketmq.client.producer.SendResult; import org.apache.rocketmq.common.message.MessageConst; import org.apache.rocketmq.spring.core.RocketMQTemplate; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.messaging.Message; import org.springframework.messaging.support.MessageBuilder; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; /** * * Description: 消息生产者 * * * @author songzixian * @version v2.0.0 * @create 2023-03-11 21:10 * @see com.songzixain.controller */ @Slf4j @RestController public class MyProducer1 { @Value("${rocketmq.producer.topics}") private Str…

spring boot项目使用maven插件将项目和jar包依赖以及静态资源分离打包
type: item
date: 2023-01-07T13:29:00+08:00
description: 将spring boot的pom.xml文件中的build替换为以下,然后刷新maven,打包即可 <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <configuration> <excludes> <include>*.*</include> </excludes> <archive> <manifest> <addClasspath>true</addClasspath> <classpathPrefix>lib/</classpathPrefix> <useUniqueVersions>false</useUniqueVersions> <mainClass>com.songzixian.SzxBlogApplication </mainClass> </manifest> <manifestEntries> <Class-Path>config/</Class-Path> </manifestEntries> </archive> <outputDirectory>${project.build.directory}</outputDirectory> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-dependency-plugin</artifactId> <executions> <execution> <id>copy-dependencies</id> <phase>package</phase> <goals> <goal>copy-dependencies</goal> </goals> <configuration> <outputDirectory>${project.build.directory}/lib</outputDirectory> </configuration> </execution> </executions> </plugin> <!-- 这个插件是用来复制项目的静态资源 windows命令 java -jar -Dloader.path=config,lib rocket-web-1.0-SNAPSHOT.jar Linux 命令 nohup java -jar -Dloader.path=config,lib rocket-web-1.0-SNAPSHOT.jar >> dispatche.log & --> <plugin> <artifactId>maven-resources-plugin</artifactId> <executions> <execution> <id>copy-resources</id> <phase>package</phase> <goals> <goal>copy-resources</goal> </goals> <configuration> <resources> <resource> <directory>src/main/resources</directory> <includes> <include>*.*</include> </includes> </resource> </resources> <outputDirectory>${project.build.directory}/config</outputDirectory> </configuration> </execution> </executions> </plugin> </plugins> </build> 使用maven命令,或者IDEA插件打包mvn clean package打包后target目录会生成包含以下三个文件,config(配置) ,lib(jar包依赖),*.jar是项目包,将这3个目录文件拷贝到服务器,即可启动,这样打包的好处就是讲项目jar包和依赖分开,一般小项目jar包几百kb左右前台启动java -jar -Dloader.path=config,lib szxblog-1.0-SNAPSHOT.jar后台启动nohup java -jar -Dloader.path=config,lib szxblog-1.0-SNAPSHOT.jar > szxblog.log 2>&1 &带JVM参数的后台启动nohup java -Xms2048m -Xmx4096m -jar -Dloader.path=conf…