功能描述:系統登陸的時候發送一個請求到後臺,後臺並不是直接保存到數據庫,而是先給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;
}
}
到此就大功告成了。