2012-12-17 1 views
0

제목에 대해 유감스러운 점은 없지만 그 문제를 설명하는 데는 별다른 어려움이 없습니다. TimerTask를 확장하는 클래스가있는 SingletonBean이 있습니다. 요점은 응용 프로그램이 시작될 때 일정한 백그라운드 작업 세트를 루프에서 실행하기 시작한다는 것입니다. 언뜻보기에는 모든 것이 잘 작동합니다. Timer()는 run() 메서드를 실행하고 예약 된 작업은 120 초마다 완벽하게 실행됩니다.TimerTask는 예외없이 오류를 생성 함

run() 내부에는 AWS DynamoDB에서 정보 목록을 가져 오는 메소드가 있습니다.

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

는 다시이 완벽하게 작동, 내 IDE에서 예상대로 그 방법에 휴식을 배치 할 수 있습니다 그리고 그것은 나를 그 위에 단계를 위해 대기 실행될 때마다 120 초를 일시 중지합니다.

이제 문제가 발생했습니다. 위에서 언급했듯이 타이머는 매 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) 

그러나이 문제의 원인에 대해서는 잘 모릅니다.

+0

당신의 log4j.xml을 확인 지원됩니다. Side suggestion은 Timers와 TimerThreads 대신에'Executors.newScheduledThreadPool'을 사용합니다. –

답변

1

이것은 로깅 라이브러리가 로거를 획득 할 수 없음을 의미합니다. 로거 구성을 확인하십시오.

0

로깅 프레임 워크 구현 클래스가 충돌하거나 commons-logging.properties 파일이 누락 된 것 같습니다. log4j, log4j 2, slf4j, commons-logging 등의 API를 호출 할 수 있지만 종속성에 포함시키는 클래스는 호환 가능해야합니다. 구현 클래스 집합으로 log4j를 사용하는 클래스 집합이 있으며 하단에 구현 클래스로 log4j 2를 사용하는 다른 클래스 집합이 있습니다.

http://www.github.com/bradleyross/tutorials에서 프로젝트의 튜토리얼 - log4j1 및 자습서 - log4j2 모듈을 보면, 각 클래스에 대한 설정까지의 예를 볼 수 https://bradleyaross.wordpress.com/2016/05/05/java-logging-frameworks/

를 참조하십시오.

log4j 1.x 구현 클래스를 사용하는 경우 log4j.xml 파일, log4j 또는 적절한 시스템에 메시지를 보내고 commail-logging.properties 파일이 필요하며 jar 파일은 commons- log4j에 -에 - SLF4J-2.0-beta4.jar

의 log4j 2 구현 파일을 사용하는 경우 로깅-1.2.jar 의 log4j-1.2.17.jar, 나는 log4j2.xml 및 평민 로깅-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.pro perties)

는 두 세트에 공통 http://docs.aws.amazon.com/AWSSdkDocsJava/latest/DeveloperGuide/java-dg-logging.html

유일한 jar 파일이 평민 로깅-1.2.jar입니다 참조하십시오.두 세트의 다른 파일을 혼합하면 큰 문제가 발생합니다. (IBM에서 내 옛날 매뉴얼 말에서 사용 된 바와 같이, 결과는. 정의되지 않음)

의 log4j 1.x에서 더 이상