13460 字
约 44 分钟
29
日志文件配置路径
2026-09-26
无标签
附录J 消息SDK模块源码详解
模块概览(面向 0 基础读者):
- 封装可靠消息投递与补偿机制,支撑跨服务一致性。
- 提供消息任务表、发送服务、消费确认等统一实现。
- 可与订单、学习等模块配合完成支付成功等事件通知。
核心目录:
xuecheng-plus-message-sdk/src/main/java/com/xuecheng/messagesdk/servicexuecheng-plus-message-sdk/src/main/java/com/xuecheng/messagesdk/mapperxuecheng-plus-message-sdk/src/main/java/com/xuecheng/messagesdk/configxuecheng-plus-message-sdk/src/main/java/com/xuecheng/messagesdk/modelxuecheng-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 语句片段 -->
评论
0 条
还没有评论,先写一条吧。