|
|
@@ -10,6 +10,7 @@ import com.fs.company.domain.CompanyLogininfor;
|
|
|
import com.fs.company.domain.CompanyOperLog;
|
|
|
import com.fs.company.service.ICompanyLogininforService;
|
|
|
import com.fs.company.service.ICompanyOperLogService;
|
|
|
+import com.fs.framework.datasource.DynamicDataSourceContextHolder;
|
|
|
import eu.bitwalker.useragentutils.UserAgent;
|
|
|
import org.slf4j.Logger;
|
|
|
import org.slf4j.LoggerFactory;
|
|
|
@@ -40,45 +41,54 @@ public class AsyncFactory
|
|
|
{
|
|
|
final UserAgent userAgent = UserAgent.parseUserAgentString(ServletUtils.getRequest().getHeader("User-Agent"));
|
|
|
final String ip = IpUtils.getIpAddr(ServletUtils.getRequest());
|
|
|
+ // 在主线程捕获当前数据源key(租户标识),避免异步线程ThreadLocal丢失导致写入主库
|
|
|
+ final String dsKey = DynamicDataSourceContextHolder.getDataSourceType();
|
|
|
return new TimerTask()
|
|
|
{
|
|
|
@Override
|
|
|
public void run()
|
|
|
{
|
|
|
- String address = AddressUtils.getRealAddressByIP(ip);
|
|
|
- StringBuilder s = new StringBuilder();
|
|
|
- s.append(LogUtils.getBlock(ip));
|
|
|
- s.append(address);
|
|
|
- s.append(LogUtils.getBlock(username));
|
|
|
- s.append(LogUtils.getBlock(status));
|
|
|
- s.append(LogUtils.getBlock(message));
|
|
|
- // 打印信息到日志
|
|
|
- sys_user_logger.info(s.toString(), args);
|
|
|
- // 获取客户端操作系统
|
|
|
- String os = userAgent.getOperatingSystem().getName();
|
|
|
- // 获取客户端浏览器
|
|
|
- String browser = userAgent.getBrowser().getName();
|
|
|
- // 封装对象
|
|
|
- CompanyLogininfor logininfor = new CompanyLogininfor();
|
|
|
- logininfor.setCompanyId(companyId);
|
|
|
- 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);
|
|
|
+ try {
|
|
|
+ if (dsKey != null) {
|
|
|
+ DynamicDataSourceContextHolder.setDataSourceType(dsKey);
|
|
|
+ }
|
|
|
+ String address = AddressUtils.getRealAddressByIP(ip);
|
|
|
+ StringBuilder s = new StringBuilder();
|
|
|
+ s.append(LogUtils.getBlock(ip));
|
|
|
+ s.append(address);
|
|
|
+ s.append(LogUtils.getBlock(username));
|
|
|
+ s.append(LogUtils.getBlock(status));
|
|
|
+ s.append(LogUtils.getBlock(message));
|
|
|
+ // 打印信息到日志
|
|
|
+ sys_user_logger.info(s.toString(), args);
|
|
|
+ // 获取客户端操作系统
|
|
|
+ String os = userAgent.getOperatingSystem().getName();
|
|
|
+ // 获取客户端浏览器
|
|
|
+ String browser = userAgent.getBrowser().getName();
|
|
|
+ // 封装对象
|
|
|
+ CompanyLogininfor logininfor = new CompanyLogininfor();
|
|
|
+ logininfor.setCompanyId(companyId);
|
|
|
+ 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);
|
|
|
+ }
|
|
|
+ logininfor.setLoginTime(new Date());
|
|
|
+ // 插入数据
|
|
|
+ SpringUtils.getBean(ICompanyLogininforService.class).insertCompanyLogininfor(logininfor);
|
|
|
+ } finally {
|
|
|
+ DynamicDataSourceContextHolder.clearDataSourceType();
|
|
|
}
|
|
|
- else if (Constants.LOGIN_FAIL.equals(status))
|
|
|
- {
|
|
|
- logininfor.setStatus(Constants.FAIL);
|
|
|
- }
|
|
|
- logininfor.setLoginTime(new Date());
|
|
|
- // 插入数据
|
|
|
- SpringUtils.getBean(ICompanyLogininforService.class).insertCompanyLogininfor(logininfor);
|
|
|
}
|
|
|
};
|
|
|
}
|
|
|
@@ -91,15 +101,24 @@ public class AsyncFactory
|
|
|
*/
|
|
|
public static TimerTask recordOper(final CompanyOperLog operLog)
|
|
|
{
|
|
|
+ // 在主线程捕获当前数据源key(租户标识),避免异步线程ThreadLocal丢失导致写入主库
|
|
|
+ final String dsKey = DynamicDataSourceContextHolder.getDataSourceType();
|
|
|
return new TimerTask()
|
|
|
{
|
|
|
@Override
|
|
|
public void run()
|
|
|
{
|
|
|
- // 远程查询操作地点
|
|
|
- operLog.setOperTime(new Date());
|
|
|
- operLog.setOperLocation(AddressUtils.getRealAddressByIP(operLog.getOperIp()));
|
|
|
- SpringUtils.getBean(ICompanyOperLogService.class).insertCompanyOperLog(operLog);
|
|
|
+ try {
|
|
|
+ if (dsKey != null) {
|
|
|
+ DynamicDataSourceContextHolder.setDataSourceType(dsKey);
|
|
|
+ }
|
|
|
+ // 远程查询操作地点
|
|
|
+ operLog.setOperTime(new Date());
|
|
|
+ operLog.setOperLocation(AddressUtils.getRealAddressByIP(operLog.getOperIp()));
|
|
|
+ SpringUtils.getBean(ICompanyOperLogService.class).insertCompanyOperLog(operLog);
|
|
|
+ } finally {
|
|
|
+ DynamicDataSourceContextHolder.clearDataSourceType();
|
|
|
+ }
|
|
|
}
|
|
|
};
|
|
|
}
|