0

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

在 run() 内部,我有一个从 AWS DynamoDB 获取信息列表的方法。

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

这再次完美运行,并且正如我所期望的那样,我可以在该方法上放置一个中断,并在它执行时每 120 秒暂停一次,等待我跨过它。

现在解决问题!如上所述,定时器设置为每 120 秒执行一次。但是每 120 秒但偏移 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)

但我不知道是什么原因造成的。

4

2 回答 2

1

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

于 2012-12-17T15:10:17.603 回答
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 文件是 commons-logging-1.2.jar log4j-1.2.17.jar log4j-to-slf4j-2.0-beta4.jar

如果使用 log4j 2 实现文件,我使用 log4j2.xml 和 commons-logging-1.2.jar log4j-1.2-api-2.5.jar log4j-api-2.5.jar log4j-core-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

于 2016-05-22T19:11:42.070 回答