1

「クォーツスケジューリングフレームワーク」の本「Webアプリケーション内でのクォーツの初期化」の例に記載されている手順を実行しようとしています。プログラムhttps://gist.github.com/5777d9f27c700e716a5aへのリンクは次のとおりです。しかし、例はStruts1フレームワークにあります。

私たちのものは、Hibernate3.5ORMを備えた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();
4

2 に答える 2

5

コンテナーのロード時にスケジューラーを初期化するには、これを行うことができます。

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。問題がある場合はお知らせください。

于 2012-07-02T17:27:03.783 に答える
1
  1. まず、web.xmlでQuartzInitializerServletを構成する必要があります。
  2. 次に、Struts2アクションはServletContextAwareインターフェースを実装する必要があります。このインターフェースには、ServletContextを設定するメソッドがあります。
  3. その後、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();
}

}

これがより明確になることを願っています。

于 2012-07-02T12:47:35.147 に答える