From 8349e631d2cbef27d2f0c841a37ce499e69ecaff Mon Sep 17 00:00:00 2001 From: 疯狂的狮子li <15040126243@163.com> Date: 星期六, 12 六月 2021 20:14:50 +0800 Subject: [PATCH] update 优化 异步工厂重写 使用 spring 异步处理 --- ruoyi-framework/src/main/java/com/ruoyi/framework/manager/ShutdownManager.java | 54 ++++---- ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/AsyncService.java | 96 ++++++++++++++++ /dev/null | 111 ------------------ ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/SysLoginService.java | 20 +- ruoyi-framework/src/main/java/com/ruoyi/framework/security/handle/LogoutSuccessHandlerImpl.java | 53 ++++---- ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/LogAspect.java | 8 ruoyi-framework/src/main/java/com/ruoyi/framework/config/AsyncConfig.java | 11 + 7 files changed, 172 insertions(+), 181 deletions(-) diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/LogAspect.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/LogAspect.java index 442d258..280a60c 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/LogAspect.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/LogAspect.java @@ -8,10 +8,8 @@ import com.ruoyi.common.enums.BusinessStatus; import com.ruoyi.common.enums.HttpMethod; import com.ruoyi.common.utils.ServletUtils; -import com.ruoyi.common.utils.ip.IpUtils; import com.ruoyi.common.utils.spring.SpringUtils; -import com.ruoyi.framework.manager.AsyncManager; -import com.ruoyi.framework.manager.factory.AsyncFactory; +import com.ruoyi.framework.web.service.AsyncService; import com.ruoyi.framework.web.service.TokenService; import com.ruoyi.system.domain.SysOperLog; import org.aspectj.lang.JoinPoint; @@ -93,7 +91,7 @@ SysOperLog operLog = new SysOperLog(); operLog.setStatus(BusinessStatus.SUCCESS.ordinal()); // 璇锋眰鐨勫湴鍧� - String ip = IpUtils.getIpAddr(ServletUtils.getRequest()); + String ip = ServletUtils.getClientIP(); operLog.setOperIp(ip); // 杩斿洖鍙傛暟 operLog.setJsonResult(JSON.toJSONString(jsonResult)); @@ -118,7 +116,7 @@ // 澶勭悊璁剧疆娉ㄨВ涓婄殑鍙傛暟 getControllerMethodDescription(joinPoint, controllerLog, operLog); // 淇濆瓨鏁版嵁搴� - AsyncManager.me().execute(AsyncFactory.recordOper(operLog)); + SpringUtils.getBean(AsyncService.class).recordOper(operLog); } catch (Exception exp) { diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/AsyncConfig.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/AsyncConfig.java index 5c11ae6..2eb4eb3 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/AsyncConfig.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/AsyncConfig.java @@ -2,6 +2,8 @@ import com.ruoyi.common.exception.CustomException; import org.springframework.aop.interceptor.AsyncUncaughtExceptionHandler; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.context.annotation.Configuration; import org.springframework.scheduling.annotation.AsyncConfigurerSupport; import org.springframework.scheduling.annotation.EnableAsync; @@ -9,7 +11,7 @@ import java.util.Arrays; import java.util.concurrent.Executor; -import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; /** * 寮傛閰嶇疆 @@ -20,13 +22,16 @@ @Configuration public class AsyncConfig extends AsyncConfigurerSupport { + @Autowired + @Qualifier("scheduledExecutorService") + private ScheduledExecutorService scheduledExecutorService; + /** * 寮傛鎵ц闇�瑕佷娇鐢ㄦ潈闄愭鏋惰嚜甯︾殑鍖呰绾跨▼姹� 淇濊瘉鏉冮檺淇℃伅鐨勪紶閫� */ @Override public Executor getAsyncExecutor() { - return new DelegatingSecurityContextExecutorService( - Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors())); + return new DelegatingSecurityContextExecutorService(scheduledExecutorService); } /** diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/manager/AsyncManager.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/manager/AsyncManager.java deleted file mode 100644 index 7387a02..0000000 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/manager/AsyncManager.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.ruoyi.framework.manager; - -import java.util.TimerTask; -import java.util.concurrent.ScheduledExecutorService; -import java.util.concurrent.TimeUnit; -import com.ruoyi.common.utils.Threads; -import com.ruoyi.common.utils.spring.SpringUtils; - -/** - * 寮傛浠诲姟绠$悊鍣� - * - * @author ruoyi - */ -public class AsyncManager -{ - /** - * 鎿嶄綔寤惰繜10姣 - */ - private final int OPERATE_DELAY_TIME = 10; - - /** - * 寮傛鎿嶄綔浠诲姟璋冨害绾跨▼姹� - */ - private ScheduledExecutorService executor = SpringUtils.getBean("scheduledExecutorService"); - - /** - * 鍗曚緥妯″紡 - */ - private AsyncManager(){} - - private static AsyncManager me = new AsyncManager(); - - public static AsyncManager me() - { - return me; - } - - /** - * 鎵ц浠诲姟 - * - * @param task 浠诲姟 - */ - public void execute(TimerTask task) - { - executor.schedule(task, OPERATE_DELAY_TIME, TimeUnit.MILLISECONDS); - } - - /** - * 鍋滄浠诲姟绾跨▼姹� - */ - public void shutdown() - { - Threads.shutdownAndAwaitTermination(executor); - } -} diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/manager/ShutdownManager.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/manager/ShutdownManager.java index e36ca3c..4ed5366 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/manager/ShutdownManager.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/manager/ShutdownManager.java @@ -1,39 +1,41 @@ package com.ruoyi.framework.manager; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +import com.ruoyi.common.utils.Threads; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.stereotype.Component; + import javax.annotation.PreDestroy; +import java.util.concurrent.ScheduledExecutorService; /** * 纭繚搴旂敤閫�鍑烘椂鑳藉叧闂悗鍙扮嚎绋� * - * @author ruoyi + * @author Lion Li */ +@Slf4j(topic = "sys-user") @Component -public class ShutdownManager -{ - private static final Logger logger = LoggerFactory.getLogger("sys-user"); +public class ShutdownManager { - @PreDestroy - public void destroy() - { - shutdownAsyncManager(); - } + @Autowired + @Qualifier("scheduledExecutorService") + private ScheduledExecutorService scheduledExecutorService; - /** - * 鍋滄寮傛鎵ц浠诲姟 - */ - private void shutdownAsyncManager() - { - try - { - logger.info("====鍏抽棴鍚庡彴浠诲姟浠诲姟绾跨▼姹�===="); - AsyncManager.me().shutdown(); - } - catch (Exception e) - { - logger.error(e.getMessage(), e); - } - } + @PreDestroy + public void destroy() { + shutdownAsyncManager(); + } + + /** + * 鍋滄寮傛鎵ц浠诲姟 + */ + private void shutdownAsyncManager() { + try { + log.info("====鍏抽棴鍚庡彴浠诲姟浠诲姟绾跨▼姹�===="); + Threads.shutdownAndAwaitTermination(scheduledExecutorService); + } catch (Exception e) { + log.error(e.getMessage(), e); + } + } } diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/manager/factory/AsyncFactory.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/manager/factory/AsyncFactory.java deleted file mode 100644 index d0147a2..0000000 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/manager/factory/AsyncFactory.java +++ /dev/null @@ -1,111 +0,0 @@ -package com.ruoyi.framework.manager.factory; - -import cn.hutool.http.useragent.UserAgent; -import cn.hutool.http.useragent.UserAgentUtil; -import com.ruoyi.common.constant.Constants; -import com.ruoyi.common.utils.ServletUtils; -import com.ruoyi.common.utils.ip.AddressUtils; -import com.ruoyi.common.utils.ip.IpUtils; -import com.ruoyi.common.utils.spring.SpringUtils; -import com.ruoyi.system.domain.SysLogininfor; -import com.ruoyi.system.domain.SysOperLog; -import com.ruoyi.system.service.ISysLogininforService; -import com.ruoyi.system.service.ISysOperLogService; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.util.TimerTask; - -/** - * 寮傛宸ュ巶锛堜骇鐢熶换鍔$敤锛� - * - * @author ruoyi - */ -public class AsyncFactory -{ - private static final Logger sys_user_logger = LoggerFactory.getLogger("sys-user"); - - /** - * 璁板綍鐧诲綍淇℃伅 - * - * @param username 鐢ㄦ埛鍚� - * @param status 鐘舵�� - * @param message 娑堟伅 - * @param args 鍒楄〃 - * @return 浠诲姟task - */ - public static TimerTask recordLogininfor(final String username, final String status, final String message, - final Object... args) - { - final UserAgent userAgent = UserAgentUtil.parse(ServletUtils.getRequest().getHeader("User-Agent")); - final String ip = IpUtils.getIpAddr(ServletUtils.getRequest()); - return new TimerTask() - { - @Override - public void run() - { - String address = AddressUtils.getRealAddressByIP(ip); - StringBuilder s = new StringBuilder(); - s.append(getBlock(ip)); - s.append(address); - s.append(getBlock(username)); - s.append(getBlock(status)); - s.append(getBlock(message)); - // 鎵撳嵃淇℃伅鍒版棩蹇� - sys_user_logger.info(s.toString(), args); - // 鑾峰彇瀹㈡埛绔搷浣滅郴缁� - String os = userAgent.getOs().getName(); - // 鑾峰彇瀹㈡埛绔祻瑙堝櫒 - String browser = userAgent.getBrowser().getName(); - // 灏佽瀵硅薄 - SysLogininfor logininfor = new SysLogininfor(); - logininfor.setUserName(username); - logininfor.setIpaddr(ip); - logininfor.setLoginLocation(address); - logininfor.setBrowser(browser); - logininfor.setOs(os); - logininfor.setMsg(message); - // 鏃ュ織鐘舵�� - if (Constants.LOGIN_SUCCESS.equals(status) || Constants.LOGOUT.equals(status)) - { - logininfor.setStatus(Constants.SUCCESS); - } - else if (Constants.LOGIN_FAIL.equals(status)) - { - logininfor.setStatus(Constants.FAIL); - } - // 鎻掑叆鏁版嵁 - SpringUtils.getBean(ISysLogininforService.class).insertLogininfor(logininfor); - } - }; - } - - /** - * 鎿嶄綔鏃ュ織璁板綍 - * - * @param operLog 鎿嶄綔鏃ュ織淇℃伅 - * @return 浠诲姟task - */ - public static TimerTask recordOper(final SysOperLog operLog) - { - return new TimerTask() - { - @Override - public void run() - { - // 杩滅▼鏌ヨ鎿嶄綔鍦扮偣 - operLog.setOperLocation(AddressUtils.getRealAddressByIP(operLog.getOperIp())); - SpringUtils.getBean(ISysOperLogService.class).insertOperlog(operLog); - } - }; - } - - public static String getBlock(Object msg) - { - if (msg == null) - { - msg = ""; - } - return "[" + msg.toString() + "]"; - } -} diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/security/handle/LogoutSuccessHandlerImpl.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/security/handle/LogoutSuccessHandlerImpl.java index e79f468..3ce2447 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/security/handle/LogoutSuccessHandlerImpl.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/security/handle/LogoutSuccessHandlerImpl.java @@ -7,8 +7,7 @@ import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.core.domain.model.LoginUser; import com.ruoyi.common.utils.ServletUtils; -import com.ruoyi.framework.manager.AsyncManager; -import com.ruoyi.framework.manager.factory.AsyncFactory; +import com.ruoyi.framework.web.service.AsyncService; import com.ruoyi.framework.web.service.TokenService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Configuration; @@ -22,33 +21,33 @@ /** * 鑷畾涔夐��鍑哄鐞嗙被 杩斿洖鎴愬姛 - * + * * @author ruoyi */ @Configuration -public class LogoutSuccessHandlerImpl implements LogoutSuccessHandler -{ - @Autowired - private TokenService tokenService; +public class LogoutSuccessHandlerImpl implements LogoutSuccessHandler { - /** - * 閫�鍑哄鐞� - * - * @return - */ - @Override - public void onLogoutSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) - throws IOException, ServletException - { - LoginUser loginUser = tokenService.getLoginUser(request); - if (Validator.isNotNull(loginUser)) - { - String userName = loginUser.getUsername(); - // 鍒犻櫎鐢ㄦ埛缂撳瓨璁板綍 - tokenService.delLoginUser(loginUser.getToken()); - // 璁板綍鐢ㄦ埛閫�鍑烘棩蹇� - AsyncManager.me().execute(AsyncFactory.recordLogininfor(userName, Constants.LOGOUT, "閫�鍑烘垚鍔�")); - } - ServletUtils.renderString(response, JSON.toJSONString(AjaxResult.error(HttpStatus.HTTP_OK, "閫�鍑烘垚鍔�"))); - } + @Autowired + private TokenService tokenService; + + @Autowired + private AsyncService asyncService; + + /** + * 閫�鍑哄鐞� + */ + @Override + public void onLogoutSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) + throws IOException, ServletException { + LoginUser loginUser = tokenService.getLoginUser(request); + if (Validator.isNotNull(loginUser)) { + String userName = loginUser.getUsername(); + // 鍒犻櫎鐢ㄦ埛缂撳瓨璁板綍 + tokenService.delLoginUser(loginUser.getToken()); + // 璁板綍鐢ㄦ埛閫�鍑烘棩蹇� + asyncService.recordLogininfor(userName, Constants.LOGOUT, "閫�鍑烘垚鍔�", request); + } + ServletUtils.renderString(response, JSON.toJSONString(AjaxResult.error(HttpStatus.HTTP_OK, "閫�鍑烘垚鍔�"))); + } + } diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/AsyncService.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/AsyncService.java new file mode 100644 index 0000000..e64fbc1 --- /dev/null +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/AsyncService.java @@ -0,0 +1,96 @@ +package com.ruoyi.framework.web.service; + +import cn.hutool.http.useragent.UserAgent; +import cn.hutool.http.useragent.UserAgentUtil; +import com.ruoyi.common.constant.Constants; +import com.ruoyi.common.utils.ServletUtils; +import com.ruoyi.common.utils.ip.AddressUtils; +import com.ruoyi.system.domain.SysLogininfor; +import com.ruoyi.system.domain.SysOperLog; +import com.ruoyi.system.service.ISysLogininforService; +import com.ruoyi.system.service.ISysOperLogService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Component; + +import javax.servlet.http.HttpServletRequest; + +/** + * 寮傛宸ュ巶锛堜骇鐢熶换鍔$敤锛� + * + * @author Lion Li + */ +@Slf4j(topic = "sys-user") +@Async +@Component +public class AsyncService { + + @Autowired + private ISysLogininforService iSysLogininforService; + + @Autowired + private ISysOperLogService iSysOperLogService; + + /** + * 璁板綍鐧诲綍淇℃伅 + * + * @param username 鐢ㄦ埛鍚� + * @param status 鐘舵�� + * @param message 娑堟伅 + * @param args 鍒楄〃 + */ + public void recordLogininfor(final String username, final String status, final String message, + HttpServletRequest request, final Object... args) { + final UserAgent userAgent = UserAgentUtil.parse(request.getHeader("User-Agent")); + final String ip = ServletUtils.getClientIP(request); + + String address = AddressUtils.getRealAddressByIP(ip); + StringBuilder s = new StringBuilder(); + s.append(getBlock(ip)); + s.append(address); + s.append(getBlock(username)); + s.append(getBlock(status)); + s.append(getBlock(message)); + // 鎵撳嵃淇℃伅鍒版棩蹇� + log.info(s.toString(), args); + // 鑾峰彇瀹㈡埛绔搷浣滅郴缁� + String os = userAgent.getOs().getName(); + // 鑾峰彇瀹㈡埛绔祻瑙堝櫒 + String browser = userAgent.getBrowser().getName(); + // 灏佽瀵硅薄 + SysLogininfor logininfor = new SysLogininfor(); + logininfor.setUserName(username); + logininfor.setIpaddr(ip); + logininfor.setLoginLocation(address); + logininfor.setBrowser(browser); + logininfor.setOs(os); + logininfor.setMsg(message); + // 鏃ュ織鐘舵�� + if (Constants.LOGIN_SUCCESS.equals(status) || Constants.LOGOUT.equals(status)) { + logininfor.setStatus(Constants.SUCCESS); + } else if (Constants.LOGIN_FAIL.equals(status)) { + logininfor.setStatus(Constants.FAIL); + } + // 鎻掑叆鏁版嵁 + iSysLogininforService.insertLogininfor(logininfor); + } + + /** + * 鎿嶄綔鏃ュ織璁板綍 + * + * @param operLog 鎿嶄綔鏃ュ織淇℃伅 + */ + public void recordOper(final SysOperLog operLog) { + // 杩滅▼鏌ヨ鎿嶄綔鍦扮偣 + operLog.setOperLocation(AddressUtils.getRealAddressByIP(operLog.getOperIp())); + iSysOperLogService.insertOperlog(operLog); + } + + private String getBlock(Object msg) { + if (msg == null) { + msg = ""; + } + return "[" + msg.toString() + "]"; + } +} diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/SysLoginService.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/SysLoginService.java index bc22ca0..d0b9511 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/SysLoginService.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/SysLoginService.java @@ -11,10 +11,7 @@ import com.ruoyi.common.utils.DateUtils; import com.ruoyi.common.utils.MessageUtils; import com.ruoyi.common.utils.ServletUtils; -import com.ruoyi.common.utils.ip.IpUtils; import com.ruoyi.framework.config.properties.CaptchaProperties; -import com.ruoyi.framework.manager.AsyncManager; -import com.ruoyi.framework.manager.factory.AsyncFactory; import com.ruoyi.system.service.ISysUserService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.authentication.AuthenticationManager; @@ -24,6 +21,7 @@ import org.springframework.stereotype.Component; import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; /** * 鐧诲綍鏍¢獙鏂规硶 @@ -48,6 +46,9 @@ @Autowired private ISysUserService userService; + @Autowired + private AsyncService asyncService; + /** * 鐧诲綍楠岃瘉 * @@ -59,16 +60,17 @@ */ public String login(String username, String password, String code, String uuid) { + HttpServletRequest request = ServletUtils.getRequest(); if(captchaProperties.getEnabled()) { String verifyKey = Constants.CAPTCHA_CODE_KEY + uuid; String captcha = redisCache.getCacheObject(verifyKey); redisCache.deleteObject(verifyKey); if (captcha == null) { - AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.jcaptcha.expire"))); + asyncService.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.jcaptcha.expire"), request); throw new CaptchaExpireException(); } if (!code.equalsIgnoreCase(captcha)) { - AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.jcaptcha.error"))); + asyncService.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.jcaptcha.error"), request); throw new CaptchaException(); } } @@ -84,16 +86,16 @@ { if (e instanceof BadCredentialsException) { - AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.password.not.match"))); + asyncService.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.password.not.match"), request); throw new UserPasswordNotMatchException(); } else { - AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, e.getMessage())); + asyncService.recordLogininfor(username, Constants.LOGIN_FAIL, e.getMessage(), request); throw new CustomException(e.getMessage()); } } - AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_SUCCESS, MessageUtils.message("user.login.success"))); + asyncService.recordLogininfor(username, Constants.LOGIN_SUCCESS, MessageUtils.message("user.login.success"), request); LoginUser loginUser = (LoginUser) authentication.getPrincipal(); recordLoginInfo(loginUser.getUser()); // 鐢熸垚token @@ -105,7 +107,7 @@ */ public void recordLoginInfo(SysUser user) { - user.setLoginIp(IpUtils.getIpAddr(ServletUtils.getRequest())); + user.setLoginIp(ServletUtils.getClientIP()); user.setLoginDate(DateUtils.getNowDate()); user.setUpdateBy(user.getUserName()); userService.updateUserProfile(user); -- Gitblit v1.9.3