在Java Web应用程序中执行异步操作的最简单方法

时间:2009-11-25 16:57:28

标签: java web-applications asynchronous

我有基于Java servlet的Web应用程序。我想以异步方式实现一些操作,例如写入日志。

我想避免JMS开销并做一些简单的事情。

在服务器环境中自己管理线程似乎不是一个好主意,您可能需要利用服务器线程池等。 简单异步操作的最佳替代方法是什么?

编辑:

为了澄清,由于许多人建议使用log4j或其他日志库,因此写入日志操作就是一个例子。我感兴趣的是如何异步执行任何不需要按顺序执行的操作。想法是立即回复用户并继续在另一个线程中处理昂贵的操作。

关于日志问题,我们实施了一个审计日志,用于将大量数据写入数据库,并在审计操作和帮助台中由用户使用。向DB写入大量信息可能非常昂贵。我们确实使用log4j作为系统日志,因为appender是文件追加器,所以我们的系统日志没有性能问题。

4 个答案:

答案 0 :(得分:1)

正如很多人在这里所说,日志记录不适合异步。不过,我认为你有充分的理由相信否则。

在这种情况下,我会使用一个Queue(例如ConcurrentLinkedQueue)和一个低优先级的线程(你在应用程序启动时启动并在关机时终止,例如,从一个run-at-startup servlet)。线程应该从队列中选择消息,然后执行它。线程应该通过notify()方法或等间隔唤醒。

风险:在负载很重的情况下,队列可以无法控制地增长(因为线程可能无法获得足够的CPU周期)。

还有其他方法可以触发异步操作(例如Timer,Future,...),但我认为它们不适合快速小型操作。

答案 1 :(得分:0)

如果您只想做简单的日志记录,那么Log4j简单易用。

答案 2 :(得分:0)

如果您只是尝试以异步方式写入日志,我会完全避免它,并在适当时使用缓冲输出。

我自己从未使用过它,但是来自apache的http://mina.apache.org/项目有很好的评论,但我认为这主要是在网络层面。

答案 3 :(得分:0)

您希望使重量级操作异步,而不是像日志记录那样非常轻量级。一旦你形成了日志消息,它的实际写入应该非常快(毕竟,你的磁盘控制器也会进行缓存)。

因此,如果您的操作繁重会导致Web应用程序陷入困境并降低响应速度,那么使用JMS等持久性消息队列方法通常是个好主意。

如果你想做日志记录,我建议SLF4J,这是Log4J的继承者,非常强大和高效。

如果您正在考虑登录多机环境,一种方法是配置您的记录器将消息写入多播组,从中读取它们并将其写入磁盘一个或多个日志聚合服务器。

相关问题