mirror of
https://gitee.com/mybatis-flex/mybatis-flex.git
synced 2025-12-07 00:58:24 +08:00
optimize Audit module
This commit is contained in:
parent
c0190d7ecd
commit
ebfdc86cda
@ -23,47 +23,50 @@ import java.sql.SQLException;
|
||||
import java.util.Collection;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* 审计管理器,统一执行如何和配置入口
|
||||
*/
|
||||
public class AuditManager {
|
||||
|
||||
private static AuditTimeCreator auditTimeCreator = System::currentTimeMillis;
|
||||
private static AuditMessageCreator auditMessageCreator = new DefaultAuditMessageCreator();
|
||||
private static AuditMessageCollector auditMessageCollector = new DefaultAuditMessageCollector();
|
||||
private static Clock clock = System::currentTimeMillis;
|
||||
private static MessageCreator messageCreator = new DefaultMessageCreator();
|
||||
private static MessageCollector messageCollector = new ScheduledMessageCollector();
|
||||
|
||||
|
||||
public static AuditTimeCreator getAuditTimeCreator() {
|
||||
return auditTimeCreator;
|
||||
public static Clock getClock() {
|
||||
return clock;
|
||||
}
|
||||
|
||||
public static void setAuditTimeCreator(AuditTimeCreator auditTimeCreator) {
|
||||
AuditManager.auditTimeCreator = auditTimeCreator;
|
||||
public static void setClock(Clock clock) {
|
||||
AuditManager.clock = clock;
|
||||
}
|
||||
|
||||
public static AuditMessageCreator getAuditMessageCreator() {
|
||||
return auditMessageCreator;
|
||||
public static MessageCreator getMessageCreator() {
|
||||
return messageCreator;
|
||||
}
|
||||
|
||||
public static void setAuditMessageCreator(AuditMessageCreator auditMessageCreator) {
|
||||
AuditManager.auditMessageCreator = auditMessageCreator;
|
||||
public static void setMessageCreator(MessageCreator messageCreator) {
|
||||
AuditManager.messageCreator = messageCreator;
|
||||
}
|
||||
|
||||
public static AuditMessageCollector getAuditMessageCollector() {
|
||||
return auditMessageCollector;
|
||||
public static MessageCollector getMessageCollector() {
|
||||
return messageCollector;
|
||||
}
|
||||
|
||||
public static void setAuditMessageCollector(AuditMessageCollector auditMessageCollector) {
|
||||
AuditManager.auditMessageCollector = auditMessageCollector;
|
||||
public static void setMessageCollector(MessageCollector messageCollector) {
|
||||
AuditManager.messageCollector = messageCollector;
|
||||
}
|
||||
|
||||
public static <T> T startAudit(AuditRunnable<T> supplier, BoundSql boundSql) throws SQLException {
|
||||
AuditMessage auditMessage = auditMessageCreator.create();
|
||||
AuditMessage auditMessage = messageCreator.create();
|
||||
if (auditMessage == null) {
|
||||
return supplier.execute();
|
||||
}
|
||||
auditMessage.setExtTime(auditTimeCreator.now());
|
||||
auditMessage.setExtTime(clock.getTick());
|
||||
try {
|
||||
return supplier.execute();
|
||||
} finally {
|
||||
auditMessage.setElapsedTime(auditTimeCreator.now() - auditMessage.getExtTime());
|
||||
auditMessage.setElapsedTime(clock.getTick() - auditMessage.getExtTime());
|
||||
auditMessage.setQuery(boundSql.getSql());
|
||||
|
||||
Object parameter = boundSql.getParameterObject();
|
||||
@ -87,7 +90,7 @@ public class AuditManager {
|
||||
}
|
||||
}
|
||||
}
|
||||
auditMessageCollector.collect(auditMessage);
|
||||
messageCollector.collect(auditMessage);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -18,7 +18,9 @@ package com.mybatisflex.core.audit;
|
||||
import java.io.Serializable;
|
||||
import java.lang.reflect.Array;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
public class AuditMessage implements Serializable {
|
||||
|
||||
@ -36,6 +38,8 @@ public class AuditMessage implements Serializable {
|
||||
private long extTime; // Sql 执行的当前时间,单位毫秒
|
||||
private long elapsedTime; // Sql 执行消耗的时间,单位毫秒
|
||||
|
||||
private Map<String, Object> metas; //其他信息,元信息
|
||||
|
||||
|
||||
public String getPlatform() {
|
||||
return platform;
|
||||
@ -138,6 +142,20 @@ public class AuditMessage implements Serializable {
|
||||
this.elapsedTime = elapsedTime;
|
||||
}
|
||||
|
||||
public Map<String, Object> getMetas() {
|
||||
return metas;
|
||||
}
|
||||
|
||||
public void setMetas(Map<String, Object> metas) {
|
||||
this.metas = metas;
|
||||
}
|
||||
|
||||
public void addMeta(String key, Object value) {
|
||||
if (metas == null) {
|
||||
metas = new HashMap<>();
|
||||
}
|
||||
metas.put(key, value);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
|
||||
@ -16,11 +16,10 @@
|
||||
package com.mybatisflex.core.audit;
|
||||
|
||||
/**
|
||||
* 审计时间创建器,对于性要求特别高的场景
|
||||
* 可以定义自己的时间构建器,用来代替 {@link System#currentTimeMillis()}
|
||||
* 对于性要求特别高的场景,用户可以定义自己的时钟,用来代替 {@link System#currentTimeMillis()}
|
||||
*/
|
||||
public interface AuditTimeCreator {
|
||||
public interface Clock {
|
||||
|
||||
long now();
|
||||
long getTick();
|
||||
|
||||
}
|
||||
@ -20,7 +20,7 @@ import java.util.List;
|
||||
/**
|
||||
* 控制台输出审计消息
|
||||
*/
|
||||
public class ConsoleAuditMessageSender implements AuditMessageSender {
|
||||
public class ConsoleMessageReporter implements MessageReporter {
|
||||
|
||||
@Override
|
||||
public void sendMessages(List<AuditMessage> messages) {
|
||||
@ -23,7 +23,7 @@ import java.util.Enumeration;
|
||||
/**
|
||||
* 默认的审计消息创建器,用来创建带有 hostIp 的审计消息
|
||||
*/
|
||||
public class DefaultAuditMessageCreator implements AuditMessageCreator {
|
||||
public class DefaultMessageCreator implements MessageCreator {
|
||||
|
||||
private String platform = "mybatis-flex";
|
||||
private String hostIp = getHostIp();
|
||||
@ -18,6 +18,6 @@ package com.mybatisflex.core.audit;
|
||||
/**
|
||||
* 审计消息收集器
|
||||
*/
|
||||
public interface AuditMessageCollector {
|
||||
public interface MessageCollector {
|
||||
void collect(AuditMessage message);
|
||||
}
|
||||
@ -19,7 +19,7 @@ package com.mybatisflex.core.audit;
|
||||
* 审计消息创建器,在一般的 web 服务中,用户应该自定义自己的 AuditMessageCreator
|
||||
* 用来配置当前操作用户、用户 IP 地址,访问的 url 地址等
|
||||
*/
|
||||
public interface AuditMessageCreator {
|
||||
public interface MessageCreator {
|
||||
|
||||
AuditMessage create();
|
||||
|
||||
@ -22,7 +22,7 @@ import java.util.List;
|
||||
* 审计消息发送器,作用是把审计消息发送到指定的位置
|
||||
* 比如控制台,磁盘、或者 kafka 服务器, http 服务器等
|
||||
*/
|
||||
public interface AuditMessageSender {
|
||||
public interface MessageReporter {
|
||||
|
||||
void sendMessages(List<AuditMessage> messages);
|
||||
|
||||
@ -24,31 +24,33 @@ import java.util.concurrent.TimeUnit;
|
||||
import java.util.concurrent.locks.ReentrantReadWriteLock;
|
||||
|
||||
/**
|
||||
* 默认的审计消息收集器,其收集消息后,定时通过消息发送器{@link AuditMessageSender}把消息发送过去
|
||||
* 默认的审计消息收集器,其收集消息后,定时通过消息发送器{@link MessageReporter}把消息发送过去
|
||||
*/
|
||||
public class DefaultAuditMessageCollector implements AuditMessageCollector, Runnable {
|
||||
public class ScheduledMessageCollector implements MessageCollector, Runnable {
|
||||
|
||||
private long period = 10;
|
||||
private ScheduledExecutorService scheduler;
|
||||
private AuditMessageSender messageSender = new ConsoleAuditMessageSender();
|
||||
private MessageReporter messageSender = new ConsoleMessageReporter();
|
||||
|
||||
private List<AuditMessage> messages = Collections.synchronizedList(new ArrayList<>());
|
||||
private ReentrantReadWriteLock rrwLock = new ReentrantReadWriteLock();
|
||||
|
||||
public DefaultAuditMessageCollector() {
|
||||
public ScheduledMessageCollector() {
|
||||
scheduler = Executors.newSingleThreadScheduledExecutor(runnable -> {
|
||||
Thread thread = new Thread(runnable, "DefaultAuditMessageCollector");
|
||||
Thread thread = new Thread(runnable, "ScheduledMessageCollector");
|
||||
thread.setDaemon(true);
|
||||
return thread;
|
||||
});
|
||||
scheduler.scheduleAtFixedRate(this, period, period, TimeUnit.SECONDS);
|
||||
}
|
||||
|
||||
public DefaultAuditMessageCollector(long period, AuditMessageSender messageSender) {
|
||||
|
||||
public ScheduledMessageCollector(long period, MessageReporter messageSender) {
|
||||
this.period = period;
|
||||
this.messageSender = messageSender;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void collect(AuditMessage message) {
|
||||
try {
|
||||
Loading…
x
Reference in New Issue
Block a user