有一个spring-mvc web项目。如果用户执行了重要操作,则应用程序必须记录日志并向服务层中的用户电子邮件发送消息(顺便说一下,用户将执行许多重要操作)。代码如下:
private static final Logger LOGGER = LoggerFactory.getLogger(MessageServiceImpl.class);
private static final ExecutorService fixedThreadPool = Executors.newFixedThreadPool(5);
fixedThreadPool.execute(new Runnable() {
@Override
public void run() {
if (emailParams != null && EmailUtil.sendEmail(emailParams)) {
LOGGER.info("send email succeed");
} else {
LOGGER.warn("send email failed");
}
}
});
我遇到了两个问题:
我可以在fixedThreadPool中使用静态LOGGER对象吗?
如果我在fixedThreadPool中使用静态logger对象,会发生什么?僵局?比赛条件?或什么都没有?
我应该定义fixedThreadPool静态还是非静态?
在我看来:
如果fixedThreadPool是静态的并且我没有调用它的shutdown(),那么它将存在util web project is shutdown。
如果fixedThreadPool是not
静态的,并且每个请求都可能产生一个fixedThreadPool。最后,这个web项目将有许多无用的fixedThreadPool,可能会产生Out-Of-Memery。
答案 0 :(得分:1)
这取决于日志框架实现。大多数实现都是线程安全的,但它们也可能是阻塞的。 Log4j是线程安全的。
答案 1 :(得分:0)
我假设您使用migrate
对吗? SLF4j仅为记录器提供接口。所以像@kdowbecki说的那样取决于你正在使用哪种记录器实现。例如org.slf4j.Logger
是线程安全的......
来自JavaDocs:
Logger上的所有方法都是多线程安全的。
这是一篇列出一些例子的帖子: Is SLF4J thread-safe?