我试图在Spring启动应用程序中实现日志系统。有进入系统的请求有一个或多个响应。 请求和响应必须在单独的线程中记录到数据库中,而不是在工作线程中。 这是我的想法。
mysql中的表 - "请求"带有必填列,"响应"使用request_id作为外键
resquest和response之间的关系 - 一对多。
在LogService
中启动@PostContruct
中的单独线程以将数据保存在数据库中。
我确信这个问题有更好的解决方案。请引导一些建议。
@Service
public class LogServiceImpl implements LogService {
private final BlockingQueue<Object> logQueue = new LinkedBlockingQueue<>();
private volatile boolean done;
// repositories
@Autowired
private RequestRepository requestRepository;
@Autowired
private ResponseRepository responseRepository;
@Async
@Override
public void log(Object obj) {
try {
logQueue.put(obj);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
@PostContruct
private saveToDb(){
new Thread(() -> {
while(!done){
String object = logQueue.poll(5, TimeUnit.SECONDS)
if(object != null){
if(object instanceof Request){
requestRepository.save((Request)object);
}
if(object instanceof Response){
responseRepository.save((Response)object);
}
}
}
}).start();
}
public void stop() {
done = true;
}
}
class Request{
.....
}
class Response{
......
}
@Service
public class SomeService1 {
@Autowired
private LogService logService;
public void someMeth1(Request request) {
....
logService.log(request);
}
}
@Service
public class SomeService2 {
@Autowired
private LogService logService;
public void someMeth2(Response response) {
....
logService.log(response);
}
}