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

Dan*_*Dan 5 java asynchronous web-applications

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

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

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

编辑:

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

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

Vla*_*hev 1

正如许多人在这里所说的那样,日志记录不是异步的好选择。尽管如此,我认为你有充分的理由不这么认为。

在这种情况下,我将使用队列(例如 ConcurrentLinkedQueue)和低优先级线程(在应用程序启动时启动并在关闭时终止,例如,从启动时运行的 servlet 中终止)。线程应该从队列中选取消息,并执行它的操作。线程应该通过notify()方法或等间隔唤醒。

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

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