使用 Wildfly 8.1.0 Final 部署 Java @Schedule

Posted

技术标签:

【中文标题】使用 Wildfly 8.1.0 Final 部署 Java @Schedule【英文标题】:Deploying Java @Schedule with Wildfly 8.1.0 Final 【发布时间】:2014-11-17 06:56:20 【问题描述】:

我正在尝试使用以下代码测试@Schedule 注释:

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

关于什么可能导致这种情况的任何想法?

【问题讨论】:

应用服务器不应该像那样抛出 NullPointerException,所以你应该把它作为一个错误报告给 JBoss。基于doesTimeoutMethodMatch,我可能猜想服务器正试图确保您的@Schedule 自从它首次在持久数据库中创建以来没有改变。也许尝试清理计时器数据库表(或其他),然后尝试重新部署应用程序? 我做了一些研究,计时器存储在standalone\data\timer-service-data 文件夹中。删除此处的计时器并再次部署确实解决了问题。感谢您强调这一点(我已经为此苦苦挣扎了一段时间) 我可能仍会将问题报告给 JBoss。无论该文件的内容如何,​​都不应发生该 NPE。 【参考方案1】:

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

这可能是来自在服务器关闭之前未完成的测试运行的数据。请记住 timerService 是持久的。因此,如果在您关闭服务器时有待处理的任务,它会首先尝试接收这些任务。如果您更新了战争,那些计时器进程可能不再与战争中的进程匹配。

【讨论】:

以上是关于使用 Wildfly 8.1.0 Final 部署 Java @Schedule的主要内容,如果未能解决你的问题,请参考以下文章

Wildfly 8.2:缺少 component.CREATE

Wildfly8.1.0.Final 上部署的 RestFul 服务未处理 30% 的请求

如何在wildfly 8.2 Final中将lib添加到模块中?

如何减少 Wildfly 部署所需的时间?

Wildfly 8.1.0 以备用配置独立运行

在 Wildfly 上部署 KIE-CI 失败