在Spring中记录请求和响应

时间:2015-12-18 14:10:03

标签: spring logging request response

我试图在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);
    }
}

0 个答案:

没有答案