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

时间:2010-10-16 20:26:32

标签: java java-ee-6 ejb-3.1 schedule

如何配置计划间隔:

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

在应用程序代码之外?

  1. 如何在ejb-jar.xml中配置它?
  2. 我可以在应用程序之外配置它(属性文件的种类)吗?

3 个答案:

答案 0 :(得分:18)

以下是部署描述符中的调度示例:

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

}

答案 1 :(得分:9)

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

  

18.2.2自动定时器创建

     

定时服务支持   基于的自动创建计时器   bean类中的元数据或   部署描述符。这允许bean开发人员安排计时器   不依赖于bean调用   以编程方式调用其中一个   定时服务定时器创建方法。   自动创建的计时器是   由容器创建的结果   应用程序部署。

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

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

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

参考

  • EJB 3.1规范
    • 第18.2.2节“自动定时器创建”
    • 第19.5节“部署描述符XML架构”(p.580,p583-p584)

答案 2 :(得分:0)

  1. ejb-jar.xml中
  2. 对我来说,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发帖。

    1. 属性文件变体
    2. 您可以阅读.properties文件并以编程方式创建Timer

      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表达式。