2

私は自分のアプリケーションでクォーツをうまく使用しています。基本的に、Jboss内で実行されているwebapp1内にクォーツがバンドルされています。

ただし、jbossで実行されている別のwebapp2があり、クォーツジョブも必要です。

ここで私がする必要があるのは、ある種のサービスとしてjbossでクォーツスケジューラーを実行することです。両方のWebアプリケーションが単一のクォーツスケジューラーにジョブを登録できるはずです。

以下は、これまで機能していたwebapp1の関連するスプリング構成です。

<bean id="qtzScheduler"
    class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
    <property name="dataSource">
        <ref bean="jndiDataSource" />
    </property>
    <property name="applicationContextSchedulerContextKey">
        <value>applicationContext</value>
    </property>
    <property name="transactionManager">
        <ref bean="transactionManager" />
    </property>
    <property name="schedulerName" value="webapp1" />       
</bean>

<bean id="wrapperScheduler" class="uk.fa.quartz.schedule.ServiceScheduler">
    <property name="scheduler">
        <ref bean="qtzScheduler" />
    </property>
</bean>

<bean id="jndiDataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
    <property name="jndiName">
        <value>java:/FmManagerDS</value>
    </property>
</bean>

ジョブをスケジュールする必要がある場合、コードは次のようになります。

   WrapperScheduler scheduler = (WrapperScheduler) ctx.getBean("wrapperScheduler");
   scheduler.scheduleCronJob(job, jobName + "CronTrigger", WrapperScheduler.TRIGGER_GROUP, cronExpression);

ここで、同じスケジューラーをwebapp2で再度定義したくないので、jbossで2つのクォーツスケジューラーが実行されます。

誰かがそれを行う方法を知っていますか?私はインターネットで以下のような一例を見ました。リンクは私がやりたいことをしていると思います。しかし、Springソースで定義されたデータソースを使用してこれをシステムと統合する方法がわかりません。誰かが設定を共有したり、インターネット上の適切なリソースを教えてくれたら、とてもありがたいです。

4

2 に答える 2

2

参照するリンクは、JBoss に組み込まれている Quartz スケジューラ サービスにアクセスする方法を説明しています。私はそのようなアプローチを使用したことはありませんが、基本的には JBoss にスケジューラ、データ ソース、およびその周辺のすべてを処理させます。これにより、面倒な設定をせずにジョブ スケジューリングを非常に簡単に利用できますが、あまり柔軟ではなく、アプリケーションはもはや自己完結型ではありません。

あなたの場合、調査する価値のある2つのオプションがあります。

クラスター化された Quartz スケジューラー

両方の Web アプリケーションをクラスターで実行するように構成します。両方のアプリケーションが同じデータベースを共有し、相互に定義されたジョブを実行します。これは、いくつかの理由により、選択肢にならない場合があります。

  • 両方のアプリケーションが、互いに定義されたジョブを実行できる必要があります。たとえば、ジョブ クラスが CLASSPATH で使用可能である必要があります。

  • 両方のアプリケーションで Quartz 構成を定義する必要があります (ただし、XML 構成を別のファイルに抽出するなどして、構成を簡単に共有できます)。

  • 両方のアプリケーションが別々のスレッド プールを維持します

クラスタリングは、単一ノード上の異種アプリケーションではなく、複数のマシンで実行される同種アプリケーションに適しています。

リモートスケジューラ

Quartz には、を介したリモート スケジューラのサポートが組み込まれています。基本的に、1 つのアプリケーションが本格的な Quartz サーバーをホストし、もう 1 つのアプリケーションがそのサーバーに接続します。1 つのアプリケーションのみがスケジューラを管理し、もう 1 つのアプリケーションは既存のスケジューラを使用するため、これはより良いアプローチのように思えます (「マスタースレーブ」と呼びましょう)。

参照: RemoteScheduler

于 2012-08-13T18:14:26.790 に答える
0

最後に、jboss で動作するサービスとして Quartz を使用する必要がある他のすべての人のために、すべてを書き留める時間がありました。ただし、@Tomasz による彼の回答に記載されている他のオプションも試すことができます。

バインドされている JBoss サーバーの外部から参照を取得しようとすると、null 参照が返されることに注意してください。そのような要件がある場合は、代わりに Quartz の RMI サポートを使用することを検討してください。

1)まず、jboss/[profile]/lib または jboss ディストリビューションに付属する Quartz.rar にある既存のバージョンの Quartz をすべて削除してください。

2)quartz.1.8.3.jar と Quartz-jboss.1.8.jar を acccesmanager/[profile]/lib に追加してください

3) 以下は、Quartz スケジューラーを開始する jboss deploy フォルダーに配置する必要がある Quartz-service.xml のコードです。

    <server> 
     <mbean code="org.quartz.ee.jmx.jboss.QuartzService" 
     name="user:service=QuartzService,name=QuartzService">    
     <attribute name="JndiName">Quartz</attribute> 
     <attribute name="Properties">        
     org.quartz.scheduler.instanceName = BGSScheduler 
     org.quartz.scheduler.rmi.export = false 
     org.quartz.scheduler.rmi.proxy = false 
     org.quartz.scheduler.xaTransacted = false 
     org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool  
     org.quartz.threadPool.threadCount = 5 
     org.quartz.threadPool.threadPriority = 4 
     org.quartz.scheduler.threadsInheritContextClassLoaderOfInitializer = true
     org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread = true
     org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreCMT
     org.quartz.jobStore.driverDelegateClass =  org.quartz.impl.jdbcjobstore.StdJDBCDelegate
     org.quartz.jobStore.dataSource = QUARTZ
     org.quartz.dataSource.QUARTZ.jndiURL = java:FmManagerDS 
     org.quartz.jobStore.nonManagedTXDataSource = QUARTZ_NO_TX
     org.quartz.dataSource.QUARTZ_NO_TX.jndiURL = java:FmManagerDS
     </attribute>     
     <depends>jboss.jca:service=DataSourceBinding,name=FmManagerDS</depends>
     </mbean> 
     </server>

] ほとんどのことは自明ですが、Quartz Configurationで詳細を確認できます 。重要なことは、Quartz には 2 つのデータソースが必要であることに注意することです。私の場合はjava:FmManagerDS)。「org.quartz.jobStore.dataSource」が XA の場合、「org.quartz.jobStore.nonManagedTXDataSource」を非 XA データソースに設定します (同じ DB 用)。それ以外の場合は、それらを同じに設定できます。

次に、春のapplicationContextで、wrapperScheduler.Codeに注入できるように、クォーツのハンドルを取得する必要がありました。

    <bean id="quartzScheduler" class="org.springframework.jndi.JndiObjectFactoryBean">
            <property name="jndiName">
                <value>Quartz</value>
            </property>
    </bean>

<bean id="wrapperScheduler" class="k.fa.quartz.schedule.ServiceScheduler">
            <property name="scheduler">
                <ref bean="quartzScheduler" />
            </property>
    </bean>

次に、以下を使用してジョブをスケジュールできます

Timestamp t = new Timestamp (System.currentTimeMillis());
ScheduleJob job = new ScheduleJob(EmailJob.class.getCanonicalName() +t.toString(), EmailJob.class);

以下は、Spring applicationContext を EmailJob に渡して、Bean などにアクセスできるようにするコードです。これを実現するには、ApplicationContextAware インターフェースを実装して、applicationContext が使用可能になり、同じものが schedulerContext にプッシュされるようにする必要があります。シリアル化の問題が発生するため、JDBC ストアを使用している場合は、applicationContext を JobdataMap に入れないでください。

    serviceScheduler.getScheduler().getContext().put("applicationContext", ctx);
    serviceScheduler.scheduleCronJob(job, "test" + t.toString(), ServiceScheduler.DEFAULT_TRIGGER_GROUP, cronExpression);

wrapperscheduler を使用していない他のユーザーは、同様に、以下を使用してコードに直接 Quartz のハンドルを取得できます。

    InitialContext ctx = new InitialContext();
    Scheduler scheduler = (Scheduler) ctx.lookup("Quartz");
    ScheduleJob job = new ScheduleJob(EmailJob.class.getCanonicalName() +t.toString(), Executor.class);
    scheduler.scheduleJob(job, trigger);

Email ジョブ クラスでは、以下を使用して applicationContext を取得できます。

       applicationContext = (ApplicationContext) context.getScheduler().getContext().get(APPLICATION_CONTEXT_KEY);
       //get spring bean and do the necessary stuff

もう 1 つの重要な点は、Quartz スケジューラは Web アプリケーションの外部で実行されているため、war 内にある場合、Quartz はジョブクラスを起動できないことです。jboss/[profile]/lib の共有 jar にある必要があります。

于 2012-08-17T14:39:16.913 に答える