2014-09-23 82 views
5

我想测试用下面的代码的注释@Schedule:部署Java @Schedule与Wildfly 8.1.0最终

import javax.ejb.Schedule; 
import javax.ejb.Singleton; 
import javax.ejb.Startup; 

@Singleton 
@Startup 
public class TimerTest { 

    public TimerTest() { 

    } 

    @Schedule(second = "*", minute = "*", hour = "*") 
    public void sayHello() { 
     System.out.println("Hello"); 
    } 

} 

然而,当我把它部署到的wildfly 8.1.0的独立实例(最后)我收到日志中的以下错误消息:

2014-09-23 08:38:03,076 ERROR [org.jboss.msc.service.fail] (MSC service thread 1-4) MSC000001: Failed to start service jboss.deployment.unit."test-server.war".component.TimerTest.ejb3.timerService: org.jboss.msc.service.StartException in service jboss.deployment.unit."test-server.war".component.TimerTest.ejb3.timerService: Failed to start service 
    at org.jboss.msc.service.ServiceControllerImpl$StartTask.run(ServiceControllerImpl.java:1904) [jboss-msc-1.2.2.Final.jar:1.2.2.Final] 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) [rt.jar:1.7.0_25] 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) [rt.jar:1.7.0_25] 
    at java.lang.Thread.run(Thread.java:724) [rt.jar:1.7.0_25] 
Caused by: java.lang.NullPointerException 
    at org.jboss.as.ejb3.timerservice.TimerServiceImpl.doesTimeoutMethodMatch(TimerServiceImpl.java:959) 
    at org.jboss.as.ejb3.timerservice.TimerServiceImpl.restoreTimers(TimerServiceImpl.java:710) 
    at org.jboss.as.ejb3.timerservice.TimerServiceImpl.start(TimerServiceImpl.java:202) 
    at org.jboss.msc.service.ServiceControllerImpl$StartTask.startService(ServiceControllerImpl.java:1948) [jboss-msc-1.2.2.Final.jar:1.2.2.Final] 
    at org.jboss.msc.service.ServiceControllerImpl$StartTask.run(ServiceControllerImpl.java:1881) [jboss-msc-1.2.2.Final.jar:1.2.2.Final] 
    ... 3 more 

2014-09-23 08:38:07,098 ERROR [org.jboss.as.controller.management-operation] (Controller Boot Thread) JBAS014613: Operation ("deploy") failed - address: ([("deployment" => "test-server.war")]) - failure description: {"JBAS014671: Failed services" => {"jboss.deployment.unit.\"test-server.war\".component.TimerTest.ejb3.timerService" => "org.jboss.msc.service.StartException in service jboss.deployment.unit.\"test-server.war\".component.TimerTest.ejb3.timerService: Failed to start service 
    Caused by: java.lang.NullPointerException"}} 

2014-09-23 08:38:07,145 INFO [org.jboss.as.controller] (Controller Boot Thread) JBAS014774: Service status report 
JBAS014777: Services which failed to start:  service jboss.deployment.unit."test-server.war".component.TimerTest.ejb3.timerService: org.jboss.msc.service.StartException in service jboss.deployment.unit."test-server.war".component.TimerTest.ejb3.timerService: Failed to start service 

JBAS014777: Services which failed to start:  service jboss.deployment.unit."test-server.war".component.TimerTest.ejb3.timerService 

任何想法是什么可能造成这种情况?

+2

应用程序服务器不应该像这样抛出NullPointerException,所以你应该把这个报告为JBoss的一个bug。基于'doTimeoutMethodMatch',我可能猜测服务器正在试图确保您的'@ Schedule'自首次在持久性数据库中创建以来没有发生变化。也许尝试清理计时器数据库表(或其他),然后尝试重新部署应用程序? – 2014-09-23 14:26:39

+3

我做了一些研究,定时器存储在独立\ data \ timer-service-data文件夹中。删除位于此处的计时器并再次部署确实解决了问题。感谢您强调这一点(我一直在努力这一段时间) – cardori 2014-09-23 14:53:10

+1

我可能仍然会向JBoss报告问题。无论该文件的内容如何,​​该NPE都不应该发生。 – 2014-09-23 19:19:16

回答

10

我以前见过这个。在您的WildFly目录中,假设您进行了独立部署,将会有一个目录standalone/data/timer-service-data。该目录中可能有一些旧的timerService数据。关闭服务器,删除这些数据并重试。

这可能是在服务器关闭前没有完成的测试运行的数据。请记住,timerService是持久的。因此,如果在关闭服务器时有未完成的任务,它将首先尝试完成这些任务。如果你更新了你的战争,那些定时器进程可能不再与战争中的进程相匹配。