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;
    }

}

到此就大功告成了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章