2012-07-02 51 views
0

我想跟进作为“石英调度工作框架”书示例“Web应用程序内初始化石英”中提到的步骤。这里是程序https://gist.github.com/5777d9f27c700e716a5a的链接。但是这个例子在Struts1框架上。初始化QuartzScheduler当容器首次加载Web应用程序

Ours是一个带有Hibernate 3.5 ORM的struts2框架。我应该如何配置Struts2上的确切步骤。任何帮助,将不胜感激。

但是,如果我写的内contextInitialized()方法,我得到异常“了java.lang.RuntimeException:java.io.FileNotFoundException:SRC/hibernate.cfg.xml文件(没有这样的文件或目录)”的代码

Xml config = new Xml("src/hibernate.cfg.xml", "hibernate-configuration"); 
Properties prop = new Properties(); 
prop.setProperty("org.quartz.dataSource.tasksDataStore.driver", config.child("session- 
             factory").children("property").get(1).content()); 
prop.setProperty("org.quartz.dataSource.tasksDataStore.URL", config.child("session- 
             factory").children("property").get(2).content()); 
prop.setProperty("org.quartz.dataSource.tasksDataStore.user", config.child("session- 
             factory").children("property").get(3).content()); 
prop.setProperty("org.quartz.dataSource.tasksDataStore.password", config.child("session- 
             factory").children("property").get(4).content()); 
prop.setProperty("org.quartz.dataSource.tasksDataStore.maxConnections", "20"); 

SchedulerFactory sf = new StdSchedulerFactory(prop); 
Scheduler sched = sf.getScheduler(); 
+0

如果解决方案适用于您,我建议您勾选答案以帮助其他用户。 –

+0

您的解决方案对我来说完美无缺。谢谢.. :)我正在使用实现ServletContextListener的类实例化Quartz Scheduler类并启动调度程序。但是hibernate.cfg.xml(db连接属性是剩下的一个问题) –

回答

4

要在容器加载时初始化调度程序,可以执行此操作。

import javax.servlet.ServletContext; 
import javax.servlet.ServletContextEvent; 
import javax.servlet.ServletContextListener; 

import org.quartz.SchedulerException; 
import org.quartz.impl.StdSchedulerFactory; 

public class QuartzServletContextListener implements ServletContextListener 
{ 
    public static final String QUARTZ_FACTORY_KEY = "org.quartz.impl.StdSchedulerFactory.KEY"; 
    private StdSchedulerFactory factory = null; 

    /** 
    * Called when the container is shutting down. 
    */ 
    public void contextDestroyed(ServletContextEvent sce) 
    { 
     try 
     { 
      factory.getDefaultScheduler().shutdown(); 
     } catch (SchedulerException ex) 
     { 
     } 

    } 

    /** 
    * Called when the container is first started. 
    */ 
    public void contextInitialized(ServletContextEvent sce) 
    { 
     ServletContext ctx = sce.getServletContext(); 
     try 
     { 
      factory = new StdSchedulerFactory(); 

      // Start the scheduler now 
      factory.getScheduler().start(); 
      ctx.setAttribute(QUARTZ_FACTORY_KEY, factory); 

     } catch (Exception ex) 
     { 
     } 
    } 
} 

在web.xml中添加

<listener> 
    <description>A Listener Class to initialize Quartz Scheduler</description> 
    <listener-class>full_package_path.QuartzServletContextListener</listener-class> 
</listener> 

这基本上创建调度的集装箱的货物时。然后,您可以使用我以前的帖子从StdSchedulerFactory中检索StdSchedulerFactory。 让我知道是否有问题。

+0

这是一个很好的例子,但你应该真正做一些你抓住的例外。为了简洁起见,你可能忽略了它们,但是很多碰到这种情况的人会盲目地复制/粘贴它。 –

+0

感谢这个例子,我留下的一个查询是初始化时的数据库连接属性。所以,我得到了hibernate.cfg.xml中的db连接属性,并将它添加到SchedulerFactory sf = new StdSchedulerFactory(properties)中。你可以在我的文章中查看代码。 –

+0

您的src/hibernate.cfg.xml位于您的应用程序中。在构建它的src/hibernate.cfg.xml文件之前,先建立它的 –

0
  1. 首先,您需要在您的web.xml中配置QuartzInitializerServlet。其次,你的Struts2动作需要实现ServletContextAware接口。该接口有一个设置ServletContext的方法。
  2. 然后,您可以继续接收您的StdSchedulerFactory。

public class MyClass implements ServletContextAware {

private ServletContext context; 

public void setServletContext(ServletContext context) 
{ 
    this.context = context. 
} 

public String execute() 
{ 
    StdSchedulerFactory factory = (StdSchedulerFactory)context.getAttribute(QuartzFactoryServlet.QUARTZ_FACTORY_KEY); 

    // Retrieve the scheduler from the factory 
    Scheduler scheduler = factory.getDefaultScheduler(); 
} 

} 

希望这是更清晰。

+0

所以,当容器加载时,它会进入execute方法吗?以及“execute()”方法返回为String的是什么? –

+0

当容器加载时,这不会运行。 –

+0

否容器加载时不调用execute方法。如果你希望'StdSchedulerFactory'在容器加载时被实例化,你可以实现并注册一个'ServletContextListener'并在'contextInitialized'方法中初始化Scheduler。 –

相关问题