EJB Timer Service不可用,上下文

时间:2016-07-30 23:50:12

标签: glassfish ejb

我有以下代码:

package ejbs;
import javax.annotation.Resource;

import javax.ejb.Singleton;
import javax.ejb.Timeout;
import javax.ejb.Timer;
import javax.ejb.TimerConfig;
import javax.ejb.TimerService;

@Singleton
public class timerbackup {

@Resource
private TimerService timerservice;

@Timeout
public void methodTimeout(Timer timer)
{     
    System.out.println("timeout");   
} 
public void settimer(long in)
{       
  Timer timer=timerservice.createSingleActionTimer(in,new TimerConfig());  
} 
}

部署应用程序后出现错误消息“EJB Timer Service不可用”。

要解决问题,我按照以下步骤操作:

  1. 访问glash fish管理控制台(http://localhost:4848
  2. 转到配置 - > server-config - > EJB容器
  3. 选择标签 EJB定时服务
  4. 然后使用您的JDBC资源(我使用“jdbc / projecto_final”)填写计时器数据源
  5. 重新启动服务器
  6. 正如Set/configure the EJB Timer Service’s DataSource中所述。

    这导致但是在一段时间后TimerService停止工作。部署应用程序后,将显示以下错误消息:

    Severe:  Exception while loading the app
    Severe:  Undeployment failed for context /ProjetoEE1
    Info:    /file:/E:/formacaoJAVA/2moduloJEE/pratica/projecto_final   /projfinal2/ProjetoEE1/build/web/WEB-INF/classes/_DEFAULT_PU logout   successful
    Warning:   EJB Timer Service is not available. Timers for application with id 96332697224871936 will not be deleted
    

    Set/configure the EJB Timer Service’s DataSource也提到了这个问题,并在Glassfish DeploymentException: Error in linking security policy for中提供了一个解决方案。

    Glassfish DeploymentException: Error in linking security policy for中提供的解决方案主要包括删除一些文件。更多投票的答案基本上表明了以下几点:

    1. 停止使用Glassfish服务器
    2. 已删除glassfishhome / glassfish / domains / yourdomainname / generated
    3. 中的所有内容
    4. 启动Glassfish
    5. 我已安装“GlassFish Server 4.1.1”,但这不起作用。

      第二个答案更多投票表明基本上如下:

      1.解决此问题所需的全部内容是删除$ GLASSFISH_HOME / glassfish / domains // osgi-cache

      下的整个OSGi缓存

      这也行不通。

      我能做什么?任何帮助都将非常感谢

      致以最诚挚的问候,

      Rafael Costa

4 个答案:

答案 0 :(得分:4)

替换

import javax.ejb.Singleton;

使用

import javax.inject.Singleton;

它对我有用。我使用Derby数据库就是你的情况吗?

答案 1 :(得分:3)

我已经解决了

中的“相同”问题
  1. 完全删除glassfish / domains / domain-name / generated文件夹

  2. 再次构建申请

  3. 重新启动glassfish应用程序

  4. 在我的情况下,我在使用GIT进行拉/推操作后安装了我的应用程序的新版本,并且我的应用程序已停止工作。所以我知道在这个新版本之前,我的应用程序运行良好,并且Glassfish上没有任何改变。

    我在另一个网站上找到了一些解释 https://dzone.com/articles/solving-ejb-timer-service-not-available-error-in-g-1

    Glassfish应用程序服务器使用其嵌入式JAVADB来持久保存其可用EJB计时器的状态。未正确设置计时器服务的数据资源可防止EJB计时器被还原并最终无法正常运行。在这种情况下,通常会返回“EJB计时器服务不可用”错误消息。此问题会阻止启动或部署使用EJB计时器服务的任何应用程序。

    有两种程序可以克服这种阻塞情况:

    第一个解决方案是转到JDBC连接池,并通过ping它来仔细检查Timerpool连接池的运行状况。如果ping失败,则需要检查或重新定义连接池。

    如果ping连接池成功,则问题可能是EJB计时器标记文件的存在。只要在EJB计时器服务启动或恢复期间出现问题,就会创建标记文件。

    删除标记将解决问题。位于as-install-parent / glassfish / domains / domain-name / generated / ejb /下的标记文件“ejb-timer-service-app”。别忘了重启Glassfish!

答案 2 :(得分:0)

我解决了这个问题。如果我需要,我创建了一个新的JDBC资源和一个新的JDBC连接池。

以下链接说明了如何创建JDBC资源和JDBC连接池。 General Steps for Creating a JDBC Resource

可以使用管理控制台或asadmin实用程序创建JDBC资源和JDBC连接池。

以下链接说明了如何使用asadmin实用程序。Using the asadmin Utility (我使用此实用程序,因为在管理控制台中,当我尝试创建JDBC资源并且JDBC连接池出现错误时)

在管理控制台中,在创建的JDBC资源中,字段"池名称"应该等于创建的JDBC连接池的名称。

之后我按照以下步骤操作:

  1. 配置 - > server-config-> EJB容器
  2. 选择标签EJB Timer Service
  3. 使用JDBC资源的名称填写字段Timer Datasource。
  4. 重新启动服务器
  5. 有任何问题请随意。

    最诚挚的问候Rafael Santos Costa

答案 3 :(得分:0)

您好,如果您安装了glassfish 4.1.1,我也遇到了同样的问题,服务器上的计时器可能不稳定。 解决方案:将glassfish 4.1更新为glassfish 5,并在此新服务器中部署Web应用程序