159 Star 1.6K Fork 755

铱塔智联开源/iot-iita

 / 详情

@EventListener和@Async一起使用,异步未生效

待确认
缺陷
创建于  
2024-06-04 16:10

@EventListener注解是立即执行的,应该单独建一个java文件放@Async,在异步方法中写入事件。另外启动类上增加注解@EnableAsync,使异步生效。已测试,异步生效了

以下是部分代码(以登录为例)。
SysLoginService.java

public String login(String tenantId, String username, String password, String code, String uuid) {
        boolean captchaEnabled = captchaProperties.getEnable();
        // 验证码开关
        if (captchaEnabled) {
            validateCaptcha(tenantId, username, code, uuid);
        }
        // 校验租户
        checkTenant(tenantId);

        //未登录前临时设置租户id
        LoginHelper.setTenantId(tenantId);
        SysUserVo user = loadUserByUsername(tenantId, username);
        user.setTenantId(tenantId);
        checkLogin(LoginType.PASSWORD, tenantId, username, () -> !BCrypt.checkpw(password, user.getPassword()));
        // 此处可根据登录用户的数据不同 自行创建 loginUser
        LoginUser loginUser = buildLoginUser(user);
        // 生成token
        LoginHelper.loginByDevice(loginUser, DeviceType.PC);
        HttpServletRequest request = ServletUtils.getRequest();
        final UserAgent userAgent = UserAgentUtil.parse(request.getHeader("User-Agent"));
        final String ip = IpUtils.getRealIP(request);
        Logininfor logininfor = this.fillLogininfor(loginUser.getTenantId(), username, Constants.LOGIN_SUCCESS, MessageUtils.message("user.login.success"), userAgent, ip);
        asyncLoginInfoService.recordLoginInfo(logininfor);
        System.out.println("-------------------------1111");
        recordLoginInfo(user.getId());
        return StpUtil.getTokenValue();
    }
    //填充信息
    private Logininfor fillLogininfor(String tenantId, String username, String status,
                                      String message, UserAgent userAgent, String ip){
        Logininfor logininfor = new Logininfor();
        logininfor.setTenantId(tenantId);
        logininfor.setUsername(username);
        logininfor.setStatus(status);
        logininfor.setMessage(message);
//        logininfor.setRequest(request);
        logininfor.setIp(ip);
        logininfor.setUserAgent(userAgent);
        return logininfor;
    }

异步方法:AsyncLoginInfoService.java

package cc.iotkit.system.async;

import cc.iotkit.common.log.event.LogininforEvent;
import cc.iotkit.common.log.model.Logininfor;
import cc.iotkit.common.utils.SpringUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;


@Slf4j
@Service
public class AsyncLoginInfoService {

    /**
     * 记录登录信息
     *
     */
    @Async
    public void recordLoginInfo(Logininfor logininfor) {
        LogininforEvent logininforE = new LogininforEvent(logininfor);
        SpringUtils.context().publishEvent(logininforE);
    }
}

SysLogininforServiceImpl.java

/**
     * 记录登录信息
     *
     * @param logininforEvent 登录事件
     */
    @EventListener(classes = {LogininforEvent.class})
    public void recordLogininforListener(LogininforEvent logininforEvent) {
        Logininfor logininfor1 = logininforEvent.getLogininfor();
        final UserAgent userAgent = logininfor1.getUserAgent();
        final String ip = logininfor1.getIp();

        String address = AddressUtils.getRealAddressByIP(ip);
        StringBuilder s = new StringBuilder();
        s.append(getBlock(ip));
        s.append(address);
        s.append(getBlock(logininfor1.getUsername()));
        s.append(getBlock(logininfor1.getStatus()));
        s.append(getBlock(logininfor1.getMessage()));
        // 打印信息到日志
        log.info(s.toString(), logininfor1.getArgs());
        // 获取客户端操作系统
        String os = userAgent.getOs().getName();
        // 获取客户端浏览器
        String browser = userAgent.getBrowser().getName();
        // 封装对象
        SysLoginInfoBo logininfor = new SysLoginInfoBo();
        logininfor.setTenantId(logininfor1.getTenantId());
        logininfor.setUserName(logininfor1.getUsername());
        logininfor.setIpaddr(ip);
        logininfor.setLoginLocation(address);
        logininfor.setBrowser(browser);
        logininfor.setOs(os);
        logininfor.setMsg(logininfor1.getMessage());
        // 日志状态
        if (StringUtils.equalsAny(logininfor1.getStatus(), Constants.LOGIN_SUCCESS, Constants.LOGOUT, Constants.REGISTER)) {
            logininfor.setStatus(Constants.SUCCESS);
        } else if (Constants.LOGIN_FAIL.equals(logininfor1.getStatus())) {
            logininfor.setStatus(Constants.FAIL);
        }
        // 插入数据
        insertLogininfor(logininfor);
    }

评论 (0)

hushui123456 创建了缺陷

登录 后才可以发表评论

状态
负责人
项目
里程碑
Pull Requests
关联的 Pull Requests 被合并后可能会关闭此 issue
分支
开始日期   -   截止日期
-
置顶选项
优先级
预计工期 (小时)
参与者(1)
Java
1
https://gitee.com/open-iita/iotkit-parent.git
git@gitee.com:open-iita/iotkit-parent.git
open-iita
iotkit-parent
iot-iita

搜索帮助

Cb406eda 1850385 E526c682 1850385