Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 我可以在fixedThreadPool中使用静态记录器对象吗?_Java_Spring Mvc_Threadpool_Slf4j - Fatal编程技术网

Java 我可以在fixedThreadPool中使用静态记录器对象吗?

Java 我可以在fixedThreadPool中使用静态记录器对象吗?,java,spring-mvc,threadpool,slf4j,Java,Spring Mvc,Threadpool,Slf4j,有一个springmvcweb项目。如果用户做了一些重要的事情,应用程序必须记录日志并在服务层向用户的电子邮件发送消息(顺便说一句,用户将做许多重要的事情)。代码如下所示: private static final Logger LOGGER = LoggerFactory.getLogger(MessageServiceImpl.class); private static final ExecutorService fixedThreadPool = Executors.newFixedT

有一个springmvcweb项目。如果用户做了一些重要的事情,应用程序必须记录日志并在服务层向用户的电子邮件发送消息(顺便说一句,用户将做许多重要的事情)。代码如下所示:

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中使用静态记录器对象吗

    如果我在fixedThreadPool中使用静态记录器对象,会发生什么?僵局比赛条件?还是什么都没有

  • 我应该将fixedThreadPool定义为静态还是非静态

    我认为:

    若fixedThreadPool是静态的,并且我不调用它的shutdown(),那个么当web项目处于shutdown状态时,它将存在

    如果fixedThreadPool是
    静态的,则每个请求都可能生成一个fixedThreadPool。最后,这个web项目将有许多无用的固定线程池,可能会产生内存之外的问题


  • 这取决于日志框架的实现。大多数实现都是线程安全的,但是它们也可以是阻塞的。Log4j是线程安全的


    请参阅。

    我假设您使用的是
    org.slf4j.Logger
    对吗?SLF4j仅为记录器提供接口。就像@kdowbecki所说的,这取决于您使用的是哪个记录器实现。例如
    java.util.logging.Logger
    是线程安全的

    从JavaDocs:

    记录器上的所有方法都是多线程安全的

    下面是一篇文章,列举了一些例子:

    什么样的记录器?为什么您忽略了代码示例中的导入?我的项目使用slf4j+log4jyou是对的,第一个问题是重复的。我已经做了标记。第二个问题呢?您能帮助我吗?
    静态
    代码通常更难测试,因此应该避免使用,例如,在JVM关闭期间,您将如何为调用
    shutdown()
    编写测试。