最後,我有時間寫下所有其他人可能不得不使用Quartz作爲在jboss中運行的服務。 但他的@Tomasz回答中提到的其他選項也可以嘗試。
請注意,如果您嘗試從綁定綁定的JBoss服務器之外檢索到空引用,您將收到空引用。如果你有這樣的要求,你可能會考慮使用Quartz的RMI支持。
1)首先確保你刪除了jboss/[profile]/lib中的任何現有版本的quartz,或者是與jboss發行版一起提供的quartz.rar。
2)請您quartz.1.8.3.jar &石英jboss.1.8.jar到acccesmanager/[資料]/lib中
3)下面是石英service.xml中,其需要的代碼被放置在其中將啓動Quartz調度了JBoss部署文件夾:
<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 關鍵的一點是要注意的是石英需要獲得更多關於這方面的詳細信息2個數據源。一個是容器管理的數據源 - 與之相同在jboss * -ds.xml中定義(在我的情況下是java:FmManagerDS)。 如果'org.quartz.jobStore.dataSource'是XA,那麼將'org.quartz.jobStore.nonManagedTXDataSource'設置爲非XA數據源(對於同一個數據庫)。否則,您可以將它們設置爲相同。
在Spring的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.Please確保我們不會將ApplicationContext放入JobdataMap,因爲它會導致序列化問題。誰不使用wrapperscheduler
serviceScheduler.getScheduler().getContext().put("applicationContext", ctx);
serviceScheduler.scheduleCronJob(job, "test" + t.toString(), ServiceScheduler.DEFAULT_TRIGGER_GROUP, cronExpression);
其他可以使用下面
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);
在電子郵件作業類石英的手柄同樣獲得直接進入他們的代碼,你可以使用下面讓ApplicationContext的
applicationContext = (ApplicationContext) context.getScheduler().getContext().get(APPLICATION_CONTEXT_KEY);
//get spring bean and do the necessary stuff
另一個重要的事情是,由於石英切割機運行在網絡應用程序之外,如果石英在戰爭中,它將無法發射工作類。它需要位於jboss/[profile]/lib中的共享jar中。
感謝您給我一個通道。這是否意味着我將不得不創建另一個webapp3,它將充當石英服務器,並且webapp1&webapp2將使用它,或者我可以在webapp1之一中運行石英服務器,並使webapp2使用但是在這兩種情況下,我認爲jobclasses不會被調用webapp使用。請給我們一些啓示? – Rips 2012-08-13 21:47:52
@Rips:您是對的,您可以創建'webapp3'或使用現有應用程序之一來託管Quartz。關於CLASSPATH問題 - 如果沒有它們,您將永遠無法離開 - 運行作業的JVM/classloader必須有權訪問作業類 - 在所有情況下。 – 2012-08-13 21:51:34
我們沒有在jboss中使用統一的類加載器,因此一個webapp中的類不會在其他webapp2中的內容中具有可見性。 這是否意味着所有工作類和它用於業務邏輯的類都需要放入托管石英的Web應用程序中。 ?那麼我還沒有其他選擇嗎? – Rips 2012-08-13 22:35:17