是否可以在应用程序代码之外配置 EJB 3.1 @Schedule?

2022-09-02 01:32:11

如何配置计划间隔:

@Schedule(persistent=true, minute="*", second="*/5", hour="*")

在应用程序代码之外?

  1. 如何在ejb-jar中配置它.xml?
  2. 是否可以在应用程序(属性文件类型)之外对其进行配置?

答案 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");
    }

}

答案 2

根据 EJB 3.1 规范,可以通过注释或部署描述符来配置自动计时器。ejb-jar.xml

18.2.2 自动创建计时器

定时服务支持基于 Bean 类或部署描述符中的元数据自动创建定时器。这允许 Bean 开发人员调度计时器,而无需依赖 Bean 调用以编程方式调用其中一个 Timer Service 计时器创建方法。自动创建的计时器由容器作为应用程序部署的结果创建。

我对部署描述符 XLM 架构的理解是,您可以使用元素中的元素来定义它。<timer><session>

<xsd:element name="timer"
             type="javaee:timerType"
             minOccurs="0"
             maxOccurs="unbounded"/>

有关详细信息(特别是 和 元素),请参阅复杂类型的定义。timerTypescheduletimeout-method

引用

  • EJB 3.1 规范
    • 第 18.2.2 节 “自动创建计时器”
    • 第 19.5 节 “部署描述符 XML 模式” (页码 580, p583-p584)

推荐