最後に、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 にある必要があります。