【问题标题】:Creating an EJB Timer in Liberty在 Liberty 中创建 EJB 计时器
【发布时间】:2015-11-10 14:05:56
【问题描述】:

我需要创建一个 EJB 计时器(使用 @Schedule),但我知道 Websphere Liberty 配置文件不支持此功能?根据之前在 StackOverflow 上发布的问题,截至 2013 年 8 月,它不受支持:

Java EE-Timer / @Schedule in Websphere Liberty Profile

目前,当我尝试使用 @Schedule 注释时,出现以下异常:

[ERROR   ] CWWKZ0004E: An exception occurred while starting the application 
<EAR>. The exception message was: com.ibm.ws.container.service.state.StateChangeException: com.ibm.ws.exception.RuntimeError: java.lang.IllegalStateException: The ejbPersistentTimer feature is enabled, but the defaultEJBPersistentTimerExecutor persistent executor cannot be resolved. The most likely cause is that the DefaultDataSource datasource has not been configured. Persistent EJB timers require a datasource configuration for persistence.

问题是我确实定义了默认数据源。这是 EJB 代码 - 它非常简单,因为我只是想测试计时器功能:

import javax.ejb.Schedule;
import javax.ejb.Stateless;

@Stateless
public class TimerBean {

    @Schedule(second="*/10", persistent=false)
    public void doSomething() {
        System.out.println("Hello World!");
    }

}

更新:

我将 dataSource id 更改为“DefaultDataSource”,现在在启动服务器时我的控制台中出现了不同的异常:

[ERROR   ] WTRN0078E: An attempt by the transaction manager to call start on a transactional resource has resulted in an error. The error code was XAER_RMERR. The exception stack trace follows: javax.transaction.xa.XAException: com.microsoft.sqlserver.jdbc.SQLServerException: Could not find stored procedure 'master..xp_sqljdbc_xa_start'.
at com.microsoft.sqlserver.jdbc.SQLServerXAResource.DTC_XA_Interface(SQLServerXAResource.java:647)
at com.microsoft.sqlserver.jdbc.SQLServerXAResource.start(SQLServerXAResource.java:679)
at com.ibm.ws.rsadapter.spi.WSRdbXaResourceImpl.start(WSRdbXaResourceImpl.java:1189)
at [internal classes]

[ERROR   ] J2CA0030E: Method enlist caught javax.transaction.SystemException: XAResource start association error:XAER_RMERR
at com.ibm.tx.jta.impl.RegisteredResources.startRes(RegisteredResources.java:1048)
at [internal classes]
Caused by: javax.transaction.xa.XAException: com.microsoft.sqlserver.jdbc.SQLServerException: Could not find stored procedure 'master..xp_sqljdbc_xa_start'.
at com.microsoft.sqlserver.jdbc.SQLServerXAResource.DTC_XA_Interface(SQLServerXAResource.java:647)
at com.microsoft.sqlserver.jdbc.SQLServerXAResource.start(SQLServerXAResource.java:679)

这是计时器尝试写入我的 SQL DB 的结果吗?如果是,有没有办法避免这种情况?

【问题讨论】:

  • 即使您有这些错误消息,应用程序是否仍在启动?或者这是否会使应用程序启动过程失败?
  • 由于消息的原因,它没有启动。我用 ejbLite-3.2 替换了 ejb-3.2,并将我的数据库名称恢复为原来的名称,一切正常。

标签: java jakarta-ee timer ejb websphere-liberty


【解决方案1】:

您似乎开启了ejbPersistentTimer-3.2 功能,因为您在配置数据源时遇到了异常。

如果您要使用ejbPersistentTimer-3.2(或包含它的ejb-3.2),您需要配置一个数据源以用于持久计时器。

由于您不需要持久性 EJB 计时器(因为您的 @Schedule 注释中有 persistent=false),您可以删除 ejbPersistentTimer-3.2 功能并只使用 ejbLite-3.2 功能(不包括持久性计时器功能)。

ejbLite-3.2 功能包括对非持久性计时器的支持,您无需担心配置数据源。

【讨论】:

  • 我目前正在使用 ejb-3.2 功能,其中包括 ejbPersistentTimer-3.2(根据控制台输出)。所以即使删除 ejbPersistentTimer-3.2 我仍然得到相同的结果。
  • @schuno 我指的是ejbLite-3.2,而不是完整的ejb-3.2。 Lite 功能不包括持久性计时器。
  • 谢谢!一旦我从 ejb-3.2 更改为 ejbLite-3.2,它就起作用了!
  • @aguibert 可以创建一个如何使用非持久性计时器的小示例。
  • @Mindaugas OP 中显示了使用非持久性计时器的示例。关键是拥有@Schedule(.... persistent=false)
【解决方案2】:

WAS Liberty 支持 EJB 计时器,前提是您使用完全符合 Java EE 7 的 8.5.5.6 或更高版本。

【讨论】:

  • 嗨 Alasdair,我使用的是 8.5.57 版本,所以根据你所说的,这应该可以工作。我将我的 dataSource id 更改为“DefaultDataSource”,现在我得到了一个新的异常(我将新的异常作为“更新”添加到我原来的问题中)。谢谢。
【解决方案3】:
  1. 添加一个新的数据库存储,并为其提供对数据源的引用。如果您没有一个用于 EJB 计时器表或想要一个不同的表,您可以在 Database Store 下创建一个 Data Source。确保您提供ID
  2. 添加 EJB 容器 -> EJB 定时器服务 -> EJB 持久定时器调度执行器
  3. EJB Persistent Timers Scheduled Executor上,将Persistent task store reference设置为Database StoreID

这应该可以消除错误,并且不需要您切换到 EJB Lite。

【讨论】:

    【解决方案4】:

    http://www.ibm.com/developerworks/websphere/library/techarticles/1404_vines1/1404_vines1.html 的 IBM 文章看来,它似乎不可用,您必须使用第三方:

    Liberty 配置文件或 Liberty Core 不支持 EJB 计时器服务。 如果您的应用程序使用 EJB 计时器服务,您可以选择以下选项之一: 在 WebSphere Application Server Full 配置文件中部署这部分应用程序。 使用其他第三方调度库。 注意:虽然第二个选项被列为一种复杂的方法,但如果涉及少量计时器,则可以简化其复杂性。

    更新:

    进一步研究发现这个线程似乎提供了一个解决方案(至少有一个公认的答案):

    https://developer.ibm.com/answers/questions/187132/ejbpersistenttimer-32/

    【讨论】:

    • 过时,不再有效。
    猜你喜欢
    • 2012-01-30
    • 1970-01-01
    • 2012-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多