在Liberty中创建EJB计时器

时间:2015-11-10 14:05:56

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

我需要创建一个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更改为&#34; DefaultDataSource&#34;,现在我在启动服务器时在控制台中遇到了不同的异常:

[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的结果吗?如果有,是否有办法避免这种情况?

4 个答案:

答案 0 :(得分:5)

看起来您已启用ejbPersistentTimer-3.2功能,因为您在配置DataSource时遇到异常。

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

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

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

答案 1 :(得分:1)

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

答案 2 :(得分:0)

  1. 添加新的数据库存储并为其提供对数据源的引用。如果您没有EJB计时器表或想要一个不同的计时器表,则可以在数据库存储下创建数据源。确保您提供ID
  2. 添加 EJB容器 - &gt; EJB计时器服务 - &gt; EJB持久定时器预定执行程序
  3. EJB持久定时器计划执行程序上将持久性任务存储引用设置为数据库存储ID
  4. 应该摆脱错误,不要求你切换到EJB Lite。

答案 3 :(得分:-1)

来自http://www.ibm.com/developerworks/websphere/library/techarticles/1404_vines1/1404_vines1.html的IBM文章,看起来它不可用,你必须去第三方:

  

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

<强>更新

进一步的研究发现这个线索似乎提供了一个解决方案(至少在那里已经接受了答案):

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