
com.flyfish.oauth.entry.auditing.AuditingExecutor Maven / Gradle / Ivy
package com.flyfish.oauth.entry.auditing;
import com.flyfish.oauth.domain.auditing.AuditingRecord;
import com.flyfish.oauth.domain.auditing.AuditingStrategy;
import com.flyfish.oauth.entry.AuditingEntryPoint;
import com.flyfish.oauth.utils.JacksonUtil;
import lombok.AllArgsConstructor;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.collections4.MapUtils;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.text.MessageFormat;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
/**
* 审计执行器
*
* @author wangyu
* 审计时使用线程池来完成,此处提供默认配置,后续提供定制化配置
*/
public class AuditingExecutor {
private static final List DEFAULT_MESSAGE_IDS = Arrays.asList("msg", "message", "tip");
// 创建一个核心为1,最大为1000并发的线程池,并指定空闲时立即结束多余线程
private final ExecutorService executorService = new ThreadPoolExecutor(1, 1000,
0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue());
/**
* 核心业务,执行审计
*
* @param entryPoint 接入点
* @param request 请求
*/
public void audit(AuditingEntryPoint entryPoint, AuditingRequest request) {
executorService.execute(new AuditingTask(entryPoint, request));
}
/**
* 审计任务
*/
@AllArgsConstructor
private static class AuditingTask implements Runnable {
private final AuditingEntryPoint entryPoint;
private final AuditingRequest request;
@Override
public void run() {
// 消费并清空上下文
if (null != request.getContent()) {
String response = new String(request.getContent(), StandardCharsets.UTF_8);
try {
// 判空
if (request.getContent().length == 0) {
entryPoint.apply(buildRecord("无响应数据", request.getStrategy()));
return;
}
// 尝试转换为json对象,这里是map
Map resultMap = JacksonUtil.json2Map(response);
// 查询字段
List results = request.getStrategy().getResults();
// 查询结果
String identifier = null;
// 无响应信息,直接返回
if (resultMap == null) {
// 构建和请求
entryPoint.apply(buildRecord("无响应数据", request.getStrategy()));
return;
}
if (CollectionUtils.isNotEmpty(results)) {
identifier = results.get(0).getIdentifier();
} else {
for (String id : DEFAULT_MESSAGE_IDS) {
if (resultMap.containsKey(id)) {
identifier = id;
break;
}
}
}
// 构建和请求
entryPoint.apply(buildRecord(identifier == null ? "无响应数据" :
MapUtils.getString(resultMap, identifier), request.getStrategy()));
} catch (Exception e) {
e.printStackTrace();
try {
AuditingRecord record = buildRecord(e.getMessage(), request.getStrategy());
record.setSuccess(false);
entryPoint.apply(record);
} catch (IOException ex) {
ex.printStackTrace();
}
}
}
}
/**
* 构建审计记录,记录审计动作
*
* @param message 信息
* @param strategy 策略
* @return 结果
*/
private AuditingRecord buildRecord(String message, AuditingStrategy strategy) {
return AuditingRecord.builder()
.ip(request.getAddress())
.success(request.isSuccess())
.message(MessageFormat.format("操作:{0},结果:{1}", strategy.getName(), message))
.accessToken(request.getAccessToken())
.build();
}
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy