功能描述:系统登陆的时候发送一个请求到后台,后台并不是直接保存到数据库,而是先给rabitMq发送一条消息,然后监听消息队列,并消费消息将登陆日志保存到数据库中。
第一步:前台调用代码
var queryCommand = new QueryCommand({
url: PlatformPrefix + `${projectName.log}/businessLog/addLoginLog`,
method: "POST",
showTip: false
});
//设置不显示错误flag
queryCommand.setHasErrorFlag(false);
//执行同步查询
queryCommand.executeQuery({params:{tokenId:StorageUtils.getSessionItem("sessionId"),loginName:loginName}});
第二步:配置pom,添加mq到相关依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
第三步:添加mq队列
package org.go.show.log.autoconfigure;
import org.go.show.common.constants.LogQueue;
import org.springframework.amqp.core.Queue;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class LogAutoConfiguration {
/**
* 声明队列<br>
* 如果日志系统已启动,或者mq上已存在队列 LogQueue.LOG_QUEUE,此处不用声明此队列<br>
* 此处声明只是为了防止日志系统启动前,并且没有队列 LogQueue.LOG_QUEUE的情况下丢失消息
*
* @return
*/
@Bean
public Queue logQueue() {
return new Queue(LogQueue.LOG_QUEUE);
}
}
第四步:添加队列监听
package org.go.show.log.consumer;
import lombok.extern.slf4j.Slf4j;
import org.go.show.common.constants.LogQueue;
import org.go.show.common.context.ContextHolder;
import org.go.show.common.http.DataSet;
import org.go.show.log.i.BusinessLogService;
import org.go.show.log.pojo.BusinessLog;
import org.go.show.log.pojo.LoginLog;
import org.go.show.log.service.LogService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.RequestBody;
/**
* 从mq队列消费日志数据
*
*
*/
@Component
@Slf4j
public class LogConsumer {
@Value("${goshow.log.logServiceBean:logServiceDBImpl}")
String logServiceBean;
private LogService getLogService(){
return ContextHolder.getSpringBean(logServiceBean);
}
// /**
// * 处理消息
// *
// * @param entity
// */
// @RabbitHandler
// @RabbitListener(queues = LogQueue.LOG_QUEUE) // 监听队列
// public void logHandler(BusinessLog entity) {
// try {
// getLogService().save(entity);
// } catch (Exception e) {
// log.error("保存日志失败,日志:{},异常:{}", entity, e);
// }
// }
/**
* 处理消息
*
* @param entity
*/
@RabbitHandler
@RabbitListener(queues = LogQueue.LOG_QUEUE) // 监听队列
public void logHandler(LoginLog entity) {
try {
getLogService().saveLoginLog(entity);
} catch (Exception e) {
log.error("保存日志失败,日志:{},异常:{}", entity, e);
}
}
}
第五步:发送消息:
package org.go.show.log.service;
import org.go.show.common.constants.LogQueue;
import org.go.show.common.security.dto.User;
import org.go.show.common.utils.NetUtils;
import org.go.show.log.i.LoginLogService;
import org.go.show.log.pojo.BusinessLog;
import org.go.show.log.mapper.BusinessLogMapper;
import org.go.show.log.i.BusinessLogService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.go.show.log.pojo.LoginLog;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.go.show.common.dto.MoreQuery;
import org.springframework.transaction.annotation.Transactional;
import org.go.show.common.dto.QueryParam;
import org.springframework.amqp.core.AmqpTemplate;
/**
* <p>
* 操作日志表 服务实现类
* </p>
*
* @author gugu
* @since 2018-12-29
*/
@Service
@Transactional
public class BusinessLogServiceImpl extends ServiceImpl<BusinessLogMapper, BusinessLog> implements BusinessLogService {
@Autowired
private AmqpTemplate amqpTemplate;
@Autowired
private LoginLogService loginLogService;
@Override
public Page<BusinessLog> listPage(Page<BusinessLog> page, QueryWrapper ew) {
return page.setRecords(baseMapper.selectPage(page,ew).getRecords());
}
@Override
public Page<BusinessLog> moreQuery(Page page, MoreQuery[] moreQuerys) {
return page.setRecords(baseMapper.selectPage(page,QueryParam.getQueryWrapper(moreQuerys)).getRecords());
}
@Override
public BusinessLog selectById(Long id) {
return baseMapper.selectById(id);
}
@Override
public boolean insert(BusinessLog entity) {
baseMapper.insert(entity);
return true;
}
@Override
public LoginLog addLoginLog(User user) {
LoginLog loggerEntity=new LoginLog();
loggerEntity.setLoginName(user.getLoginName());
loggerEntity.setUserName(user.getUsername());
loggerEntity.setRequestIp(NetUtils.getIpAddr());
try{
amqpTemplate.convertAndSend(LogQueue.LOG_QUEUE, loggerEntity);
}catch (Exception e){
log.error(e.getMessage());
}
return loggerEntity;
}
}
到此就大功告成了。