EJB 3.1 @Schedule 可以在应用程序代码之外配置吗?
Posted
技术标签:
【中文标题】EJB 3.1 @Schedule 可以在应用程序代码之外配置吗?【英文标题】:Can the EJB 3.1 @Schedule be configured outside of the application code? 【发布时间】:2011-04-26 10:10:51 【问题描述】:如何配置计划间隔:
@Schedule(persistent=true, minute="*", second="*/5", hour="*")
在应用程序代码之外?
-
如何在 ejb-jar.xml 中配置?
我可以在应用程序之外配置它(属性文件的种类)吗?
【问题讨论】:
【参考方案1】:以下是部署描述符中的调度示例:
<session>
<ejb-name>MessageService</ejb-name>
<local-bean/>
<ejb-class>ejb.MessageService</ejb-class>
<session-type>Stateless</session-type>
<timer>
<schedule>
<second>0/18</second>
<minute>*</minute>
<hour>*</hour>
</schedule>
<timeout-method>
<method-name>showMessage</method-name>
</timeout-method>
</timer>
</session>
另一种配置定时器的方法是编程调度。
@Singleton
@Startup
public class TimedBean
@Resource
private TimerService service;
@PostConstruct
public void init()
ScheduleExpression exp=new ScheduleExpression();
exp.hour("*")
.minute("*")
.second("*/10");
service.createCalendarTimer(exp);
@Timeout
public void timeOut()
System.out.println(new Date());
System.out.println("time out");
【讨论】:
假设我有几天,例如(星期一,星期二,....,星期五)和工作时间(9-18),我该如何申请这种方法。 这不适用于:@Schedule(second = "30", minute = "*/5", hour = "*", persistent = false) 在 JBoss EAP 7.0.0 中,这需要从<session-type>Stateless</session-type>
更改为 <session-type>Singleton</session-type>
【参考方案2】:
根据 EJB 3.1 规范,可以通过注解或通过ejb-jar.xml
部署描述符来配置自动计时器。
18.2.2 自动创建计时器
定时器服务支持 自动创建一个基于 bean 类中的元数据或 部署描述符。这允许 bean 开发人员安排一个计时器 不依赖 bean 调用 以编程方式调用其中一个 Timer 服务定时器的创建方法。 自动创建的计时器是 结果由容器创建 应用程序部署。
我对部署描述符 XLM 架构的理解是,您使用 <session>
元素内的 <timer>
元素来定义它。
<xsd:element name="timer"
type="javaee:timerType"
minOccurs="0"
maxOccurs="unbounded"/>
请参阅timerType
复杂类型的定义了解详细信息(尤其是schedule
和timeout-method
元素)。
参考文献
EJB 3.1 规范 第 18.2.2 节“自动创建计时器” 第 19.5 节“部署描述符 XML 架构”(第 580 页,第 583-p584 页)【讨论】:
【参考方案3】:-
ejb-jar.xml
对我来说,ejb-jar.xml 变体仅在 TomEE 上开始工作,我在超时方法中传递 javax.ejb.Timer 参数:
<session>
<ejb-name>AppTimerService</ejb-name>
<ejb-class>my.app.AppTimerService</ejb-class>
<session-type>Singleton</session-type>
<timer>
<schedule>
<second>*/10</second>
<minute>*</minute>
<hour>*</hour>
</schedule>
<timeout-method>
<method-name>timeout</method-name>
<method-params>
<method-param>javax.ejb.Timer</method-param>
</method-params>
</timeout-method>
</timer>
public class AppTimerService
public void timeout(Timer timer)
System.out.println("[in timeout method]");
感谢https://blogs.oracle.com/arungupta/entry/totd_146_understanding_the_ejb 发帖。
-
属性文件变体
您可以读取 .properties 文件并以编程方式创建计时器
ScheduleExpression schedule = new ScheduleExpression();
schedule.hour(hourProperty);//previously read property from .properties file
schedule.minute(minuteProperty);//previously read property from .properties file
Timer timer = timerService.createCalendarTimer(schedule);
但我找不到我们可以在 EJB 中使用 cron 表达式。
【讨论】:
以上是关于EJB 3.1 @Schedule 可以在应用程序代码之外配置吗?的主要内容,如果未能解决你的问题,请参考以下文章
使用 Wildfly 8.1.0 Final 部署 Java @Schedule
是否可以在 GlassFish 3.1 上为无状态 ejb Web 服务定义 servlet 过滤器
Swing 客户端上的 Apache Shiro - 身份验证授权的 EJB 3.1 案例
EJB 3.1 绑定在 Websphere Application Server 上不起作用