在Glassfish Web配置文件上启用计时器的最佳方法

时间:2011-10-23 19:24:16

标签: spring scheduling java-ee-6 glassfish-3

我使用网络个人资料,但不允许使用Java EE @Schedule 功能。所以,我有几种方法可以解决这个问题:

  1. 重新安装服务器以使用完整个人资料。问题:我的生产风险很大(功能/性能)和负担
  2. 使用其他调度功能,如Spring。问题:我不知道如何将Spring与JavaEE链接,因为我想在我的调度程序中使用CDI bean。 Seam-spring模块可以帮助我(http://sfwk.org/Seam3/SpringModule)但是它的文档目前不可用,我真的不知道它的状态。
  3. 那么,这是在我的glassfish应用程序中启用调度的最佳方法吗?

    由于

2 个答案:

答案 0 :(得分:1)

我们在Spring中使用Quartz开源作业调度程序在其他项目上有很多运气,所以我强烈推荐它用于调度。您可以将调度程序配置为从Servlet(可以注入CDI bean)启动,并且计划的作业可以调用EJB无状态会话Bean(您也可以在其中注入CDI bean)。

以下是一些链接 - 希望这有帮助!

Initialze a Scheduler in a servlet container

Here's a great article on calling an EJB from Quartz

答案 1 :(得分:1)

好的,我设法使用弹簧模块。最好使用嵌入式Scheduler J2EE功能,但这不包含在Glassfish Web配置文件中,只包括完整(WTF ??)。由于我的项目是prod,我不想升级到完整项目,特别是因为没有灵活的方法来进行此升级。只有完整服务器替代。非常差的JavaEE ....

因此,首先,我们需要定义一些将按计划运行的功能:

@Scope(value="application")
public class ClosePolisesTimer {            
BusinessAttirbuteDAO attributeDAO;

    @Scheduled(cron="0 0 0 * * *")
    public void doCloseObsolete() {
       // ...
    }
}

其次,我们应该使用以下配置创建spring配置文件:

<bean id="businessAttributeDAOBean" class="org.springframework.jndi.JndiObjectFactoryBean">
        <property name="jndiName" value="java:global/KaskoCalculator/BusinessAttirbuteDAO" />
    </bean>
<bean id="ClosePolisesTimer" class="com.rstk.kasko.bean.service.ClosePolisesTimer">
        <aop:scoped-proxy />
        <property name="polisDAO" ref="polisDAOBean" />
        <property name="attributeDAO" ref="businessAttributeDAOBean" />
    </bean>

<task:annotation-driven scheduler="closePolisExecutor"/>
<task:scheduler id="closePolisExecutor" pool-size="1"/>

这就是全部。我定义EJB bean并使用“aop:scoped-proxy”来初始化我的调度程序。弹簧计划包含在核心弹簧模块中,因此只需要核心弹簧依赖性