TimerTask生成错误而不执行

时间:2012-12-17 14:51:49

标签: java multithreading timer timertask

我对标题感到抱歉,但我不确定如何描述这个问题。我有一个SingletonBean,它有一个扩展TimerTask的类。关键是当应用程序启动时,它开始在循环上运行一组预定的后台任务。一切正常,乍一看,Timer()执行run()方法,并且计划的作业每120秒完美执行一次。

在run()中,我有一个方法可以从AWS DynamoDB获取信息列表。

List<SiteObj> sites = storedDynamoQueries.scanSite("uid");

这再次完美,并且正如我所期望的那样,我可以在该方法上休息一下,它会在执行时每120秒暂停一次,等待我跳过它。

现在出现问题!如上所述,Timer设置为每120秒执行一次。然而,每120秒,但OFFSET为60秒。我收到如下错误:

SEVERE: Error wih Dynamo Site Scan
java.lang.NullPointerException
    at org.apache.log4j.LogManager.getLogger(LogManager.java:179)
    at org.apache.log4j.Logger.getLogger(Logger.java:94)
    at org.apache.commons.logging.impl.Log4JLogger.getLogger(Log4JLogger.java:289)
    at org.apache.commons.logging.impl.Log4JLogger.debug(Log4JLogger.java:177)
    at com.amazonaws.auth.AWS4Signer.sign(AWS4Signer.java:119)
    at com.amazonaws.http.AmazonHttpClient.executeHelper(AmazonHttpClient.java:239)
    at com.amazonaws.http.AmazonHttpClient.execute(AmazonHttpClient.java:165)
    at com.amazonaws.services.dynamodb.AmazonDynamoDBClient.invoke(AmazonDynamoDBClient.java:985)
    at com.amazonaws.services.dynamodb.AmazonDynamoDBClient.scan(AmazonDynamoDBClient.java:560)
    at com.amazonaws.services.dynamodb.datamodeling.DynamoDBMapper.scan(DynamoDBMapper.java:1066)
    at com.amazonaws.services.dynamodb.datamodeling.DynamoDBMapper.scan(DynamoDBMapper.java:1028)
    at tv.tarka.dastraxweb.integration.dynamo.StoredDynamoQueries.scanSite(StoredDynamoQueries.java:1584)
    at tv.tarka.dastraxweb.application.snmp.Scheduler$ScheduledTask.run(Scheduler.java:72)
    at java.util.TimerThread.mainLoop(Timer.java:555)
    at java.util.TimerThread.run(Timer.java:505)

现在这是由与上述相同的方法触发的错误。但是当我尝试调试它时,系统说这个类甚至没有被调用!它不会出现在调试器中,并且它不应该被所有帐户调用,特别是不会与run()的其余部分相差60秒。

无论如何,我怀疑答案与追踪的最后两行有关。

at java.util.TimerThread.mainLoop(Timer.java:555)
at java.util.TimerThread.run(Timer.java:505)

但我不知道是什么原因引起的。

2 个答案:

答案 0 :(得分:1)

这意味着日志记录库无法获取记录器。检查记录器配置。

答案 1 :(得分:0)

看起来存在冲突的日志框架实现类或缺少commons-logging.properties文件。虽然您可以混合调用log4j,log4j 2,slf4j,commons-logging等API,但是依赖项中包含的类必须兼容。有一组使用log4j作为实现类集的类,还有另一组使用log4j 2作为底层实现类的类。

请参阅https://bradleyaross.wordpress.com/2016/05/05/java-logging-frameworks/

如果您查看http://www.github.com/bradleyross/tutorials项目中的tutorials-log4j1和tutorials-log4j2模块,您将看到每个类的设置示例。

如果使用log4j 1.x实现类,则需要一个log4j.xml文件,一个commons-logging.properties文件,指示将消息发送到log4j或相应的系统,并且jar文件是 共享记录-1.2.jar log4j的-1.2.17.jar 的log4j到SLF4J-2.0-beta4.jar

如果使用log4j 2实现文件,我使用了log4j2.xml和 共享记录-1.2.jar 的log4j-1.2-API-2.5.jar log4j的-API-2.5.jar log4j的核心-2.5.jar log4j-slf4j-impl-2.5.jar(这消除了对commons-logging.properties的需要)

请参阅http://docs.aws.amazon.com/AWSSdkDocsJava/latest/DeveloperGuide/java-dg-logging.html

两个集合共有的唯一jar文件是commons-logging-1.2.jar。混合两组中的任何其他文件将导致大量问题。 (正如我以前的IBM旧手册所说,结果未定义。)

不再支持log4j 1.x