2012-07-02 50 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。 –

相關問題