Saya berhasil mengonfigurasi dan menjadwalkan pekerjaan Quartz menggunakan penyimpanan persisten JobStoreTX di Musim Semi. Saya tidak menggunakan pekerjaan Spring's Quartz, karena saya perlu menjadwalkannya secara dinamis, pada waktu proses, dan semua contoh pengintegrasian Spring dengan Quartz yang saya temukan adalah hard-coding shcedules di file konfigurasi Spring ... Bagaimanapun, inilah caranya Saya menjadwalkan pekerjaan:
JobDetail emailJob = JobBuilder.newJob(EMailJob.class)
.withIdentity("someJobKey", "immediateEmailsGroup")
.storeDurably()
.build();
SimpleTrigger trigger = (SimpleTrigger) TriggerBuilder.newTrigger()
.withIdentity("someTriggerKey", "immediateEmailsGroup")
.startAt(fireTime)
.build();
// pass initialization parameters into the job
emailJob.getJobDataMap().put(NotificationConstants.MESSAGE_PARAMETERS_KEY, messageParameters);
emailJob.getJobDataMap().put(NotificationConstants.RECIPIENT_KEY, recipient);
if (!scheduler.checkExists(jobKey) && scheduler.getTrigger(triggerKey) != null) {
// schedule the job to run
Date scheduleTime1 = scheduler.scheduleJob(emailJob, trigger);
}
EMailJob adalah pekerjaan sederhana yang mengirim e-mail menggunakan kelas JavaMailSenderImpl Spring.
public class EMailJob implements Job {
@Autowired
private JavaMailSenderImpl mailSenderImpl;
public EMailJob() {
}
public void execute(JobExecutionContext context)
throws JobExecutionException {
....
try {
mailSenderImpl.send(mimeMessage);
} catch (MessagingException e) {
....
throw new JobExecutionException("EMailJob failed: " + jobKey.getName(), e);
}
logger.info("EMailJob finished OK");
}
Masalahnya adalah saya perlu mendapatkan referensi ke instance kelas ini (JavaMailSenderImpl) di kelas EMailJob saya. Ketika saya mencoba menyuntikkannya seperti ini:
@Autowired
private JavaMailSenderImpl mailSenderImpl;
itu tidak disuntikkan - referensinya adalah NULL. Saya berasumsi ini terjadi karena bukan Spring yang membuat instance kelas EMailJob, tetapi Quartz, dan Quartz tidak tahu apa-apa tentang injeksi ketergantungan ...
Jadi, adakah cara untuk memaksa injeksi ini terjadi?
Terima kasih!
Pembaruan 1: @ Aaron: berikut adalah bagian yang relevan dari stacktrace dari startup, yang menunjukkan EMailJob dibuat dua kali:
2011-08-15 14:16:38,687 [main] INFO org.springframework.context.support.GenericApplicationContext - Bean 'org.springframework.security.access.expression.method.DefaultMethodSecurityExpressionHandler#0' is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
2011-08-15 14:16:38,734 [main] INFO org.springframework.beans.factory.support.DefaultListableBeanFactory - Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@1328c7a: defining beans [...]; root of factory hierarchy
2011-08-15 14:16:39,734 [main] INFO com.cambridgedata.notifications.EMailJob - EMailJob() - initializing ...
2011-08-15 14:16:39,937 [main] INFO org.springframework.security.access.intercept.aopalliance.MethodSecurityInterceptor - Validated configuration attributes
2011-08-15 14:16:40,078 [main] INFO org.springframework.security.web.access.intercept.FilterSecurityInterceptor - Validated configuration attributes
2011-08-15 14:16:40,296 [main] INFO org.springframework.jdbc.datasource.init.ResourceDatabasePopulator - Executing SQL script from class path resource ...
2011-08-15 14:17:14,031 [main] INFO com.mchange.v2.log.MLog - MLog clients using log4j logging.
2011-08-15 14:17:14,109 [main] INFO com.mchange.v2.c3p0.C3P0Registry - Initializing c3p0-0.9.1.1 [built 15-March-2007 01:32:31; debug? true; trace: 10]
2011-08-15 14:17:14,171 [main] INFO org.quartz.core.SchedulerSignalerImpl - Initialized Scheduler Signaller of type: class org.quartz.core.SchedulerSignalerImpl
2011-08-15 14:17:14,171 [main] INFO org.quartz.core.QuartzScheduler - Quartz Scheduler v.2.0.1 created.
2011-08-15 14:17:14,187 [main] INFO org.quartz.impl.jdbcjobstore.JobStoreTX - Using thread monitor-based data access locking (synchronization).
2011-08-15 14:17:14,187 [main] INFO org.quartz.impl.jdbcjobstore.JobStoreTX - JobStoreTX initialized.
2011-08-15 14:17:14,187 [main] INFO org.quartz.core.QuartzScheduler - Scheduler meta-data: Quartz Scheduler (v2.0.1) 'NotificationsScheduler' with instanceId 'NON_CLUSTERED'
Scheduler class: 'org.quartz.core.QuartzScheduler' - running locally.
NOT STARTED.
Currently in standby mode.
Number of jobs executed: 0
Using thread pool 'org.quartz.simpl.SimpleThreadPool' - with 3 threads.
Using job-store 'org.quartz.impl.jdbcjobstore.JobStoreTX' - which supports persistence. and is not clustered.
2011-08-15 14:17:14,187 [main] INFO org.quartz.impl.StdSchedulerFactory - Quartz scheduler 'NotificationsScheduler' initialized from the specified file : 'spring/quartz.properties' from the class resource path.
2011-08-15 14:17:14,187 [main] INFO org.quartz.impl.StdSchedulerFactory - Quartz scheduler version: 2.0.1
2011-08-15 14:17:14,234 [main] INFO com.mchange.v2.c3p0.impl.AbstractPoolBackedDataSource - Initializing c3p0 pool... com.mchange.v2.c3p0.ComboPooledDataSource [ acquireIncrement -> 3, acquireRetryAttempts -> 30, acquireRetryDelay -> 1000, autoCommitOnClose -> false, automaticTestTable -> null, breakAfterAcquireFailure -> false, checkoutTimeout -> 0, connectionCustomizerClassName -> null, connectionTesterClassName -> com.mchange.v2.c3p0.impl.DefaultConnectionTester, dataSourceName -> 2sajb28h1lcabf28k3nr1|13af084, debugUnreturnedConnectionStackTraces -> false, description -> null, driverClass -> com.mysql.jdbc.Driver, factoryClassLocation -> null, forceIgnoreUnresolvedTransactions -> false, identityToken -> 2sajb28h1lcabf28k3nr1|13af084, idleConnectionTestPeriod -> 50, initialPoolSize -> 3, jdbcUrl -> jdbc:mysql://localhost:3306/2010rewrite2, lastAcquisitionFailureDefaultUser -> null, maxAdministrativeTaskTime -> 0, maxConnectionAge -> 0, maxIdleTime -> 0, maxIdleTimeExcessConnections -> 0, maxPoolSize -> 5, maxStatements -> 0, maxStatementsPerConnection -> 120, minPoolSize -> 1, numHelperThreads -> 3, numThreadsAwaitingCheckoutDefaultUser -> 0, preferredTestQuery -> select 0 from dual, properties -> {user=******, password=******}, propertyCycle -> 0, testConnectionOnCheckin -> true, testConnectionOnCheckout -> false, unreturnedConnectionTimeout -> 0, usesTraditionalReflectiveProxies -> false ]
2011-08-15 14:17:14,312 [main] INFO org.quartz.impl.jdbcjobstore.JobStoreTX - Freed 0 triggers from 'acquired' / 'blocked' state.
2011-08-15 14:17:14,328 [main] INFO org.quartz.impl.jdbcjobstore.JobStoreTX - Recovering 0 jobs that were in-progress at the time of the last shut-down.
2011-08-15 14:17:14,328 [main] INFO org.quartz.impl.jdbcjobstore.JobStoreTX - Recovery complete.
2011-08-15 14:17:14,328 [main] INFO org.quartz.impl.jdbcjobstore.JobStoreTX - Removed 0 'complete' triggers.
2011-08-15 14:17:14,328 [main] INFO org.quartz.impl.jdbcjobstore.JobStoreTX - Removed 0 stale fired job entries.
2011-08-15 14:17:14,328 [main] INFO org.quartz.core.QuartzScheduler - Scheduler NotificationsScheduler_$_NON_CLUSTERED started.
2011-08-15 14:17:14,515 [NotificationsScheduler_QuartzSchedulerThread] INFO com.cambridgedata.notifications.EMailJob - EMailJob() - initializing ...
Terima kasih!
Pembaruan # 2: @Ryan:
Saya mencoba menggunakan SpringBeanJobFactory sebagai berikut:
<bean id="jobFactoryBean" class="org.springframework.scheduling.quartz.SpringBeanJobFactory">
</bean>
<bean id="schedulerFactoryBean" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="configLocation" value="classpath:spring/quartz.properties"/>
<property name="jobFactory" ref="jobFactoryBean"/>
</bean>
Dan saya telah memodifikasi kelas utama saya untuk mendapatkan Scheduler dari pabrik ini, bukan Quartz ':
@PostConstruct
public void initNotificationScheduler() {
try {
//sf = new StdSchedulerFactory("spring/quartz.properties");
//scheduler = sf.getScheduler();
scheduler = schedulerFactoryBean.getScheduler();
scheduler.start();
....
Tetapi ketika saya menjalankan aplikasi - mendapatkan kesalahan, lihat di bawah. Berikut adalah stacktrace dari startup Spring. Sepertinya Penjadwal itu sendiri dibuat dengan baik, tetapi kesalahan datang ketika mencoba memberi contoh EMailJob saya:
2011-08-15 21:49:42,968 [main] INFO org.springframework.scheduling.quartz.SchedulerFactoryBean - Loading Quartz config from [class path resource [spring/quartz.properties]]
2011-08-15 21:49:43,031 [main] INFO com.mchange.v2.log.MLog - MLog clients using log4j logging.
2011-08-15 21:49:43,109 [main] INFO com.mchange.v2.c3p0.C3P0Registry - Initializing c3p0-0.9.1.1 [built 15-March-2007 01:32:31; debug? true; trace: 10]
2011-08-15 21:49:43,187 [main] INFO org.quartz.core.SchedulerSignalerImpl - Initialized Scheduler Signaller of type: class org.quartz.core.SchedulerSignalerImpl
2011-08-15 21:49:43,187 [main] INFO org.quartz.core.QuartzScheduler - Quartz Scheduler v.2.0.1 created.
2011-08-15 21:49:43,187 [main] INFO org.quartz.impl.jdbcjobstore.JobStoreTX - Using thread monitor-based data access locking (synchronization).
2011-08-15 21:49:43,187 [main] INFO org.quartz.impl.jdbcjobstore.JobStoreTX - JobStoreTX initialized.
2011-08-15 21:49:43,187 [main] INFO org.quartz.core.QuartzScheduler - Scheduler meta-data: Quartz Scheduler (v2.0.1) 'schedulerFactoryBean' with instanceId 'NON_CLUSTERED'
Scheduler class: 'org.quartz.core.QuartzScheduler' - running locally.
NOT STARTED.
Currently in standby mode.
Number of jobs executed: 0
Using thread pool 'org.quartz.simpl.SimpleThreadPool' - with 3 threads.
Using job-store 'org.quartz.impl.jdbcjobstore.JobStoreTX' - which supports persistence. and is not clustered.
2011-08-15 21:49:43,187 [main] INFO org.quartz.impl.StdSchedulerFactory - Quartz scheduler 'schedulerFactoryBean' initialized from an externally provided properties instance.
2011-08-15 21:49:43,187 [main] INFO org.quartz.impl.StdSchedulerFactory - Quartz scheduler version: 2.0.1
2011-08-15 21:49:43,187 [main] INFO org.quartz.core.QuartzScheduler - JobFactory set to: org.springframework.scheduling.quartz.SpringBeanJobFactory@566633
2011-08-15 21:49:43,265 [main] INFO com.mchange.v2.c3p0.impl.AbstractPoolBackedDataSource - Initializing c3p0 pool... com.mchange.v2.c3p0.ComboPooledDataSource [ acquireIncrement -> 3, acquireRetryAttempts -> 30, acquireRetryDelay -> 1000, autoCommitOnClose -> false, automaticTestTable -> null, breakAfterAcquireFailure -> false, checkoutTimeout -> 0, connectionCustomizerClassName -> null, connectionTesterClassName -> com.mchange.v2.c3p0.impl.DefaultConnectionTester, dataSourceName -> 1hge13f8h1lsg7py1rg0iu0|1956391, debugUnreturnedConnectionStackTraces -> false, description -> null, driverClass -> com.mysql.jdbc.Driver, factoryClassLocation -> null, forceIgnoreUnresolvedTransactions -> false, identityToken -> 1hge13f8h1lsg7py1rg0iu0|1956391, idleConnectionTestPeriod -> 50, initialPoolSize -> 3, jdbcUrl -> jdbc:mysql://localhost:3306/2010rewrite2, lastAcquisitionFailureDefaultUser -> null, maxAdministrativeTaskTime -> 0, maxConnectionAge -> 0, maxIdleTime -> 0, maxIdleTimeExcessConnections -> 0, maxPoolSize -> 5, maxStatements -> 0, maxStatementsPerConnection -> 120, minPoolSize -> 1, numHelperThreads -> 3, numThreadsAwaitingCheckoutDefaultUser -> 0, preferredTestQuery -> select 0 from dual, properties -> {user=******, password=******}, propertyCycle -> 0, testConnectionOnCheckin -> true, testConnectionOnCheckout -> false, unreturnedConnectionTimeout -> 0, usesTraditionalReflectiveProxies -> false ]
2011-08-15 21:49:43,343 [main] INFO org.quartz.impl.jdbcjobstore.JobStoreTX - Freed 0 triggers from 'acquired' / 'blocked' state.
2011-08-15 21:49:43,359 [main] INFO org.quartz.impl.jdbcjobstore.JobStoreTX - Recovering 0 jobs that were in-progress at the time of the last shut-down.
2011-08-15 21:49:43,359 [main] INFO org.quartz.impl.jdbcjobstore.JobStoreTX - Recovery complete.
2011-08-15 21:49:43,359 [main] INFO org.quartz.impl.jdbcjobstore.JobStoreTX - Removed 0 'complete' triggers.
2011-08-15 21:49:43,359 [main] INFO org.quartz.impl.jdbcjobstore.JobStoreTX - Removed 0 stale fired job entries.
2011-08-15 21:49:43,359 [main] INFO org.quartz.core.QuartzScheduler - Scheduler schedulerFactoryBean_$_NON_CLUSTERED started.
2011-08-15 21:49:43,562 [schedulerFactoryBean_QuartzSchedulerThread] ERROR org.quartz.core.ErrorLogger - An error occured instantiating job to be executed. job= 'immediateEmailsGroup.DEFAULT.jobFor_1000new1'
org.quartz.SchedulerException: Problem instantiating class 'com.cambridgedata.notifications.EMailJob' - [See nested exception: java.lang.AbstractMethodError: org.springframework.scheduling.quartz.SpringBeanJobFactory.newJob(Lorg/quartz/spi/TriggerFiredBundle;Lorg/quartz/Scheduler;)Lorg/quartz/Job;]
at org.quartz.core.JobRunShell.initialize(JobRunShell.java:141)
at org.quartz.core.QuartzSchedulerThread.run(QuartzSchedulerThread.java:381)
Caused by: java.lang.AbstractMethodError: org.springframework.scheduling.quartz.SpringBeanJobFactory.newJob(Lorg/quartz/spi/TriggerFiredBundle;Lorg/quartz/Scheduler;)Lorg/quartz/Job;
at org.quartz.core.JobRunShell.initialize(JobRunShell.java:134)
Terima kasih!
sumber
Saya hanya menempatkan
SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext(this);
sebagai baris pertama dariJob.execute(JobExecutionContext context)
metode saya .sumber
Masalah yang sama telah diselesaikan di LINK :
Saya dapat menemukan opsi lain dari posting di forum Spring bahwa Anda dapat memberikan referensi ke konteks aplikasi Spring melalui SchedulerFactoryBean. Seperti contoh yang ditunjukkan di bawah ini:
Kemudian menggunakan kode di bawah ini di kelas pekerjaan Anda, Anda bisa mendapatkan applicationContext dan kacang apa pun yang Anda inginkan.
Semoga membantu. Anda dapat memperoleh informasi lebih lanjut dari Mark Mclaren'sBlog
sumber
Asumsi Anda benar tentang Spring vs. Quartz yang mendasari kelas. Namun, Spring menyediakan beberapa class yang memungkinkan Anda melakukan injeksi dependensi primitif di Quartz. Lihat SchedulerFactoryBean.setJobFactory () bersama dengan SpringBeanJobFactory . Pada dasarnya, dengan menggunakan SpringBeanJobFactory, Anda mengaktifkan injeksi ketergantungan pada semua properti Pekerjaan, tetapi hanya untuk nilai yang ada dalam konteks penjadwal Quartz atau peta data pekerjaan . Saya tidak tahu semua gaya DI yang didukungnya (konstruktor, anotasi, penyetel ...) tetapi saya tahu itu mendukung injeksi penyetel.
sumber
untuk semua yang akan mencobanya di masa depan.
org.springframework.scheduling.quartz.JobDetailBean menyediakan peta objek dan objek tersebut mungkin kacang musim semi.
definisikan
dan kemudian, di dalam
menelepon
myBean = (myBean) context.getMergedJobDataMap().get("myBean");
dan Anda siap. Saya tahu, ini terlihat jelek, tetapi sebagai solusi, itu berhasilsumber
sumber
Terima kasih, Rippon! Saya akhirnya berhasil juga, setelah banyak perjuangan, dan solusi saya sangat dekat dengan apa yang Anda sarankan! Kuncinya adalah membuat Job saya sendiri untuk memperluas QuartzJobBean, dan menggunakan schedulerContextAsMap.
Saya berhasil lolos tanpa menentukan properti applicationContextSchedulerContextKey - ini berfungsi tanpa itu untuk saya.
Untuk kepentingan orang lain, berikut adalah konfigurasi terakhir yang berhasil untuk saya:
Perhatikan bahwa kacang 'mailService "adalah kacang layanan saya sendiri, yang dikelola oleh Spring. Saya dapat mengaksesnya dalam Pekerjaan saya sebagai berikut:
Dan konfigurasi ini juga memungkinkan saya untuk menjadwalkan pekerjaan secara dinamis, dengan menggunakan pabrik untuk mendapatkan Pemicu dan JobDetails serta mengatur parameter yang diperlukan pada mereka secara terprogram:
Terima kasih banyak lagi untuk semua orang yang telah membantu,
Marina
sumber
Solusi sederhana adalah dengan mengatur kacang pegas di Peta Data Pekerjaan dan kemudian mengambil kacang di kelas pekerjaan, misalnya
`
sumber
Berikut adalah tampilan kode dengan @Component:
Kelas utama yang menjadwalkan pekerjaan:
EmailJob sama seperti di posting pertama saya kecuali untuk penjelasan @Component:
Dan file konfigurasi Spring memiliki:
Terima kasih atas semua bantuannya!
Marina
sumber
EmailJob
sedang diinisialisasi? Cara mudah untuk memeriksanya adalah dengan menambahkan baris log di konstruktor.Solusi dari Hary https://stackoverflow.com/a/37797575/4252764 bekerja dengan sangat baik. Ini lebih sederhana, tidak memerlukan begitu banyak biji pabrik khusus, dan mendukung banyak pemicu dan pekerjaan. Hanya akan menambahkan bahwa pekerjaan Quartz dapat dibuat menjadi generik, dengan pekerjaan tertentu diimplementasikan sebagai kacang Spring biasa.
sumber
Ini adalah posting lama yang masih berguna. Semua solusi yang mengusulkan keduanya memiliki kondisi kecil yang tidak cocok untuk semua:
SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext(this);
Ini mengasumsikan atau membutuhkannya menjadi proyek berbasis web musim semiAutowiringSpringBeanJobFactory
Pendekatan berbasis yang disebutkan dalam jawaban sebelumnya sangat membantu, tetapi jawabannya khusus untuk mereka yang tidak menggunakan api kuarsa vanilla murni melainkan pembungkus pegas untuk kuarsa untuk melakukan hal yang sama.Jika Anda ingin tetap menggunakan implementasi Quartz murni untuk penjadwalan (Quartz dengan kemampuan Autowiring dengan Spring), saya dapat melakukannya sebagai berikut:
Saya ingin melakukannya dengan cara kuarsa sebanyak mungkin dan dengan demikian sedikit peretasan terbukti membantu.
quartzScheduler.setJobFactory(autowiringSpringBeanJobFactory);
memberi kami contoh pekerjaan autowired. KarenaAutowiringSpringBeanJobFactory
secara implisit mengimplementasikan aJobFactory
, kami sekarang mengaktifkan solusi kabel otomatis. Semoga ini membantu!sumber
Cara sederhana untuk melakukannya adalah dengan memberi anotasi pada Quartz Jobs dengan
@Component
anotasi, dan Spring akan melakukan semua keajaiban DI untuk Anda, karena sekarang dikenal sebagai kacang Spring. Saya harus melakukan sesuatu yang serupa untuk satuAspectJ
aspek - itu bukan kacang musim semi sampai saya menjelaskannya dengan@Component
stereotip Musim Semi .sumber
EmailJob
kelas Anda ada dalam paket yang akan dipindai oleh Spring saat aplikasi dimulai? Fakta bahwa Anda memberi anotasi@Component
tetapi kelas yang diinjeksi masih null menunjukkan bahwa kelas tersebut tidak dipindai - jika tidak, DI saat startup aplikasi akan mengeluarkan pengecualian.Ini adalah jawaban yang benar http://stackoverflow.com/questions/6990767/inject-bean-reference-into-a-quartz-job-in-spring/15211030#15211030 . dan akan berhasil untuk sebagian besar orang. Tetapi jika web.xml Anda tidak mengetahui semua file applicationContext.xml, pekerjaan kuarsa tidak akan dapat memanggil kacang tersebut. Saya harus melakukan lapisan tambahan untuk memasukkan file applicationContext tambahan
Anda dapat menambahkan sejumlah file konteks yang Anda ingin agar kuarsa diperhatikan.
sumber
Pastikan Anda
ketergantungan ditarik dari
dan BUKAN dari
Ia ingin saya menggunakan
dari pada
begitu juga gagal untuk melakukan autowire instance pekerjaan.
sumber
Ketika Anda sudah menggunakan AspectJ nyata dalam proyek Anda, maka Anda dapat membuat anotasi kelas kacang pekerjaan dengan
@Configurable
. Kemudian Spring akan menyuntikkan ke dalam kelas ini, meskipun itu dibangun melaluinew
sumber
Saya menghadapi masalah serupa dan keluar darinya dengan pendekatan berikut:
Pada kode di atas saya menyuntikkan kacang dao.DAOFramework ke dalam kacang JobA dan di dalam metode ExecuteInternal Anda bisa mendapatkan kacang yang disuntikkan seperti:
Saya harap ini membantu! Terima kasih.
sumber
Solusi di atas bagus tetapi dalam kasus saya injeksi tidak berfungsi. Saya perlu menggunakan autowireBeanProperties, mungkin karena cara konteks saya dikonfigurasi:
sumber
Semua solusi di atas tidak berfungsi untuk saya dengan Spring 5 dan Hibernate 5 dan Quartz 2.2.3 ketika saya ingin memanggil metode transaksional!
Oleh karena itu, saya menerapkan solusi ini yang secara otomatis memulai penjadwal dan memicu pekerjaan. Saya menemukan banyak kode itu di dzone . Karena saya tidak perlu membuat pemicu dan pekerjaan secara dinamis, saya ingin pemicu statis ditentukan sebelumnya melalui Konfigurasi Musim Semi dan hanya pekerjaan yang akan diekspos sebagai Komponen Musim Semi.
Konfigurasi dasar saya terlihat seperti ini
Seperti yang Anda lihat, Anda memiliki penjadwal dan pemicu pengujian sederhana yang ditentukan melalui ekspresi cron. Anda jelas dapat memilih ekspresi penjadwalan apa pun yang Anda suka. Anda kemudian membutuhkan AutowiringSpringBeanJobFactory yang bekerja seperti ini
Di sini Anda menghubungkan konteks lamaran normal dan pekerjaan Anda bersama-sama. Ini adalah celah penting karena biasanya Quartz memulai thread pekerja yang tidak memiliki koneksi ke konteks aplikasi Anda. Itulah alasan mengapa Anda tidak dapat menjalankan mehtod Transaksional. Hal terakhir yang hilang adalah pekerjaan. Ini bisa terlihat seperti itu
Ini bukan solusi sempurna karena Anda kelas tambahan hanya untuk memanggil metode layanan Anda. Tapi bagaimanapun itu berhasil.
sumber
Jobstore Jdbc
Jika Anda menggunakan jdbc jobstore, Quartz menggunakan classloader yang berbeda. Hal ini mencegah semua solusi untuk pemasangan kabel otomatis, karena objek dari pegas tidak akan kompatibel di sisi kuarsa, karena objek tersebut berasal dari loader kelas yang berbeda.
Untuk memperbaikinya, classloader default harus disetel di file properti kuarsa seperti ini:
Sebagai referensi: https://github.com/quartz-scheduler/quartz/issues/221
sumber
Cukup perpanjang pekerjaan Anda dari
QuartzJobBean
sumber