show-cloud(十)通过rabitmq添加登陆日志

功能描述:系统登陆的时候发送一个请求到后台,后台并不是直接保存到数据库,而是先给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;
    }

}

到此就大功告成了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值