All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.flyfish.oauth.entry.auditing.AuditingExecutor Maven / Gradle / Ivy

There is a newer version: 1.0.7
Show newest version
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