实现异步日志记录的基本模式

时间:2014-11-25 00:41:46

标签: java multithreading asynchronous

在我的Web应用程序中,我们在servlet中执行一些套接字作业,并将套接字数据记录到数据库中。

我希望异步进行日志记录过程以提高性能。

我的想法是使用单独的专用线程来执行日志记录作业。在我的servlet中,我只是将数据提交到缓存,让日志记录线程逐个处理它们。

我在线程方面有一点经验,我可以使用哪些集合作为缓存?实现这个的基本代码模式是什么?请提供一些代码来说明如何实现这一目标。

抱歉我的英语不好

由于我的应用程序是在生产环境中运行的遗留系统。它只使用servlet和jsp,没有其他Java EE技术。似乎添加JMS支持对我来说太贵了。

4 个答案:

答案 0 :(得分:0)

队列和线程池应该是好的。在队列上发布消息,让工作者从队列中挑选消息并将它们保存在数据库中。根据您的要求/负载,您可以调整队列和线程池大小。

答案 1 :(得分:0)

如果您要将日志输出到单个文件,可以尝试在记录器类上使用信号量(最好是Mutex)来防止同时写入/竞争条件。信号量是设计的同步原语,以便程序员可以使用它们来确保在任何时候只能对任何一个数据结构进行一定数量的访问。我不会解释整个概念,但Java在java.util.concurrent.Semaphore类中提供了这些内容。互斥锁( mut ual ex clusion lock)是一个信号量,它只允许一个线程在任何给定时间“保持”它。试一试!

答案 2 :(得分:0)

如果您正在使用专用线程来处理日志记录,您将需要实现Producer / Consumer模式,并使用Queue来处理信息对象的存储。生产者/消费者模式主要用于帮助进行线程同步和通信。以下是可能有用的生产者/消费者实现示例:http://www.tutorialspoint.com/javaexamples/thread_procon.htm

另一个选项是生成标准日志记录操作,然后创建执行此操作的线程池线程。这样做的好处是线程池处理线程的调度以及它们何时执行,但缺点是你不能保证用这种方法进行FIFO记录,因为线程调度程序可以随意选择池中哪个线程接下来运行。

答案 3 :(得分:0)

除非你的领导者坚持重新发明轮子,否则在AsyncAppender后面使用slf4j和logback的DBAppender。它开箱即用,就像一个魅力。

你应该真的读到logback's appenders

可以找到完整的示例here