我正在尝试在 Glassfish 4 和 java EE7 上重复 this tutorial
所以我在 Netbeans 中用 maven 创建了简单的 WebApp。

我创建了简单的类:

import java.util.Date;
import javax.ejb.Schedule;
import javax.ejb.Stateless;

@Stateless
public class NewClass {

    @Schedule(minute = "*/1", hour = "*",persistent = false)
    public void anyMethod() {
        System.out.println("hello "+new Date());
    }
}

但是当我将应用程序部署到服务器时,我收到此异常:
Info:   EJB5181:Portable JNDI names for EJB NewClass: [java:global/WebApplication1/NewClass, java:global/WebApplication1/NewClass!NewClass]
Severe:   Exception while invoking class org.glassfish.ejb.startup.EjbApplication start method
java.lang.RuntimeException: EJB Timer Service is not available
    at com.sun.ejb.containers.BaseContainer.startApplication(BaseContainer.java:3951)
    at org.glassfish.ejb.startup.EjbApplication.start(EjbApplication.java:163)
    at org.glassfish.internal.data.EngineRef.start(EngineRef.java:122)
    at org.glassfish.internal.data.ModuleInfo.start(ModuleInfo.java:291)
    at org.glassfish.internal.data.ApplicationInfo.start(ApplicationInfo.java:352)
    at com.sun.enterprise.v3.server.ApplicationLifecycle.deploy(ApplicationLifecycle.java:497)
    at com.sun.enterprise.v3.server.ApplicationLifecycle.deploy(ApplicationLifecycle.java:219)
    at org.glassfish.deployment.admin.DeployCommand.execute(DeployCommand.java:491)
    at com.sun.enterprise.v3.admin.CommandRunnerImpl$2$1.run(CommandRunnerImpl.java:527)
    at com.sun.enterprise.v3.admin.CommandRunnerImpl$2$1.run(CommandRunnerImpl.java:523)
    at java.security.AccessController.doPrivileged(Native Method)
    at javax.security.auth.Subject.doAs(Subject.java:360)
    at com.sun.enterprise.v3.admin.CommandRunnerImpl$2.execute(CommandRunnerImpl.java:522)
    at com.sun.enterprise.v3.admin.CommandRunnerImpl.doCommand(CommandRunnerImpl.java:546)
    at com.sun.enterprise.v3.admin.CommandRunnerImpl.doCommand(CommandRunnerImpl.java:1423)
    at com.sun.enterprise.v3.admin.CommandRunnerImpl.access$1500(CommandRunnerImpl.java:108)
    at com.sun.enterprise.v3.admin.CommandRunnerImpl$ExecutionContext.execute(CommandRunnerImpl.java:1762)
    at com.sun.enterprise.v3.admin.CommandRunnerImpl$ExecutionContext.execute(CommandRunnerImpl.java:1674)
    at com.sun.enterprise.v3.admin.AdminAdapter.doCommand(AdminAdapter.java:534)
    at com.sun.enterprise.v3.admin.AdminAdapter.onMissingResource(AdminAdapter.java:224)
    at org.glassfish.grizzly.http.server.StaticHttpHandler.service(StaticHttpHandler.java:297)
    at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:246)
    at org.glassfish.grizzly.http.server.HttpHandler.runService(HttpHandler.java:191)
    at org.glassfish.grizzly.http.server.HttpHandler.doHandle(HttpHandler.java:168)
    at org.glassfish.grizzly.http.server.HttpServerFilter.handleRead(HttpServerFilter.java:189)
    at org.glassfish.grizzly.filterchain.ExecutorResolver$9.execute(ExecutorResolver.java:119)
    at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeFilter(DefaultFilterChain.java:288)
    at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeChainPart(DefaultFilterChain.java:206)
    at org.glassfish.grizzly.filterchain.DefaultFilterChain.execute(DefaultFilterChain.java:136)
    at org.glassfish.grizzly.filterchain.DefaultFilterChain.process(DefaultFilterChain.java:114)
    at org.glassfish.grizzly.ProcessorExecutor.execute(ProcessorExecutor.java:77)
    at org.glassfish.grizzly.nio.transport.TCPNIOTransport.fireIOEvent(TCPNIOTransport.java:838)
    at org.glassfish.grizzly.strategies.AbstractIOStrategy.fireIOEvent(AbstractIOStrategy.java:113)
    at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.run0(WorkerThreadIOStrategy.java:115)
    at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.access$100(WorkerThreadIOStrategy.java:55)
    at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy$WorkerThreadRunnable.run(WorkerThreadIOStrategy.java:135)
    at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:564)
    at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.run(AbstractThreadPool.java:544)
    at java.lang.Thread.run(Thread.java:744)

Severe:   Exception during lifecycle processing
java.lang.RuntimeException: EJB Timer Service is not available
    at com.sun.ejb.containers.BaseContainer.startApplication(BaseContainer.java:3951)
......

Severe:   Exception while loading the app
Severe:   Undeployment failed for context /test
Warning:   EJB Timer Service is not available. Timers for application with id 91511565780975616 will not be deleted
Severe:   Exception while loading the app : EJB Timer Service is not available

为什么 EJB 定时器服务不可用?
我怎样才能启用它? :)

最佳答案

如果您使用的是嵌入式glassfish,则可能已禁用它,您应该尝试下载独立的glassfish,然后重试。

关于配置,您可以在glassfish管理控制台中验证设置,通常可以通过http://localhost:4848进行访问:

以下设置是相关的:

  • 配置->服务器配置-> EJB容器-> EJB计时器服务选项卡
  • 资源-> JDBC-> JDBC连接池-> __TimerPool(在这里您还可以通过Ping按钮测试连接)
  • 关于java - Glassfish时间表(计时器)异常,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22786424/

    10-14 19:31