13460 字
约 44 分钟
29
日志文件配置路径
无标签

附录J 消息SDK模块源码详解

模块概览(面向 0 基础读者):

  • 封装可靠消息投递与补偿机制,支撑跨服务一致性。
  • 提供消息任务表、发送服务、消费确认等统一实现。
  • 可与订单、学习等模块配合完成支付成功等事件通知。

核心目录:

  • xuecheng-plus-message-sdk/src/main/java/com/xuecheng/messagesdk/service
  • xuecheng-plus-message-sdk/src/main/java/com/xuecheng/messagesdk/mapper
  • xuecheng-plus-message-sdk/src/main/java/com/xuecheng/messagesdk/config
  • xuecheng-plus-message-sdk/src/main/java/com/xuecheng/messagesdk/model
  • xuecheng-plus-message-sdk/src/main/resources

文件:xuecheng-plus-message-sdk/main/com/xuecheng/messagesdk/config/MybatisPlusConfig.java

package com.xuecheng.messagesdk.config; // 声明类所在的包路径

import com.baomidou.mybatisplus.annotation.DbType; // 导入 DbType 类
import com.baomidou.mybatisplus.autoconfigure.ConfigurationCustomizer; // 导入 ConfigurationCustomizer 类
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; // 导入 MybatisPlusInterceptor 类
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor; // 导入 PaginationInnerInterceptor 类
import org.mybatis.spring.annotation.MapperScan; // 导入 MapperScan 类
import org.springframework.context.annotation.Bean; // 导入 Bean 类
import org.springframework.context.annotation.Configuration; // 导入 Configuration 类

/** // 保留原作者写的块注释
 * <P> // 保留原作者写的块注释
 * 		Mybatis-Plus 配置 // 保留原作者写的块注释
 * </p> // 保留原作者写的块注释
 */ // 保留原作者写的块注释
// 标识为spring类纳入容器管路 // 保留原作者写的行内注释
@Configuration("messagesdk_mpconfig") // 使用注解 @Configuration("messagesdk_mpconfig")
@MapperScan("com.xuecheng.messagesdk.mapper") // 使用注解 @MapperScan("com.xuecheng.messagesdk.mapper")
public class MybatisPlusConfig { // 定义 class MybatisPlusConfig


} // 代码块结束

文件:xuecheng-plus-message-sdk/main/com/xuecheng/messagesdk/mapper/MqMessageHistoryMapper.java

package com.xuecheng.messagesdk.mapper; // 声明类所在的包路径

import com.baomidou.mybatisplus.core.mapper.BaseMapper; // 导入 BaseMapper 类
import com.xuecheng.messagesdk.model.po.MqMessageHistory; // 导入 MqMessageHistory 类

/** // 保留原作者写的块注释
 * <p> // 保留原作者写的块注释
 *  Mapper 接口 // 保留原作者写的块注释
 * </p> // 保留原作者写的块注释
 * // 保留原作者写的块注释
 * @author itcast // 保留原作者写的块注释
 */ // 保留原作者写的块注释
public interface MqMessageHistoryMapper extends BaseMapper<MqMessageHistory> { // 定义 interface MqMessageHistoryMapper

} // 代码块结束

文件:xuecheng-plus-message-sdk/main/com/xuecheng/messagesdk/mapper/MqMessageMapper.java

package com.xuecheng.messagesdk.mapper; // 声明类所在的包路径

import com.baomidou.mybatisplus.core.mapper.BaseMapper; // 导入 BaseMapper 类
import com.xuecheng.messagesdk.model.po.MqMessage; // 导入 MqMessage 类
import org.apache.ibatis.annotations.Param; // 导入 Param 类
import org.apache.ibatis.annotations.Select; // 导入 Select 类

import java.util.List; // 导入 List 类

/** // 保留原作者写的块注释
 * <p> // 保留原作者写的块注释
 *  Mapper 接口 // 保留原作者写的块注释
 * </p> // 保留原作者写的块注释
 * // 保留原作者写的块注释
 * @author itcast // 保留原作者写的块注释
 */ // 保留原作者写的块注释
public interface MqMessageMapper extends BaseMapper<MqMessage> { // 定义 interface MqMessageMapper

    @Select("SELECT t.* FROM mq_message t WHERE t.id % #{shardTotal} = #{shardindex} and t.state='0' and t.message_type=#{messageType} limit #{count}") // 使用注解 @Select("SELECT t.* FROM mq_message t WHERE t.id % #{shardTotal} = #{shardindex} and t.state='0' and t.message_type=#{messageType} limit #{count}")
    List<MqMessage> selectListByShardIndex(@Param("shardTotal") int shardTotal, @Param("shardindex") int shardindex, @Param("messageType") String messageType,@Param("count") int count); // 执行语句

} // 代码块结束

文件:xuecheng-plus-message-sdk/main/com/xuecheng/messagesdk/model/po/MqMessage.java

package com.xuecheng.messagesdk.model.po; // 声明类所在的包路径

import com.baomidou.mybatisplus.annotation.IdType; // 导入 IdType 类
import com.baomidou.mybatisplus.annotation.TableId; // 导入 TableId 类
import com.baomidou.mybatisplus.annotation.TableName; // 导入 TableName 类
import lombok.Data; // 导入 Data 类
import lombok.ToString; // 导入 ToString 类

import java.io.Serializable; // 导入 Serializable 类
import java.time.LocalDateTime; // 导入 LocalDateTime 类

/** // 保留原作者写的块注释
 * <p> // 保留原作者写的块注释
 *  // 保留原作者写的块注释
 * </p> // 保留原作者写的块注释
 * // 保留原作者写的块注释
 * @author itcast // 保留原作者写的块注释
 */ // 保留原作者写的块注释
@Data // 使用注解 @Data
@ToString // 使用注解 @ToString
@TableName("mq_message") // 使用注解 @TableName("mq_message")
public class MqMessage implements Serializable { // 定义 class MqMessage

    private static final long serialVersionUID = 1L; // 把 1L 赋值给 serialVersionUID

    /** // 保留原作者写的块注释
     * 消息id // 保留原作者写的块注释
     */ // 保留原作者写的块注释
    @TableId(value = "id", type = IdType.AUTO) // 使用注解 @TableId(value = "id", type = IdType.AUTO)
    private Long id; // 执行语句

    /** // 保留原作者写的块注释
     * 消息类型代码: course_publish ,  media_test, // 保留原作者写的块注释
     */ // 保留原作者写的块注释
    private String messageType; // 执行语句

    /** // 保留原作者写的块注释
     * 关联业务信息 // 保留原作者写的块注释
     */ // 保留原作者写的块注释
    private String businessKey1; // 执行语句

    /** // 保留原作者写的块注释
     * 关联业务信息 // 保留原作者写的块注释
     */ // 保留原作者写的块注释
    private String businessKey2; // 执行语句

    /** // 保留原作者写的块注释
     * 关联业务信息 // 保留原作者写的块注释
     */ // 保留原作者写的块注释
    private String businessKey3; // 执行语句

    /** // 保留原作者写的块注释
     * 执行次数 // 保留原作者写的块注释
     */ // 保留原作者写的块注释
    private Integer executeNum; // 执行语句

    /** // 保留原作者写的块注释
     * 处理状态,0:初始,1:成功 // 保留原作者写的块注释
     */ // 保留原作者写的块注释
    private String state; // 执行语句

    /** // 保留原作者写的块注释
     * 回复失败时间 // 保留原作者写的块注释
     */ // 保留原作者写的块注释
    private LocalDateTime returnfailureDate; // 执行语句

    /** // 保留原作者写的块注释
     * 回复成功时间 // 保留原作者写的块注释
     */ // 保留原作者写的块注释
    private LocalDateTime returnsuccessDate; // 执行语句

    /** // 保留原作者写的块注释
     * 回复失败内容 // 保留原作者写的块注释
     */ // 保留原作者写的块注释
    private String returnfailureMsg; // 执行语句

    /** // 保留原作者写的块注释
     * 最近执行时间 // 保留原作者写的块注释
     */ // 保留原作者写的块注释
    private LocalDateTime executeDate; // 执行语句

    /** // 保留原作者写的块注释
     * 阶段1处理状态, 0:初始,1:成功 // 保留原作者写的块注释
     */ // 保留原作者写的块注释
    private String stageState1; // 执行语句

    /** // 保留原作者写的块注释
     * 阶段2处理状态, 0:初始,1:成功 // 保留原作者写的块注释
     */ // 保留原作者写的块注释
    private String stageState2; // 执行语句

    /** // 保留原作者写的块注释
     * 阶段3处理状态, 0:初始,1:成功 // 保留原作者写的块注释
     */ // 保留原作者写的块注释
    private String stageState3; // 执行语句

    /** // 保留原作者写的块注释
     * 阶段4处理状态, 0:初始,1:成功 // 保留原作者写的块注释
     */ // 保留原作者写的块注释
    private String stageState4; // 执行语句


} // 代码块结束

文件:xuecheng-plus-message-sdk/main/com/xuecheng/messagesdk/model/po/MqMessageHistory.java

package com.xuecheng.messagesdk.model.po; // 声明类所在的包路径

import com.baomidou.mybatisplus.annotation.IdType; // 导入 IdType 类
import com.baomidou.mybatisplus.annotation.TableId; // 导入 TableId 类
import com.baomidou.mybatisplus.annotation.TableName; // 导入 TableName 类
import lombok.Data; // 导入 Data 类

import java.io.Serializable; // 导入 Serializable 类
import java.time.LocalDateTime; // 导入 LocalDateTime 类

/** // 保留原作者写的块注释
 * <p> // 保留原作者写的块注释
 *  // 保留原作者写的块注释
 * </p> // 保留原作者写的块注释
 * // 保留原作者写的块注释
 * @author itcast // 保留原作者写的块注释
 */ // 保留原作者写的块注释
@Data // 使用注解 @Data
@TableName("mq_message_history") // 使用注解 @TableName("mq_message_history")
public class MqMessageHistory implements Serializable { // 定义 class MqMessageHistory

    private static final long serialVersionUID = 1L; // 把 1L 赋值给 serialVersionUID

    /** // 保留原作者写的块注释
     * 消息id // 保留原作者写的块注释
     */ // 保留原作者写的块注释
    @TableId(value = "id", type = IdType.ASSIGN_ID) // 使用注解 @TableId(value = "id", type = IdType.ASSIGN_ID)
    private Long id; // 执行语句

    /** // 保留原作者写的块注释
     * 消息类型代码 // 保留原作者写的块注释
     */ // 保留原作者写的块注释
    private String messageType; // 执行语句

    /** // 保留原作者写的块注释
     * 关联业务信息 // 保留原作者写的块注释
     */ // 保留原作者写的块注释
    private String businessKey1; // 执行语句

    /** // 保留原作者写的块注释
     * 关联业务信息 // 保留原作者写的块注释
     */ // 保留原作者写的块注释
    private String businessKey2; // 执行语句

    /** // 保留原作者写的块注释
     * 关联业务信息 // 保留原作者写的块注释
     */ // 保留原作者写的块注释
    private String businessKey3; // 执行语句

    /** // 保留原作者写的块注释
     * 执行次数 // 保留原作者写的块注释
     */ // 保留原作者写的块注释
    private Integer executeNum; // 执行语句

    /** // 保留原作者写的块注释
     * 处理状态,0:初始,1:成功,2:失败 // 保留原作者写的块注释
     */ // 保留原作者写的块注释
    private Integer state; // 执行语句

    /** // 保留原作者写的块注释
     * 回复失败时间 // 保留原作者写的块注释
     */ // 保留原作者写的块注释
    private LocalDateTime returnfailureDate; // 执行语句

    /** // 保留原作者写的块注释
     * 回复成功时间 // 保留原作者写的块注释
     */ // 保留原作者写的块注释
    private LocalDateTime returnsuccessDate; // 执行语句

    /** // 保留原作者写的块注释
     * 回复失败内容 // 保留原作者写的块注释
     */ // 保留原作者写的块注释
    private String returnfailureMsg; // 执行语句

    /** // 保留原作者写的块注释
     * 最近执行时间 // 保留原作者写的块注释
     */ // 保留原作者写的块注释
    private LocalDateTime executeDate; // 执行语句

    private String stageState1; // 执行语句

    private String stageState2; // 执行语句

    private String stageState3; // 执行语句

    private String stageState4; // 执行语句


} // 代码块结束

文件:xuecheng-plus-message-sdk/main/com/xuecheng/messagesdk/service/impl/MqMessageHistoryServiceImpl.java

package com.xuecheng.messagesdk.service.impl; // 声明类所在的包路径

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; // 导入 ServiceImpl 类
import com.xuecheng.messagesdk.mapper.MqMessageHistoryMapper; // 导入 MqMessageHistoryMapper 类
import com.xuecheng.messagesdk.model.po.MqMessageHistory; // 导入 MqMessageHistory 类
import com.xuecheng.messagesdk.service.MqMessageHistoryService; // 导入 MqMessageHistoryService 类
import lombok.extern.slf4j.Slf4j; // 导入 Slf4j 类
import org.springframework.stereotype.Service; // 导入 Service 类

/** // 保留原作者写的块注释
 * <p> // 保留原作者写的块注释
 *  服务实现类 // 保留原作者写的块注释
 * </p> // 保留原作者写的块注释
 * // 保留原作者写的块注释
 * @author itcast // 保留原作者写的块注释
 */ // 保留原作者写的块注释
@Slf4j // 使用注解 @Slf4j
@Service // 使用注解 @Service
public class MqMessageHistoryServiceImpl extends ServiceImpl<MqMessageHistoryMapper, MqMessageHistory> implements MqMessageHistoryService { // 定义 class MqMessageHistoryServiceImpl

} // 代码块结束

文件:xuecheng-plus-message-sdk/main/com/xuecheng/messagesdk/service/impl/MqMessageServiceImpl.java

package com.xuecheng.messagesdk.service.impl; // 声明类所在的包路径

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; // 导入 LambdaQueryWrapper 类
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; // 导入 ServiceImpl 类
import com.xuecheng.messagesdk.mapper.MqMessageHistoryMapper; // 导入 MqMessageHistoryMapper 类
import com.xuecheng.messagesdk.mapper.MqMessageMapper; // 导入 MqMessageMapper 类
import com.xuecheng.messagesdk.model.po.MqMessage; // 导入 MqMessage 类
import com.xuecheng.messagesdk.model.po.MqMessageHistory; // 导入 MqMessageHistory 类
import com.xuecheng.messagesdk.service.MqMessageService; // 导入 MqMessageService 类
import lombok.extern.slf4j.Slf4j; // 导入 Slf4j 类
import org.springframework.beans.BeanUtils; // 导入 BeanUtils 类
import org.springframework.beans.factory.annotation.Autowired; // 导入 Autowired 类
import org.springframework.stereotype.Service; // 导入 Service 类
import org.springframework.transaction.annotation.Transactional; // 导入 Transactional 类

import java.util.List; // 导入 List 类

/** // 保留原作者写的块注释
 * <p> // 保留原作者写的块注释
 *  服务实现类 // 保留原作者写的块注释
 * </p> // 保留原作者写的块注释
 * // 保留原作者写的块注释
 * @author itcast // 保留原作者写的块注释
 */ // 保留原作者写的块注释
@Slf4j // 使用注解 @Slf4j
@Service // 使用注解 @Service
public class MqMessageServiceImpl extends ServiceImpl<MqMessageMapper, MqMessage> implements MqMessageService { // 定义 class MqMessageServiceImpl

    @Autowired // 使用注解 @Autowired
    MqMessageMapper mqMessageMapper; // 执行语句

    @Autowired // 使用注解 @Autowired
    MqMessageHistoryMapper mqMessageHistoryMapper; // 执行语句


    @Override // 使用注解 @Override
    public List<MqMessage> getMessageList(int shardIndex, int shardTotal, String messageType,int count) { // 定义方法 getMessageList(...)
        return mqMessageMapper.selectListByShardIndex(shardTotal,shardIndex,messageType,count); // 返回 mqMessageMapper.selectListByShardIndex(shardTotal,shardIndex,messageType,count)
    } // 代码块结束

    @Override // 使用注解 @Override
    public MqMessage addMessage(String messageType, String businessKey1, String businessKey2, String businessKey3) { // 定义方法 addMessage(...)
        MqMessage mqMessage = new MqMessage(); // 创建 MqMessage 对象并赋值给 mqMessage
        mqMessage.setMessageType(messageType); // 执行语句
        mqMessage.setBusinessKey1(businessKey1); // 执行语句
        mqMessage.setBusinessKey2(businessKey2); // 执行语句
        mqMessage.setBusinessKey3(businessKey3); // 执行语句
        int insert = mqMessageMapper.insert(mqMessage); // 把 mqMessageMapper.insert(mqMessage) 赋值给 insert
        if(insert>0){ // 定义方法 方法(...)
            return mqMessage; // 返回 mqMessage
        }else{ // 代码逻辑
            return null; // 返回 null
        } // 代码块结束

    } // 代码块结束

    @Transactional // 使用注解 @Transactional
    @Override // 使用注解 @Override
    public int completed(long id) { // 定义方法 completed(...)
        MqMessage mqMessage = new MqMessage(); // 创建 MqMessage 对象并赋值给 mqMessage
        //完成任务 // 保留原作者写的行内注释
        mqMessage.setState("1"); // 执行语句
        int update = mqMessageMapper.update(mqMessage, new LambdaQueryWrapper<MqMessage>().eq(MqMessage::getId, id)); // 把 mqMessageMapper.update(mqMessage, new LambdaQueryWrapper<MqMessage>().eq(MqMessage::getId, id)) 赋值给 update
        if(update>0){ // 定义方法 方法(...)

            mqMessage = mqMessageMapper.selectById(id); // 把 mqMessageMapper.selectById(id) 赋值给 mqMessage
            //添加到历史表 // 保留原作者写的行内注释
            MqMessageHistory mqMessageHistory = new MqMessageHistory(); // 创建 MqMessageHistory 对象并赋值给 mqMessageHistory
            BeanUtils.copyProperties(mqMessage,mqMessageHistory); // 执行语句
            mqMessageHistoryMapper.insert(mqMessageHistory); // 执行语句
            //删除消息表 // 保留原作者写的行内注释
            mqMessageMapper.deleteById(id); // 执行语句
            return 1; // 返回 1
        } // 代码块结束
        return 0; // 返回 0

    } // 代码块结束

    @Override // 使用注解 @Override
    public int completedStageOne(long id) { // 定义方法 completedStageOne(...)
        MqMessage mqMessage = new MqMessage(); // 创建 MqMessage 对象并赋值给 mqMessage
        //完成阶段1任务 // 保留原作者写的行内注释
        mqMessage.setStageState1("1"); // 执行语句
        return mqMessageMapper.update(mqMessage,new LambdaQueryWrapper<MqMessage>().eq(MqMessage::getId,id)); // 返回 mqMessageMapper.update(mqMessage,new LambdaQueryWrapper<MqMessage>().eq(MqMessage::getId,id))
    } // 代码块结束

    @Override // 使用注解 @Override
    public int completedStageTwo(long id) { // 定义方法 completedStageTwo(...)
        MqMessage mqMessage = new MqMessage(); // 创建 MqMessage 对象并赋值给 mqMessage
        //完成阶段2任务 // 保留原作者写的行内注释
        mqMessage.setStageState2("1"); // 执行语句
        return mqMessageMapper.update(mqMessage,new LambdaQueryWrapper<MqMessage>().eq(MqMessage::getId,id)); // 返回 mqMessageMapper.update(mqMessage,new LambdaQueryWrapper<MqMessage>().eq(MqMessage::getId,id))
    } // 代码块结束

    @Override // 使用注解 @Override
    public int completedStageThree(long id) { // 定义方法 completedStageThree(...)
        MqMessage mqMessage = new MqMessage(); // 创建 MqMessage 对象并赋值给 mqMessage
        //完成阶段3任务 // 保留原作者写的行内注释
        mqMessage.setStageState3("1"); // 执行语句
        return mqMessageMapper.update(mqMessage,new LambdaQueryWrapper<MqMessage>().eq(MqMessage::getId,id)); // 返回 mqMessageMapper.update(mqMessage,new LambdaQueryWrapper<MqMessage>().eq(MqMessage::getId,id))
    } // 代码块结束

    @Override // 使用注解 @Override
    public int completedStageFour(long id) { // 定义方法 completedStageFour(...)
        MqMessage mqMessage = new MqMessage(); // 创建 MqMessage 对象并赋值给 mqMessage
        //完成阶段4任务 // 保留原作者写的行内注释
        mqMessage.setStageState4("1"); // 执行语句
        return mqMessageMapper.update(mqMessage,new LambdaQueryWrapper<MqMessage>().eq(MqMessage::getId,id)); // 返回 mqMessageMapper.update(mqMessage,new LambdaQueryWrapper<MqMessage>().eq(MqMessage::getId,id))
    } // 代码块结束

    @Override // 使用注解 @Override
    public int getStageOne(long id) { // 定义方法 getStageOne(...)
        return Integer.parseInt(mqMessageMapper.selectById(id).getStageState1()); // 返回 Integer.parseInt(mqMessageMapper.selectById(id).getStageState1())
    } // 代码块结束

    @Override // 使用注解 @Override
    public int getStageTwo(long id) { // 定义方法 getStageTwo(...)
        return Integer.parseInt(mqMessageMapper.selectById(id).getStageState2()); // 返回 Integer.parseInt(mqMessageMapper.selectById(id).getStageState2())
    } // 代码块结束

    @Override // 使用注解 @Override
    public int getStageThree(long id) { // 定义方法 getStageThree(...)
        return Integer.parseInt(mqMessageMapper.selectById(id).getStageState3()); // 返回 Integer.parseInt(mqMessageMapper.selectById(id).getStageState3())
    } // 代码块结束

    @Override // 使用注解 @Override
    public int getStageFour(long id) { // 定义方法 getStageFour(...)
        return Integer.parseInt(mqMessageMapper.selectById(id).getStageState4()); // 返回 Integer.parseInt(mqMessageMapper.selectById(id).getStageState4())
    } // 代码块结束


} // 代码块结束

文件:xuecheng-plus-message-sdk/main/com/xuecheng/messagesdk/service/MessageProcessAbstract.java

package com.xuecheng.messagesdk.service; // 声明类所在的包路径

import com.xuecheng.messagesdk.model.po.MqMessage; // 导入 MqMessage 类
import lombok.Data; // 导入 Data 类
import lombok.extern.slf4j.Slf4j; // 导入 Slf4j 类
import org.springframework.beans.factory.annotation.Autowired; // 导入 Autowired 类

import java.util.List; // 导入 List 类
import java.util.concurrent.*; // 导入 * 类

/** // 保留原作者写的块注释
 * @author Mr.M // 保留原作者写的块注释
 * @version 1.0 // 保留原作者写的块注释
 * @description 消息处理抽象类 // 保留原作者写的块注释
 * @date 2022/9/21 19:44 // 保留原作者写的块注释
 */ // 保留原作者写的块注释
@Slf4j // 使用注解 @Slf4j
@Data // 使用注解 @Data
public abstract class MessageProcessAbstract { // 代码逻辑

    @Autowired // 使用注解 @Autowired
    MqMessageService mqMessageService; // 执行语句


    /** // 保留原作者写的块注释
     * @param mqMessage 执行任务内容 // 保留原作者写的块注释
     * @return boolean true:处理成功,false处理失败 // 保留原作者写的块注释
     * @description 任务处理 // 保留原作者写的块注释
     * @author Mr.M // 保留原作者写的块注释
     * @date 2022/9/21 19:47 // 保留原作者写的块注释
     */ // 保留原作者写的块注释
    public abstract boolean execute(MqMessage mqMessage); // 执行语句


    /** // 保留原作者写的块注释
     * @description 扫描消息表多线程执行任务 // 保留原作者写的块注释
     * @param shardIndex 分片序号 // 保留原作者写的块注释
     * @param shardTotal 分片总数 // 保留原作者写的块注释
     * @param messageType  消息类型 // 保留原作者写的块注释
     * @param count  一次取出任务总数 // 保留原作者写的块注释
     * @param timeout 预估任务执行时间,到此时间如果任务还没有结束则强制结束 单位秒 // 保留原作者写的块注释
     * @return void // 保留原作者写的块注释
     * @author Mr.M // 保留原作者写的块注释
     * @date 2022/9/21 20:35 // 保留原作者写的块注释
    */ // 保留原作者写的块注释
    public void process(int shardIndex, int shardTotal,  String messageType,int count,long timeout) { // 定义方法 process(...)

        try { // 尝试执行可能抛出异常的代码
            //扫描消息表获取任务清单 // 保留原作者写的行内注释
            List<MqMessage> messageList = mqMessageService.getMessageList(shardIndex, shardTotal,messageType, count); // 把 mqMessageService.getMessageList(shardIndex, shardTotal,messageType, count) 赋值给 messageList
            //任务个数 // 保留原作者写的行内注释
            int size = messageList.size(); // 把 messageList.size() 的返回值赋给 size
            log.debug("取出待处理消息"+size+"条"); // 执行语句
            if(size<=0){ // 定义方法 方法(...)
                return ; // 返回 
            } // 代码块结束

            //创建线程池 // 保留原作者写的行内注释
            ExecutorService threadPool = Executors.newFixedThreadPool(size); // 把 Executors.newFixedThreadPool(size) 赋值给 threadPool
            //计数器 // 保留原作者写的行内注释
            CountDownLatch countDownLatch = new CountDownLatch(size); // 创建 CountDownLatch 对象并赋值给 countDownLatch
            messageList.forEach(message -> { // 定义方法 方法(...)
                threadPool.execute(() -> { // 定义方法 方法(...)
                    log.debug("开始任务:{}",message); // 执行语句
                    //处理任务 // 保留原作者写的行内注释
                    try { // 尝试执行可能抛出异常的代码
                        boolean result = execute(message); // 把 execute(message) 赋值给 result
                        if(result){ // 定义方法 方法(...)
                            log.debug("任务执行成功:{})",message); // 执行语句
                            //更新任务状态,删除消息表记录,添加到历史表 // 保留原作者写的行内注释
                            int completed = mqMessageService.completed(message.getId()); // 把 mqMessageService.completed(message.getId()) 赋值给 completed
                            if (completed>0){ // 定义方法 方法(...)
                                log.debug("任务执行成功:{}",message); // 执行语句
                            }else{ // 代码逻辑
                                log.debug("任务执行失败:{}",message); // 执行语句
                            } // 代码块结束
                        } // 代码块结束
                    } catch (Exception e) { // 定义方法 catch(...)
                        e.printStackTrace(); // 执行语句
                        log.debug("任务出现异常:{},任务:{}",e.getMessage(),message); // 执行语句
                    }finally { // 代码逻辑
                        //计数 // 保留原作者写的行内注释
                        countDownLatch.countDown(); // 执行语句
                    } // 代码块结束
                    log.debug("结束任务:{}",message); // 执行语句

                }); // 执行语句
            }); // 执行语句

            //等待,给一个充裕的超时时间,防止无限等待,到达超时时间还没有处理完成则结束任务 // 保留原作者写的行内注释
            countDownLatch.await(timeout,TimeUnit.SECONDS); // 执行语句
            System.out.println("结束...."); // 执行语句
        } catch (InterruptedException e) { // 定义方法 catch(...)
           e.printStackTrace(); // 执行语句

        } // 代码块结束


    } // 代码块结束




} // 代码块结束

文件:xuecheng-plus-message-sdk/main/com/xuecheng/messagesdk/service/MqMessageHistoryService.java

package com.xuecheng.messagesdk.service; // 声明类所在的包路径

import com.baomidou.mybatisplus.extension.service.IService; // 导入 IService 类
import com.xuecheng.messagesdk.model.po.MqMessageHistory; // 导入 MqMessageHistory 类

/** // 保留原作者写的块注释
 * <p> // 保留原作者写的块注释
 *  服务类 // 保留原作者写的块注释
 * </p> // 保留原作者写的块注释
 * // 保留原作者写的块注释
 * @author itcast // 保留原作者写的块注释
 * @since 2022-09-21 // 保留原作者写的块注释
 */ // 保留原作者写的块注释
public interface MqMessageHistoryService extends IService<MqMessageHistory> { // 定义 interface MqMessageHistoryService

} // 代码块结束

文件:xuecheng-plus-message-sdk/main/com/xuecheng/messagesdk/service/MqMessageService.java

package com.xuecheng.messagesdk.service; // 声明类所在的包路径

import com.baomidou.mybatisplus.extension.service.IService; // 导入 IService 类
import com.xuecheng.messagesdk.model.po.MqMessage; // 导入 MqMessage 类

import java.util.List; // 导入 List 类

/** // 保留原作者写的块注释
 * <p> // 保留原作者写的块注释
 *  服务类 // 保留原作者写的块注释
 * </p> // 保留原作者写的块注释
 * // 保留原作者写的块注释
 * @author itcast // 保留原作者写的块注释
 * @since 2022-09-21 // 保留原作者写的块注释
 */ // 保留原作者写的块注释
public interface MqMessageService extends IService<MqMessage> { // 定义 interface MqMessageService

    /** // 保留原作者写的块注释
     * @description 扫描消息表记录,采用与扫描视频处理表相同的思路 // 保留原作者写的块注释
     * @param shardIndex 分片序号 // 保留原作者写的块注释
     * @param shardTotal 分片总数 // 保留原作者写的块注释
     * @param count 扫描记录数 // 保留原作者写的块注释
     * @return java.util.List 消息记录 // 保留原作者写的块注释
     * @author Mr.M // 保留原作者写的块注释
     * @date 2022/9/21 18:55 // 保留原作者写的块注释
     */ // 保留原作者写的块注释


    public List<MqMessage> getMessageList(int shardIndex, int shardTotal,  String messageType,int count); // 执行语句

    /** // 保留原作者写的块注释
     * @description 添加消息 // 保留原作者写的块注释
     * @param businessKey1 业务id // 保留原作者写的块注释
     * @param businessKey2 业务id // 保留原作者写的块注释
     * @param businessKey3 业务id // 保留原作者写的块注释
     * @return com.xuecheng.messagesdk.model.po.MqMessage 消息内容 // 保留原作者写的块注释
     * @author Mr.M // 保留原作者写的块注释
     * @date 2022/9/23 13:45 // 保留原作者写的块注释
    */ // 保留原作者写的块注释
    public MqMessage addMessage(String messageType,String businessKey1,String businessKey2,String businessKey3); // 执行语句
    /** // 保留原作者写的块注释
     * @description 完成任务 // 保留原作者写的块注释
     * @param id 消息id // 保留原作者写的块注释
     * @return int 更新成功:1 // 保留原作者写的块注释
     * @author Mr.M // 保留原作者写的块注释
     * @date 2022/9/21 20:49 // 保留原作者写的块注释
     */ // 保留原作者写的块注释
    public int completed(long id); // 执行语句

    /** // 保留原作者写的块注释
     * @description 完成阶段任务 // 保留原作者写的块注释
     * @param id 消息id // 保留原作者写的块注释
     * @return int 更新成功:1 // 保留原作者写的块注释
     * @author Mr.M // 保留原作者写的块注释
     * @date 2022/9/21 20:49 // 保留原作者写的块注释
     */ // 保留原作者写的块注释
    public int completedStageOne(long id); // 执行语句
    public int completedStageTwo(long id); // 执行语句
    public int completedStageThree(long id); // 执行语句
    public int completedStageFour(long id); // 执行语句

    /** // 保留原作者写的块注释
     * @description 查询阶段状态 // 保留原作者写的块注释
     * @param id // 保留原作者写的块注释
     * @return int // 保留原作者写的块注释
     * @author Mr.M // 保留原作者写的块注释
     * @date 2022/9/21 20:54 // 保留原作者写的块注释
    */ // 保留原作者写的块注释
    public int getStageOne(long id); // 执行语句
    public int getStageTwo(long id); // 执行语句
    public int getStageThree(long id); // 执行语句
    public int getStageFour(long id); // 执行语句

} // 代码块结束

文件:xuecheng-plus-message-sdk/pom.xml

<?xml version="1.0" encoding="UTF-8"?> <!-- XML 声明 -->
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" <!-- SQL 语句片段 -->
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <!-- SQL 语句片段 -->
    <modelVersion>4.0.0</modelVersion> <!-- SQL 语句片段 -->
    <parent> <!-- SQL 语句片段 -->
        <artifactId>xuecheng-plus-parent</artifactId> <!-- SQL 语句片段 -->
        <groupId>com.xuecheng</groupId> <!-- SQL 语句片段 -->
        <version>0.0.1-SNAPSHOT</version> <!-- SQL 语句片段 -->
        <relativePath>../xuecheng-plus-parent</relativePath> <!-- SQL 语句片段 -->
    </parent> <!-- SQL 语句片段 -->
    <artifactId>xuecheng-plus-message-sdk</artifactId> <!-- SQL 语句片段 -->

    <dependencies> <!-- SQL 语句片段 -->
        <dependency> <!-- SQL 语句片段 -->
            <groupId>org.springframework.cloud</groupId> <!-- SQL 语句片段 -->
            <artifactId>spring-cloud-context</artifactId> <!-- SQL 语句片段 -->
        </dependency> <!-- SQL 语句片段 -->
        <!-- MySQL 驱动 -->
        <dependency> <!-- SQL 语句片段 -->
            <groupId>mysql</groupId> <!-- SQL 语句片段 -->
            <artifactId>mysql-connector-java</artifactId> <!-- SQL 语句片段 -->
            <scope>runtime</scope> <!-- SQL 语句片段 -->
        </dependency> <!-- SQL 语句片段 -->
        <!-- mybatis plus的依赖 -->
        <dependency> <!-- SQL 语句片段 -->
            <groupId>com.baomidou</groupId> <!-- SQL 语句片段 -->
            <artifactId>mybatis-plus-boot-starter</artifactId> <!-- SQL 语句片段 -->
        </dependency> <!-- SQL 语句片段 -->
        <!-- Spring Boot 集成 Junit -->
        <dependency> <!-- SQL 语句片段 -->
            <groupId>org.springframework.boot</groupId> <!-- SQL 语句片段 -->
            <artifactId>spring-boot-starter-test</artifactId> <!-- SQL 语句片段 -->
            <scope>test</scope> <!-- SQL 语句片段 -->
        </dependency> <!-- SQL 语句片段 -->
        <!-- 排除 Spring Boot 依赖的日志包冲突 -->
        <dependency> <!-- SQL 语句片段 -->
            <groupId>org.springframework.boot</groupId> <!-- SQL 语句片段 -->
            <artifactId>spring-boot-starter</artifactId> <!-- SQL 语句片段 -->
            <exclusions> <!-- SQL 语句片段 -->
                <exclusion> <!-- SQL 语句片段 -->
                    <groupId>org.springframework.boot</groupId> <!-- SQL 语句片段 -->
                    <artifactId>spring-boot-starter-logging</artifactId> <!-- SQL 语句片段 -->
                </exclusion> <!-- SQL 语句片段 -->
            </exclusions> <!-- SQL 语句片段 -->
        </dependency> <!-- SQL 语句片段 -->

        <!-- Spring Boot 集成 log4j2 -->
        <dependency> <!-- SQL 语句片段 -->
            <groupId>org.springframework.boot</groupId> <!-- SQL 语句片段 -->
            <artifactId>spring-boot-starter-log4j2</artifactId> <!-- SQL 语句片段 -->
        </dependency> <!-- SQL 语句片段 -->

        <dependency> <!-- SQL 语句片段 -->
            <groupId>org.projectlombok</groupId> <!-- SQL 语句片段 -->
            <artifactId>lombok</artifactId> <!-- SQL 语句片段 -->
        </dependency> <!-- SQL 语句片段 -->
        <dependency> <!-- SQL 语句片段 -->
            <groupId>com.squareup.okhttp3</groupId> <!-- SQL 语句片段 -->
            <artifactId>okhttp</artifactId> <!-- SQL 语句片段 -->
            <version>4.8.1</version> <!-- SQL 语句片段 -->
        </dependency> <!-- SQL 语句片段 -->

    </dependencies> <!-- SQL 语句片段 -->

</project> <!-- SQL 语句片段 -->

文件:xuecheng-plus-message-sdk/src/main/java/com/xuecheng/messagesdk/config/MybatisPlusConfig.java

package com.xuecheng.messagesdk.config; // 声明类所在的包路径

import com.baomidou.mybatisplus.annotation.DbType; // 导入 DbType 类
import com.baomidou.mybatisplus.autoconfigure.ConfigurationCustomizer; // 导入 ConfigurationCustomizer 类
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; // 导入 MybatisPlusInterceptor 类
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor; // 导入 PaginationInnerInterceptor 类
import org.mybatis.spring.annotation.MapperScan; // 导入 MapperScan 类
import org.springframework.context.annotation.Bean; // 导入 Bean 类
import org.springframework.context.annotation.Configuration; // 导入 Configuration 类

/** // 保留原作者写的块注释
 * <P> // 保留原作者写的块注释
 * 		Mybatis-Plus 配置 // 保留原作者写的块注释
 * </p> // 保留原作者写的块注释
 */ // 保留原作者写的块注释
// 标识为spring类纳入容器管路 // 保留原作者写的行内注释
@Configuration("messagesdk_mpconfig") // 使用注解 @Configuration("messagesdk_mpconfig")
@MapperScan("com.xuecheng.messagesdk.mapper") // 使用注解 @MapperScan("com.xuecheng.messagesdk.mapper")
public class MybatisPlusConfig { // 定义 class MybatisPlusConfig


} // 代码块结束

文件:xuecheng-plus-message-sdk/src/main/java/com/xuecheng/messagesdk/mapper/MqMessageHistoryMapper.java

package com.xuecheng.messagesdk.mapper; // 声明类所在的包路径

import com.baomidou.mybatisplus.core.mapper.BaseMapper; // 导入 BaseMapper 类
import com.xuecheng.messagesdk.model.po.MqMessageHistory; // 导入 MqMessageHistory 类

/** // 保留原作者写的块注释
 * <p> // 保留原作者写的块注释
 *  Mapper 接口 // 保留原作者写的块注释
 * </p> // 保留原作者写的块注释
 * // 保留原作者写的块注释
 * @author itcast // 保留原作者写的块注释
 */ // 保留原作者写的块注释
public interface MqMessageHistoryMapper extends BaseMapper<MqMessageHistory> { // 定义 interface MqMessageHistoryMapper

} // 代码块结束

文件:xuecheng-plus-message-sdk/src/main/java/com/xuecheng/messagesdk/mapper/MqMessageHistoryMapper.xml

<?xml version="1.0" encoding="UTF-8"?> <!-- XML 声明 -->
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <!-- SQL 语句片段 -->
<mapper namespace="com.xuecheng.messagesdk.mapper.MqMessageHistoryMapper"> <!-- MyBatis 映射文件的根标签 -->

    <!-- 通用查询映射结果 -->
    <resultMap id="BaseResultMap" type="com.xuecheng.messagesdk.model.po.MqMessageHistory"> <!-- 定义结果映射 -->
        <id column="id" property="id" /> <!-- 主键列的映射规则 -->
        <result column="message_type" property="messageType" /> <!-- 字段与属性的映射规则 -->
        <result column="business_key1" property="businessKey1" /> <!-- 字段与属性的映射规则 -->
        <result column="business_key2" property="businessKey2" /> <!-- 字段与属性的映射规则 -->
        <result column="business_key3" property="businessKey3" /> <!-- 字段与属性的映射规则 -->
        <result column="execute_num" property="executeNum" /> <!-- 字段与属性的映射规则 -->
        <result column="state" property="state" /> <!-- 字段与属性的映射规则 -->
        <result column="returnfailure_date" property="returnfailureDate" /> <!-- 字段与属性的映射规则 -->
        <result column="returnsuccess_date" property="returnsuccessDate" /> <!-- 字段与属性的映射规则 -->
        <result column="returnfailure_msg" property="returnfailureMsg" /> <!-- 字段与属性的映射规则 -->
        <result column="execute_date" property="executeDate" /> <!-- 字段与属性的映射规则 -->
        <result column="stage_state1" property="stageState1" /> <!-- 字段与属性的映射规则 -->
        <result column="stage_state2" property="stageState2" /> <!-- 字段与属性的映射规则 -->
        <result column="stage_state3" property="stageState3" /> <!-- 字段与属性的映射规则 -->
        <result column="stage_state4" property="stageState4" /> <!-- 字段与属性的映射规则 -->
    </resultMap> <!-- 结束 resultMap 区块 -->

    <!-- 通用查询结果列 -->
    <sql id="Base_Column_List"> <!-- 声明可复用的 SQL 片段 -->
        id, message_type, business_key1, business_key2, business_key3, execute_num, state, returnfailure_date, returnsuccess_date, returnfailure_msg, execute_date, stage_state1, stage_state2, stage_state3, stage_state4 <!-- SQL 语句片段 -->
    </sql> <!-- 结束 SQL 片段 -->

</mapper> <!-- 结束 mapper 标签 -->

文件:xuecheng-plus-message-sdk/src/main/java/com/xuecheng/messagesdk/mapper/MqMessageMapper.java

package com.xuecheng.messagesdk.mapper; // 声明类所在的包路径

import com.baomidou.mybatisplus.core.mapper.BaseMapper; // 导入 BaseMapper 类
import com.xuecheng.messagesdk.model.po.MqMessage; // 导入 MqMessage 类
import org.apache.ibatis.annotations.Param; // 导入 Param 类
import org.apache.ibatis.annotations.Select; // 导入 Select 类

import java.util.List; // 导入 List 类

/** // 保留原作者写的块注释
 * <p> // 保留原作者写的块注释
 *  Mapper 接口 // 保留原作者写的块注释
 * </p> // 保留原作者写的块注释
 * // 保留原作者写的块注释
 * @author itcast // 保留原作者写的块注释
 */ // 保留原作者写的块注释
public interface MqMessageMapper extends BaseMapper<MqMessage> { // 定义 interface MqMessageMapper

    @Select("SELECT t.* FROM mq_message t WHERE t.id % #{shardTotal} = #{shardindex} and t.state='0' and t.message_type=#{messageType} limit #{count}") // 使用注解 @Select("SELECT t.* FROM mq_message t WHERE t.id % #{shardTotal} = #{shardindex} and t.state='0' and t.message_type=#{messageType} limit #{count}")
    List<MqMessage> selectListByShardIndex(@Param("shardTotal") int shardTotal, @Param("shardindex") int shardindex, @Param("messageType") String messageType,@Param("count") int count); // 执行语句

} // 代码块结束

文件:xuecheng-plus-message-sdk/src/main/java/com/xuecheng/messagesdk/mapper/MqMessageMapper.xml

<?xml version="1.0" encoding="UTF-8"?> <!-- XML 声明 -->
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <!-- SQL 语句片段 -->
<mapper namespace="com.xuecheng.messagesdk.mapper.MqMessageMapper"> <!-- MyBatis 映射文件的根标签 -->

    <!-- 通用查询映射结果 -->
    <resultMap id="BaseResultMap" type="com.xuecheng.messagesdk.model.po.MqMessage"> <!-- 定义结果映射 -->
        <id column="id" property="id" /> <!-- 主键列的映射规则 -->
        <result column="message_type" property="messageType" /> <!-- 字段与属性的映射规则 -->
        <result column="business_key1" property="businessKey1" /> <!-- 字段与属性的映射规则 -->
        <result column="business_key2" property="businessKey2" /> <!-- 字段与属性的映射规则 -->
        <result column="business_key3" property="businessKey3" /> <!-- 字段与属性的映射规则 -->
        <result column="execute_num" property="executeNum" /> <!-- 字段与属性的映射规则 -->
        <result column="state" property="state" /> <!-- 字段与属性的映射规则 -->
        <result column="returnfailure_date" property="returnfailureDate" /> <!-- 字段与属性的映射规则 -->
        <result column="returnsuccess_date" property="returnsuccessDate" /> <!-- 字段与属性的映射规则 -->
        <result column="returnfailure_msg" property="returnfailureMsg" /> <!-- 字段与属性的映射规则 -->
        <result column="execute_date" property="executeDate" /> <!-- 字段与属性的映射规则 -->
        <result column="stage_state1" property="stageState1" /> <!-- 字段与属性的映射规则 -->
        <result column="stage_state2" property="stageState2" /> <!-- 字段与属性的映射规则 -->
        <result column="stage_state3" property="stageState3" /> <!-- 字段与属性的映射规则 -->
        <result column="stage_state4" property="stageState4" /> <!-- 字段与属性的映射规则 -->
    </resultMap> <!-- 结束 resultMap 区块 -->

    <!-- 通用查询结果列 -->
    <sql id="Base_Column_List"> <!-- 声明可复用的 SQL 片段 -->
        id, message_type, business_key1, business_key2, business_key3, inform_num, state, returnfailure_date, returnsuccess_date, returnfailure_msg, inform_date, stage_state1, stage_state2, stage_state3, stage_state4 <!-- SQL 语句片段 -->
    </sql> <!-- 结束 SQL 片段 -->

</mapper> <!-- 结束 mapper 标签 -->

文件:xuecheng-plus-message-sdk/src/main/java/com/xuecheng/messagesdk/model/po/MqMessage.java

package com.xuecheng.messagesdk.model.po; // 声明类所在的包路径

import com.baomidou.mybatisplus.annotation.IdType; // 导入 IdType 类
import com.baomidou.mybatisplus.annotation.TableId; // 导入 TableId 类
import com.baomidou.mybatisplus.annotation.TableName; // 导入 TableName 类
import lombok.Data; // 导入 Data 类
import lombok.ToString; // 导入 ToString 类

import java.io.Serializable; // 导入 Serializable 类
import java.time.LocalDateTime; // 导入 LocalDateTime 类

/** // 保留原作者写的块注释
 * <p> // 保留原作者写的块注释
 *  // 保留原作者写的块注释
 * </p> // 保留原作者写的块注释
 * // 保留原作者写的块注释
 * @author itcast // 保留原作者写的块注释
 */ // 保留原作者写的块注释
@Data // 使用注解 @Data
@ToString // 使用注解 @ToString
@TableName("mq_message") // 使用注解 @TableName("mq_message")
public class MqMessage implements Serializable { // 定义 class MqMessage

    private static final long serialVersionUID = 1L; // 把 1L 赋值给 serialVersionUID

    /** // 保留原作者写的块注释
     * 消息id // 保留原作者写的块注释
     */ // 保留原作者写的块注释
    @TableId(value = "id", type = IdType.AUTO) // 使用注解 @TableId(value = "id", type = IdType.AUTO)
    private Long id; // 执行语句

    /** // 保留原作者写的块注释
     * 消息类型代码: course_publish ,  media_test, // 保留原作者写的块注释
     */ // 保留原作者写的块注释
    private String messageType; // 执行语句

    /** // 保留原作者写的块注释
     * 关联业务信息 // 保留原作者写的块注释
     */ // 保留原作者写的块注释
    private String businessKey1; // 执行语句

    /** // 保留原作者写的块注释
     * 关联业务信息 // 保留原作者写的块注释
     */ // 保留原作者写的块注释
    private String businessKey2; // 执行语句

    /** // 保留原作者写的块注释
     * 关联业务信息 // 保留原作者写的块注释
     */ // 保留原作者写的块注释
    private String businessKey3; // 执行语句

    /** // 保留原作者写的块注释
     * 执行次数 // 保留原作者写的块注释
     */ // 保留原作者写的块注释
    private Integer executeNum; // 执行语句

    /** // 保留原作者写的块注释
     * 处理状态,0:初始,1:成功 // 保留原作者写的块注释
     */ // 保留原作者写的块注释
    private String state; // 执行语句

    /** // 保留原作者写的块注释
     * 回复失败时间 // 保留原作者写的块注释
     */ // 保留原作者写的块注释
    private LocalDateTime returnfailureDate; // 执行语句

    /** // 保留原作者写的块注释
     * 回复成功时间 // 保留原作者写的块注释
     */ // 保留原作者写的块注释
    private LocalDateTime returnsuccessDate; // 执行语句

    /** // 保留原作者写的块注释
     * 回复失败内容 // 保留原作者写的块注释
     */ // 保留原作者写的块注释
    private String returnfailureMsg; // 执行语句

    /** // 保留原作者写的块注释
     * 最近执行时间 // 保留原作者写的块注释
     */ // 保留原作者写的块注释
    private LocalDateTime executeDate; // 执行语句

    /** // 保留原作者写的块注释
     * 阶段1处理状态, 0:初始,1:成功 // 保留原作者写的块注释
     */ // 保留原作者写的块注释
    private String stageState1; // 执行语句

    /** // 保留原作者写的块注释
     * 阶段2处理状态, 0:初始,1:成功 // 保留原作者写的块注释
     */ // 保留原作者写的块注释
    private String stageState2; // 执行语句

    /** // 保留原作者写的块注释
     * 阶段3处理状态, 0:初始,1:成功 // 保留原作者写的块注释
     */ // 保留原作者写的块注释
    private String stageState3; // 执行语句

    /** // 保留原作者写的块注释
     * 阶段4处理状态, 0:初始,1:成功 // 保留原作者写的块注释
     */ // 保留原作者写的块注释
    private String stageState4; // 执行语句


} // 代码块结束

文件:xuecheng-plus-message-sdk/src/main/java/com/xuecheng/messagesdk/model/po/MqMessageHistory.java

package com.xuecheng.messagesdk.model.po; // 声明类所在的包路径

import com.baomidou.mybatisplus.annotation.IdType; // 导入 IdType 类
import com.baomidou.mybatisplus.annotation.TableId; // 导入 TableId 类
import com.baomidou.mybatisplus.annotation.TableName; // 导入 TableName 类
import lombok.Data; // 导入 Data 类

import java.io.Serializable; // 导入 Serializable 类
import java.time.LocalDateTime; // 导入 LocalDateTime 类

/** // 保留原作者写的块注释
 * <p> // 保留原作者写的块注释
 *  // 保留原作者写的块注释
 * </p> // 保留原作者写的块注释
 * // 保留原作者写的块注释
 * @author itcast // 保留原作者写的块注释
 */ // 保留原作者写的块注释
@Data // 使用注解 @Data
@TableName("mq_message_history") // 使用注解 @TableName("mq_message_history")
public class MqMessageHistory implements Serializable { // 定义 class MqMessageHistory

    private static final long serialVersionUID = 1L; // 把 1L 赋值给 serialVersionUID

    /** // 保留原作者写的块注释
     * 消息id // 保留原作者写的块注释
     */ // 保留原作者写的块注释
    @TableId(value = "id", type = IdType.ASSIGN_ID) // 使用注解 @TableId(value = "id", type = IdType.ASSIGN_ID)
    private Long id; // 执行语句

    /** // 保留原作者写的块注释
     * 消息类型代码 // 保留原作者写的块注释
     */ // 保留原作者写的块注释
    private String messageType; // 执行语句

    /** // 保留原作者写的块注释
     * 关联业务信息 // 保留原作者写的块注释
     */ // 保留原作者写的块注释
    private String businessKey1; // 执行语句

    /** // 保留原作者写的块注释
     * 关联业务信息 // 保留原作者写的块注释
     */ // 保留原作者写的块注释
    private String businessKey2; // 执行语句

    /** // 保留原作者写的块注释
     * 关联业务信息 // 保留原作者写的块注释
     */ // 保留原作者写的块注释
    private String businessKey3; // 执行语句

    /** // 保留原作者写的块注释
     * 执行次数 // 保留原作者写的块注释
     */ // 保留原作者写的块注释
    private Integer executeNum; // 执行语句

    /** // 保留原作者写的块注释
     * 处理状态,0:初始,1:成功,2:失败 // 保留原作者写的块注释
     */ // 保留原作者写的块注释
    private Integer state; // 执行语句

    /** // 保留原作者写的块注释
     * 回复失败时间 // 保留原作者写的块注释
     */ // 保留原作者写的块注释
    private LocalDateTime returnfailureDate; // 执行语句

    /** // 保留原作者写的块注释
     * 回复成功时间 // 保留原作者写的块注释
     */ // 保留原作者写的块注释
    private LocalDateTime returnsuccessDate; // 执行语句

    /** // 保留原作者写的块注释
     * 回复失败内容 // 保留原作者写的块注释
     */ // 保留原作者写的块注释
    private String returnfailureMsg; // 执行语句

    /** // 保留原作者写的块注释
     * 最近执行时间 // 保留原作者写的块注释
     */ // 保留原作者写的块注释
    private LocalDateTime executeDate; // 执行语句

    private String stageState1; // 执行语句

    private String stageState2; // 执行语句

    private String stageState3; // 执行语句

    private String stageState4; // 执行语句


} // 代码块结束

文件:xuecheng-plus-message-sdk/src/main/java/com/xuecheng/messagesdk/service/impl/MqMessageHistoryServiceImpl.java

package com.xuecheng.messagesdk.service.impl; // 声明类所在的包路径

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; // 导入 ServiceImpl 类
import com.xuecheng.messagesdk.mapper.MqMessageHistoryMapper; // 导入 MqMessageHistoryMapper 类
import com.xuecheng.messagesdk.model.po.MqMessageHistory; // 导入 MqMessageHistory 类
import com.xuecheng.messagesdk.service.MqMessageHistoryService; // 导入 MqMessageHistoryService 类
import lombok.extern.slf4j.Slf4j; // 导入 Slf4j 类
import org.springframework.stereotype.Service; // 导入 Service 类

/** // 保留原作者写的块注释
 * <p> // 保留原作者写的块注释
 *  服务实现类 // 保留原作者写的块注释
 * </p> // 保留原作者写的块注释
 * // 保留原作者写的块注释
 * @author itcast // 保留原作者写的块注释
 */ // 保留原作者写的块注释
@Slf4j // 使用注解 @Slf4j
@Service // 使用注解 @Service
public class MqMessageHistoryServiceImpl extends ServiceImpl<MqMessageHistoryMapper, MqMessageHistory> implements MqMessageHistoryService { // 定义 class MqMessageHistoryServiceImpl

} // 代码块结束

文件:xuecheng-plus-message-sdk/src/main/java/com/xuecheng/messagesdk/service/impl/MqMessageServiceImpl.java

package com.xuecheng.messagesdk.service.impl; // 声明类所在的包路径

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; // 导入 LambdaQueryWrapper 类
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; // 导入 ServiceImpl 类
import com.xuecheng.messagesdk.mapper.MqMessageHistoryMapper; // 导入 MqMessageHistoryMapper 类
import com.xuecheng.messagesdk.mapper.MqMessageMapper; // 导入 MqMessageMapper 类
import com.xuecheng.messagesdk.model.po.MqMessage; // 导入 MqMessage 类
import com.xuecheng.messagesdk.model.po.MqMessageHistory; // 导入 MqMessageHistory 类
import com.xuecheng.messagesdk.service.MqMessageService; // 导入 MqMessageService 类
import lombok.extern.slf4j.Slf4j; // 导入 Slf4j 类
import org.springframework.beans.BeanUtils; // 导入 BeanUtils 类
import org.springframework.beans.factory.annotation.Autowired; // 导入 Autowired 类
import org.springframework.stereotype.Service; // 导入 Service 类
import org.springframework.transaction.annotation.Transactional; // 导入 Transactional 类

import java.util.List; // 导入 List 类

/** // 保留原作者写的块注释
 * <p> // 保留原作者写的块注释
 *  服务实现类 // 保留原作者写的块注释
 * </p> // 保留原作者写的块注释
 * // 保留原作者写的块注释
 * @author itcast // 保留原作者写的块注释
 */ // 保留原作者写的块注释
@Slf4j // 使用注解 @Slf4j
@Service // 使用注解 @Service
public class MqMessageServiceImpl extends ServiceImpl<MqMessageMapper, MqMessage> implements MqMessageService { // 定义 class MqMessageServiceImpl

    @Autowired // 使用注解 @Autowired
    MqMessageMapper mqMessageMapper; // 执行语句

    @Autowired // 使用注解 @Autowired
    MqMessageHistoryMapper mqMessageHistoryMapper; // 执行语句


    @Override // 使用注解 @Override
    public List<MqMessage> getMessageList(int shardIndex, int shardTotal, String messageType,int count) { // 定义方法 getMessageList(...)
        return mqMessageMapper.selectListByShardIndex(shardTotal,shardIndex,messageType,count); // 返回 mqMessageMapper.selectListByShardIndex(shardTotal,shardIndex,messageType,count)
    } // 代码块结束

    @Override // 使用注解 @Override
    public MqMessage addMessage(String messageType, String businessKey1, String businessKey2, String businessKey3) { // 定义方法 addMessage(...)
        MqMessage mqMessage = new MqMessage(); // 创建 MqMessage 对象并赋值给 mqMessage
        mqMessage.setMessageType(messageType); // 执行语句
        mqMessage.setBusinessKey1(businessKey1); // 执行语句
        mqMessage.setBusinessKey2(businessKey2); // 执行语句
        mqMessage.setBusinessKey3(businessKey3); // 执行语句
        int insert = mqMessageMapper.insert(mqMessage); // 把 mqMessageMapper.insert(mqMessage) 赋值给 insert
        if(insert>0){ // 定义方法 方法(...)
            return mqMessage; // 返回 mqMessage
        }else{ // 代码逻辑
            return null; // 返回 null
        } // 代码块结束

    } // 代码块结束

    @Transactional // 使用注解 @Transactional
    @Override // 使用注解 @Override
    public int completed(long id) { // 定义方法 completed(...)
        MqMessage mqMessage = new MqMessage(); // 创建 MqMessage 对象并赋值给 mqMessage
        //完成任务 // 保留原作者写的行内注释
        mqMessage.setState("1"); // 执行语句
        int update = mqMessageMapper.update(mqMessage, new LambdaQueryWrapper<MqMessage>().eq(MqMessage::getId, id)); // 把 mqMessageMapper.update(mqMessage, new LambdaQueryWrapper<MqMessage>().eq(MqMessage::getId, id)) 赋值给 update
        if(update>0){ // 定义方法 方法(...)

            mqMessage = mqMessageMapper.selectById(id); // 把 mqMessageMapper.selectById(id) 赋值给 mqMessage
            //添加到历史表 // 保留原作者写的行内注释
            MqMessageHistory mqMessageHistory = new MqMessageHistory(); // 创建 MqMessageHistory 对象并赋值给 mqMessageHistory
            BeanUtils.copyProperties(mqMessage,mqMessageHistory); // 执行语句
            mqMessageHistoryMapper.insert(mqMessageHistory); // 执行语句
            //删除消息表 // 保留原作者写的行内注释
            mqMessageMapper.deleteById(id); // 执行语句
            return 1; // 返回 1
        } // 代码块结束
        return 0; // 返回 0

    } // 代码块结束

    @Override // 使用注解 @Override
    public int completedStageOne(long id) { // 定义方法 completedStageOne(...)
        MqMessage mqMessage = new MqMessage(); // 创建 MqMessage 对象并赋值给 mqMessage
        //完成阶段1任务 // 保留原作者写的行内注释
        mqMessage.setStageState1("1"); // 执行语句
        return mqMessageMapper.update(mqMessage,new LambdaQueryWrapper<MqMessage>().eq(MqMessage::getId,id)); // 返回 mqMessageMapper.update(mqMessage,new LambdaQueryWrapper<MqMessage>().eq(MqMessage::getId,id))
    } // 代码块结束

    @Override // 使用注解 @Override
    public int completedStageTwo(long id) { // 定义方法 completedStageTwo(...)
        MqMessage mqMessage = new MqMessage(); // 创建 MqMessage 对象并赋值给 mqMessage
        //完成阶段2任务 // 保留原作者写的行内注释
        mqMessage.setStageState2("1"); // 执行语句
        return mqMessageMapper.update(mqMessage,new LambdaQueryWrapper<MqMessage>().eq(MqMessage::getId,id)); // 返回 mqMessageMapper.update(mqMessage,new LambdaQueryWrapper<MqMessage>().eq(MqMessage::getId,id))
    } // 代码块结束

    @Override // 使用注解 @Override
    public int completedStageThree(long id) { // 定义方法 completedStageThree(...)
        MqMessage mqMessage = new MqMessage(); // 创建 MqMessage 对象并赋值给 mqMessage
        //完成阶段3任务 // 保留原作者写的行内注释
        mqMessage.setStageState3("1"); // 执行语句
        return mqMessageMapper.update(mqMessage,new LambdaQueryWrapper<MqMessage>().eq(MqMessage::getId,id)); // 返回 mqMessageMapper.update(mqMessage,new LambdaQueryWrapper<MqMessage>().eq(MqMessage::getId,id))
    } // 代码块结束

    @Override // 使用注解 @Override
    public int completedStageFour(long id) { // 定义方法 completedStageFour(...)
        MqMessage mqMessage = new MqMessage(); // 创建 MqMessage 对象并赋值给 mqMessage
        //完成阶段4任务 // 保留原作者写的行内注释
        mqMessage.setStageState4("1"); // 执行语句
        return mqMessageMapper.update(mqMessage,new LambdaQueryWrapper<MqMessage>().eq(MqMessage::getId,id)); // 返回 mqMessageMapper.update(mqMessage,new LambdaQueryWrapper<MqMessage>().eq(MqMessage::getId,id))
    } // 代码块结束

    @Override // 使用注解 @Override
    public int getStageOne(long id) { // 定义方法 getStageOne(...)
        return Integer.parseInt(mqMessageMapper.selectById(id).getStageState1()); // 返回 Integer.parseInt(mqMessageMapper.selectById(id).getStageState1())
    } // 代码块结束

    @Override // 使用注解 @Override
    public int getStageTwo(long id) { // 定义方法 getStageTwo(...)
        return Integer.parseInt(mqMessageMapper.selectById(id).getStageState2()); // 返回 Integer.parseInt(mqMessageMapper.selectById(id).getStageState2())
    } // 代码块结束

    @Override // 使用注解 @Override
    public int getStageThree(long id) { // 定义方法 getStageThree(...)
        return Integer.parseInt(mqMessageMapper.selectById(id).getStageState3()); // 返回 Integer.parseInt(mqMessageMapper.selectById(id).getStageState3())
    } // 代码块结束

    @Override // 使用注解 @Override
    public int getStageFour(long id) { // 定义方法 getStageFour(...)
        return Integer.parseInt(mqMessageMapper.selectById(id).getStageState4()); // 返回 Integer.parseInt(mqMessageMapper.selectById(id).getStageState4())
    } // 代码块结束


} // 代码块结束

文件:xuecheng-plus-message-sdk/src/main/java/com/xuecheng/messagesdk/service/MessageProcessAbstract.java

package com.xuecheng.messagesdk.service; // 声明类所在的包路径

import com.xuecheng.messagesdk.model.po.MqMessage; // 导入 MqMessage 类
import lombok.Data; // 导入 Data 类
import lombok.extern.slf4j.Slf4j; // 导入 Slf4j 类
import org.springframework.beans.factory.annotation.Autowired; // 导入 Autowired 类

import java.util.List; // 导入 List 类
import java.util.concurrent.*; // 导入 * 类

/** // 保留原作者写的块注释
 * @author Mr.M // 保留原作者写的块注释
 * @version 1.0 // 保留原作者写的块注释
 * @description 消息处理抽象类 // 保留原作者写的块注释
 * @date 2022/9/21 19:44 // 保留原作者写的块注释
 */ // 保留原作者写的块注释
@Slf4j // 使用注解 @Slf4j
@Data // 使用注解 @Data
public abstract class MessageProcessAbstract { // 代码逻辑

    @Autowired // 使用注解 @Autowired
    MqMessageService mqMessageService; // 执行语句


    /** // 保留原作者写的块注释
     * @param mqMessage 执行任务内容 // 保留原作者写的块注释
     * @return boolean true:处理成功,false处理失败 // 保留原作者写的块注释
     * @description 任务处理 // 保留原作者写的块注释
     * @author Mr.M // 保留原作者写的块注释
     * @date 2022/9/21 19:47 // 保留原作者写的块注释
     */ // 保留原作者写的块注释
    public abstract boolean execute(MqMessage mqMessage); // 执行语句


    /** // 保留原作者写的块注释
     * @description 扫描消息表多线程执行任务 // 保留原作者写的块注释
     * @param shardIndex 分片序号 // 保留原作者写的块注释
     * @param shardTotal 分片总数 // 保留原作者写的块注释
     * @param messageType  消息类型 // 保留原作者写的块注释
     * @param count  一次取出任务总数 // 保留原作者写的块注释
     * @param timeout 预估任务执行时间,到此时间如果任务还没有结束则强制结束 单位秒 // 保留原作者写的块注释
     * @return void // 保留原作者写的块注释
     * @author Mr.M // 保留原作者写的块注释
     * @date 2022/9/21 20:35 // 保留原作者写的块注释
    */ // 保留原作者写的块注释
    public void process(int shardIndex, int shardTotal,  String messageType,int count,long timeout) { // 定义方法 process(...)

        try { // 尝试执行可能抛出异常的代码
            //扫描消息表获取任务清单 // 保留原作者写的行内注释
            List<MqMessage> messageList = mqMessageService.getMessageList(shardIndex, shardTotal,messageType, count); // 把 mqMessageService.getMessageList(shardIndex, shardTotal,messageType, count) 赋值给 messageList
            //任务个数 // 保留原作者写的行内注释
            int size = messageList.size(); // 把 messageList.size() 的返回值赋给 size
            log.debug("取出待处理消息"+size+"条"); // 执行语句
            if(size<=0){ // 定义方法 方法(...)
                return ; // 返回 
            } // 代码块结束

            //创建线程池 // 保留原作者写的行内注释
            ExecutorService threadPool = Executors.newFixedThreadPool(size); // 把 Executors.newFixedThreadPool(size) 赋值给 threadPool
            //计数器 // 保留原作者写的行内注释
            CountDownLatch countDownLatch = new CountDownLatch(size); // 创建 CountDownLatch 对象并赋值给 countDownLatch
            messageList.forEach(message -> { // 定义方法 方法(...)
                threadPool.execute(() -> { // 定义方法 方法(...)
                    log.debug("开始任务:{}",message); // 执行语句
                    //处理任务 // 保留原作者写的行内注释
                    try { // 尝试执行可能抛出异常的代码
                        boolean result = execute(message); // 把 execute(message) 赋值给 result
                        if(result){ // 定义方法 方法(...)
                            log.debug("任务执行成功:{})",message); // 执行语句
                            //更新任务状态,删除消息表记录,添加到历史表 // 保留原作者写的行内注释
                            int completed = mqMessageService.completed(message.getId()); // 把 mqMessageService.completed(message.getId()) 赋值给 completed
                            if (completed>0){ // 定义方法 方法(...)
                                log.debug("任务执行成功:{}",message); // 执行语句
                            }else{ // 代码逻辑
                                log.debug("任务执行失败:{}",message); // 执行语句
                            } // 代码块结束
                        } // 代码块结束
                    } catch (Exception e) { // 定义方法 catch(...)
                        e.printStackTrace(); // 执行语句
                        log.debug("任务出现异常:{},任务:{}",e.getMessage(),message); // 执行语句
                    }finally { // 代码逻辑
                        //计数 // 保留原作者写的行内注释
                        countDownLatch.countDown(); // 执行语句
                    } // 代码块结束
                    log.debug("结束任务:{}",message); // 执行语句

                }); // 执行语句
            }); // 执行语句

            //等待,给一个充裕的超时时间,防止无限等待,到达超时时间还没有处理完成则结束任务 // 保留原作者写的行内注释
            countDownLatch.await(timeout,TimeUnit.SECONDS); // 执行语句
            System.out.println("结束...."); // 执行语句
        } catch (InterruptedException e) { // 定义方法 catch(...)
           e.printStackTrace(); // 执行语句

        } // 代码块结束


    } // 代码块结束




} // 代码块结束

文件:xuecheng-plus-message-sdk/src/main/java/com/xuecheng/messagesdk/service/MqMessageHistoryService.java

package com.xuecheng.messagesdk.service; // 声明类所在的包路径

import com.baomidou.mybatisplus.extension.service.IService; // 导入 IService 类
import com.xuecheng.messagesdk.model.po.MqMessageHistory; // 导入 MqMessageHistory 类

/** // 保留原作者写的块注释
 * <p> // 保留原作者写的块注释
 *  服务类 // 保留原作者写的块注释
 * </p> // 保留原作者写的块注释
 * // 保留原作者写的块注释
 * @author itcast // 保留原作者写的块注释
 * @since 2022-09-21 // 保留原作者写的块注释
 */ // 保留原作者写的块注释
public interface MqMessageHistoryService extends IService<MqMessageHistory> { // 定义 interface MqMessageHistoryService

} // 代码块结束

文件:xuecheng-plus-message-sdk/src/main/java/com/xuecheng/messagesdk/service/MqMessageService.java

package com.xuecheng.messagesdk.service; // 声明类所在的包路径

import com.baomidou.mybatisplus.extension.service.IService; // 导入 IService 类
import com.xuecheng.messagesdk.model.po.MqMessage; // 导入 MqMessage 类

import java.util.List; // 导入 List 类

/** // 保留原作者写的块注释
 * <p> // 保留原作者写的块注释
 *  服务类 // 保留原作者写的块注释
 * </p> // 保留原作者写的块注释
 * // 保留原作者写的块注释
 * @author itcast // 保留原作者写的块注释
 * @since 2022-09-21 // 保留原作者写的块注释
 */ // 保留原作者写的块注释
public interface MqMessageService extends IService<MqMessage> { // 定义 interface MqMessageService

    /** // 保留原作者写的块注释
     * @description 扫描消息表记录,采用与扫描视频处理表相同的思路 // 保留原作者写的块注释
     * @param shardIndex 分片序号 // 保留原作者写的块注释
     * @param shardTotal 分片总数 // 保留原作者写的块注释
     * @param count 扫描记录数 // 保留原作者写的块注释
     * @return java.util.List 消息记录 // 保留原作者写的块注释
     * @author Mr.M // 保留原作者写的块注释
     * @date 2022/9/21 18:55 // 保留原作者写的块注释
     */ // 保留原作者写的块注释


    public List<MqMessage> getMessageList(int shardIndex, int shardTotal,  String messageType,int count); // 执行语句

    /** // 保留原作者写的块注释
     * @description 添加消息 // 保留原作者写的块注释
     * @param businessKey1 业务id // 保留原作者写的块注释
     * @param businessKey2 业务id // 保留原作者写的块注释
     * @param businessKey3 业务id // 保留原作者写的块注释
     * @return com.xuecheng.messagesdk.model.po.MqMessage 消息内容 // 保留原作者写的块注释
     * @author Mr.M // 保留原作者写的块注释
     * @date 2022/9/23 13:45 // 保留原作者写的块注释
    */ // 保留原作者写的块注释
    public MqMessage addMessage(String messageType,String businessKey1,String businessKey2,String businessKey3); // 执行语句
    /** // 保留原作者写的块注释
     * @description 完成任务 // 保留原作者写的块注释
     * @param id 消息id // 保留原作者写的块注释
     * @return int 更新成功:1 // 保留原作者写的块注释
     * @author Mr.M // 保留原作者写的块注释
     * @date 2022/9/21 20:49 // 保留原作者写的块注释
     */ // 保留原作者写的块注释
    public int completed(long id); // 执行语句

    /** // 保留原作者写的块注释
     * @description 完成阶段任务 // 保留原作者写的块注释
     * @param id 消息id // 保留原作者写的块注释
     * @return int 更新成功:1 // 保留原作者写的块注释
     * @author Mr.M // 保留原作者写的块注释
     * @date 2022/9/21 20:49 // 保留原作者写的块注释
     */ // 保留原作者写的块注释
    public int completedStageOne(long id); // 执行语句
    public int completedStageTwo(long id); // 执行语句
    public int completedStageThree(long id); // 执行语句
    public int completedStageFour(long id); // 执行语句

    /** // 保留原作者写的块注释
     * @description 查询阶段状态 // 保留原作者写的块注释
     * @param id // 保留原作者写的块注释
     * @return int // 保留原作者写的块注释
     * @author Mr.M // 保留原作者写的块注释
     * @date 2022/9/21 20:54 // 保留原作者写的块注释
    */ // 保留原作者写的块注释
    public int getStageOne(long id); // 执行语句
    public int getStageTwo(long id); // 执行语句
    public int getStageThree(long id); // 执行语句
    public int getStageFour(long id); // 执行语句

} // 代码块结束

文件:xuecheng-plus-message-sdk/src/test/java/com/xuecheng/messagesdk/MessagesdkApplication.java

package com.xuecheng.messagesdk; // 声明类所在的包路径


import org.springframework.boot.SpringApplication; // 导入 SpringApplication 类
import org.springframework.boot.autoconfigure.SpringBootApplication; // 导入 SpringBootApplication 类

@SpringBootApplication // 使用注解 @SpringBootApplication
public class MessagesdkApplication { // 定义 class MessagesdkApplication
	public static void main(String[] args) { // 定义方法 main(...)
		SpringApplication.run(MessagesdkApplication.class, args); // 执行语句
	} // 代码块结束
} // 代码块结束

文件:xuecheng-plus-message-sdk/src/test/resources/bootstrap.yml

spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://192.168.101.65:3306/xcplus_content?serverTimezone=UTC&userUnicode=true&useSSL=false&
    username: root
    password: mysql

# 日志文件配置路径
logging:
  config: classpath:log4j2-dev.xml
  level:
    org.springframework.cloud.gateway: trace

文件:xuecheng-plus-message-sdk/src/test/resources/log4j2-dev.xml

<?xml version="1.0" encoding="UTF-8"?> <!-- XML 声明 -->
<Configuration monitorInterval="180" packages=""> <!-- SQL 语句片段 -->
    <properties> <!-- SQL 语句片段 -->
        <property name="logdir">logs</property> <!-- SQL 语句片段 -->
        <property name="PATTERN">%date{YYYY-MM-dd HH:mm:ss,SSS} %level [%thread][%file:%line] - %msg%n%throwable</property> <!-- SQL 语句片段 -->
    </properties> <!-- SQL 语句片段 -->
    <Appenders> <!-- SQL 语句片段 -->
        <Console name="Console" target="SYSTEM_OUT"> <!-- SQL 语句片段 -->
            <PatternLayout pattern="${PATTERN}"/> <!-- SQL 语句片段 -->
        </Console> <!-- SQL 语句片段 -->

        <RollingFile name="ErrorAppender" fileName="${logdir}/error.log" <!-- SQL 语句片段 -->
            filePattern="${logdir}/$${date:yyyy-MM-dd}/error.%d{yyyy-MM-dd-HH}.log" append="true"> <!-- SQL 语句片段 -->
            <PatternLayout pattern="${PATTERN}"/> <!-- SQL 语句片段 -->
            <ThresholdFilter level="ERROR" onMatch="ACCEPT" onMismatch="DENY"/> <!-- SQL 语句片段 -->
            <Policies> <!-- SQL 语句片段 -->
                <TimeBasedTriggeringPolicy interval="1" modulate="true" /> <!-- SQL 语句片段 -->
            </Policies> <!-- SQL 语句片段 -->
        </RollingFile> <!-- SQL 语句片段 -->

        <RollingFile name="DebugAppender" fileName="${logdir}/info.log" <!-- SQL 语句片段 -->
            filePattern="${logdir}/$${date:yyyy-MM-dd}/info.%d{yyyy-MM-dd-HH}.log" append="true"> <!-- SQL 语句片段 -->
            <PatternLayout pattern="${PATTERN}"/> <!-- SQL 语句片段 -->
            <ThresholdFilter level="DEBUG" onMatch="ACCEPT" onMismatch="DENY"/> <!-- SQL 语句片段 -->
            <Policies> <!-- SQL 语句片段 -->
                <TimeBasedTriggeringPolicy interval="1" modulate="true" /> <!-- SQL 语句片段 -->
            </Policies> <!-- SQL 语句片段 -->
        </RollingFile> <!-- SQL 语句片段 -->
        
        <!--异步appender-->
         <Async name="AsyncAppender" includeLocation="true"> <!-- SQL 语句片段 -->
            <AppenderRef ref="ErrorAppender"/> <!-- SQL 语句片段 -->
            <AppenderRef ref="DebugAppender"/> <!-- SQL 语句片段 -->
        </Async> <!-- SQL 语句片段 -->
    </Appenders> <!-- SQL 语句片段 -->
    
    <Loggers> <!-- SQL 语句片段 -->
         <!--过滤掉spring和mybatis的一些无用的debug信息-->
        <logger name="org.springframework" level="INFO"> <!-- SQL 语句片段 -->
        </logger> <!-- SQL 语句片段 -->
        <logger name="org.mybatis" level="INFO"> <!-- SQL 语句片段 -->
        </logger> <!-- SQL 语句片段 -->
        <logger name="cn.itcast.wanxinp2p.consumer.mapper" level="DEBUG"> <!-- SQL 语句片段 -->
        </logger> <!-- SQL 语句片段 -->

        <logger name="springfox" level="INFO"> <!-- SQL 语句片段 -->
        </logger> <!-- SQL 语句片段 -->
		<logger name="org.apache.http" level="INFO"> <!-- SQL 语句片段 -->
        </logger> <!-- SQL 语句片段 -->
        <logger name="com.netflix.discovery" level="INFO"> <!-- SQL 语句片段 -->
        </logger> <!-- SQL 语句片段 -->
        
        <logger name="RocketmqCommon"  level="INFO" > <!-- SQL 语句片段 -->
		</logger> <!-- SQL 语句片段 -->
		
		<logger name="RocketmqRemoting" level="INFO"  > <!-- SQL 语句片段 -->
		</logger> <!-- SQL 语句片段 -->
		
		<logger name="RocketmqClient" level="WARN"> <!-- SQL 语句片段 -->
		</logger> <!-- SQL 语句片段 -->

        <logger name="org.dromara.hmily" level="WARN"> <!-- SQL 语句片段 -->
        </logger> <!-- SQL 语句片段 -->

        <logger name="org.dromara.hmily.lottery" level="WARN"> <!-- SQL 语句片段 -->
        </logger> <!-- SQL 语句片段 -->

        <logger name="org.dromara.hmily.bonuspoint" level="WARN"> <!-- SQL 语句片段 -->
        </logger> <!-- SQL 语句片段 -->
		
        <!--OFF   0-->
        <!--FATAL   100-->
        <!--ERROR   200-->
        <!--WARN   300-->
        <!--INFO   400-->
        <!--DEBUG   500-->
        <!--TRACE   600-->
        <!--ALL   Integer.MAX_VALUE-->
        <Root level="DEBUG" includeLocation="true"> <!-- SQL 语句片段 -->
            <AppenderRef ref="AsyncAppender"/> <!-- SQL 语句片段 -->
            <AppenderRef ref="Console"/> <!-- SQL 语句片段 -->
            <AppenderRef ref="DebugAppender"/> <!-- SQL 语句片段 -->
        </Root> <!-- SQL 语句片段 -->
    </Loggers> <!-- SQL 语句片段 -->
</Configuration> <!-- SQL 语句片段 -->
日志文件配置路径
https://clxhxhhr.top/posts/4377/
作者
clxstart
发布于
2026-09-26
许可协议
CC BY-NC-SA 4.0
评论
0 条
还没有评论,先写一条吧。