Ich habe es geschafft, einen Quarzjob mit dem persistenten JobStoreTX-Speicher im Frühjahr zu konfigurieren und zu planen. Ich verwende keine Spring's Quartz-Jobs, da ich sie zur Laufzeit dynamisch planen muss und alle Beispiele für die Integration von Spring in Quartz, die ich gefunden habe, die Shcedules in den Spring-Konfigurationsdateien hartcodierten ... Wie auch immer, hier ist, wie Ich plane den Job:
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);
}
Der EMailJob ist ein einfacher Job, bei dem E-Mails mit der JavaMailSenderImpl-Klasse von Spring gesendet werden.
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");
}
Das Problem ist, dass ich einen Verweis auf eine Instanz dieser Klasse (JavaMailSenderImpl) in meiner EMailJob-Klasse erhalten muss. Wenn ich versuche, es so zu injizieren:
@Autowired
private JavaMailSenderImpl mailSenderImpl;
es wird nicht injiziert - die Referenz ist NULL. Ich gehe davon aus, dass dies geschieht, weil nicht Spring die EMailJob-Klasse instanziiert, sondern Quartz, und Quartz weiß nichts über Abhängigkeitsinjektion ...
Gibt es eine Möglichkeit, diese Injektion zu erzwingen?
Vielen Dank!
Update 1: @Aaron: Hier ist ein relevanter Teil des Stacktraces vom Start, der zeigt, dass der EMailJob zweimal instanziiert wurde:
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 ...
Vielen Dank!
Update Nr. 2: @Ryan:
Ich habe versucht, die SpringBeanJobFactory wie folgt zu verwenden:
<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>
Und ich habe meine Hauptklasse geändert, um Scheduler von dieser Fabrik anstelle von Quartz 'zu erhalten:
@PostConstruct
public void initNotificationScheduler() {
try {
//sf = new StdSchedulerFactory("spring/quartz.properties");
//scheduler = sf.getScheduler();
scheduler = schedulerFactoryBean.getScheduler();
scheduler.start();
....
Aber wenn ich die App starte - erhalte Fehler, siehe unten. Hier ist der Stacktrace vom Spring-Start. Der Scheduler selbst scheint in Ordnung zu sein, aber der Fehler tritt auf, wenn versucht wird, meinen EMailJob zu instanziieren:
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)
Vielen Dank!
quelle
Ich habe nur
SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext(this);
als erste Zeile meinerJob.execute(JobExecutionContext context)
Methode gesetzt.quelle
Das gleiche Problem wurde in LINK behoben :
Ich konnte eine andere Option aus dem Beitrag im Spring-Forum finden, mit der Sie über SchedulerFactoryBean einen Verweis auf den Spring-Anwendungskontext übergeben können. Wie das folgende Beispiel:
Wenn Sie dann den folgenden Code in Ihrer Jobklasse verwenden, können Sie den applicationContext abrufen und die gewünschte Bean abrufen.
Ich hoffe es hilft. Weitere Informationen erhalten Sie im Mark Mclaren'sBlog
quelle
Sie haben Recht mit Ihrer Annahme, dass Spring vs. Quartz die Klasse instanziiert. Spring bietet jedoch einige Klassen, mit denen Sie eine primitive Abhängigkeitsinjektion in Quarz durchführen können. Schauen Sie sich SchedulerFactoryBean.setJobFactory () zusammen mit SpringBeanJobFactory an . Im Wesentlichen aktivieren Sie mithilfe der SpringBeanJobFactory die Abhängigkeitsinjektion für alle Job-Eigenschaften, jedoch nur für Werte, die sich im Quartz- Scheduler-Kontext oder in der Job-Datenzuordnung befinden . Ich weiß nicht, welche DI-Stile es unterstützt (Konstruktor, Annotation, Setter ...), aber ich weiß, dass es die Setter-Injection unterstützt.
quelle
für alle, die dies in Zukunft versuchen werden.
org.springframework.scheduling.quartz.JobDetailBean liefert eine Karte von Objekten, und diese Objekte können Spring Beans sein.
definiere etw wie
und dann drinnen
Rufen
myBean = (myBean) context.getMergedJobDataMap().get("myBean");
Sie an und Sie sind fertig. Ich weiß, es sieht hässlich aus, aber als Problemumgehung funktioniert esquelle
quelle
Danke, Rippon! Nach vielen Kämpfen habe ich es endlich auch geschafft, und meine Lösung kommt dem, was Sie vorgeschlagen haben, sehr nahe! Der Schlüssel war, meinen eigenen Job zu erstellen, um QuartzJobBean zu erweitern und die schedulerContextAsMap zu verwenden.
Ich bin durchgekommen, ohne die Eigenschaft applicationContextSchedulerContextKey anzugeben - es hat für mich ohne sie funktioniert.
Zum Nutzen anderer ist hier die endgültige Konfiguration, die für mich funktioniert hat:
Beachten Sie, dass die 'mailService'-Bean meine eigene Service-Bean ist, die von Spring verwaltet wird. Ich konnte in meinem Job wie folgt darauf zugreifen:
Diese Konfiguration ermöglichte es mir auch, Jobs dynamisch zu planen, indem ich Fabriken verwendete, um Trigger und JobDetails abzurufen und die erforderlichen Parameter programmgesteuert festzulegen:
Nochmals vielen Dank an alle, die geholfen haben,
Yachthafen
quelle
Eine einfache Lösung besteht darin, die Spring Bean in der Job Data Map festzulegen und dann beispielsweise die Bean in der Jobklasse abzurufen
`
quelle
So sieht der Code mit @Component aus:
Hauptklasse, die den Job plant:
Der EmailJob ist der gleiche wie in meinem ersten Beitrag, mit Ausnahme der Annotation @Component:
Und die Konfigurationsdatei des Frühlings hat:
Danke für all die Hilfe!
Yachthafen
quelle
EmailJob
initialisiert? Eine einfache Möglichkeit zur Überprüfung besteht darin, dem Konstruktor eine Protokollzeile hinzuzufügen.Eine Lösung von Hary https://stackoverflow.com/a/37797575/4252764 funktioniert sehr gut. Es ist einfacher, benötigt nicht so viele spezielle Factory Beans und unterstützt mehrere Trigger und Jobs. Ich möchte nur hinzufügen, dass der Quarzjob generisch gestaltet werden kann, wobei bestimmte Jobs als reguläre Spring Beans implementiert werden.
quelle
Eine einfache Möglichkeit wäre, die Quarzjobs mit zu kommentieren
@Component
Anmerkungen zu versehen. Dann erledigt Spring die gesamte DI-Magie für Sie, da sie jetzt als Spring Bean erkannt wird. Ich musste etwas Ähnliches für eine tunAspectJ
Aspekt - es war keine Frühlingsbohne, bis ich es mit dem Frühlingsstereotyp kommentierte@Component
.quelle
EmailJob
Klasse in einem Paket, das beim Start der App von Spring gescannt wird? Die Tatsache, dass Sie mit Anmerkungen versehen haben@Component
, die injizierte Klasse jedoch immer noch null ist, zeigt an, dass sie nicht gescannt wird. Andernfalls würde der DI beim Start der App eine Ausnahme auslösen.Dies ist die richtige Antwort http://stackoverflow.com/questions/6990767/inject-bean-reference-into-a-quartz-job-in-spring/15211030#15211030 . und wird für die meisten Leute arbeiten. Wenn Ihre web.xml jedoch nicht alle applicationContext.xml-Dateien kennt, kann der Quarzjob diese Beans nicht aufrufen. Ich musste eine zusätzliche Ebene erstellen, um zusätzliche applicationContext-Dateien einzufügen
Sie können eine beliebige Anzahl von Kontextdateien hinzufügen, die Ihrem Quarz bekannt sein sollen.
quelle
Dies ist ein ziemlich alter Beitrag, der immer noch nützlich ist. Alle Lösungen, die diese beiden vorschlagen, hatten wenig Bedingung, die nicht allen entspricht:
SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext(this);
Dies setzt voraus oder erfordert, dass es sich um ein Spring-Web-basiertes Projekt handeltAutowiringSpringBeanJobFactory
Der in der vorherigen Antwort erwähnte Ansatz ist sehr hilfreich, aber die Antwort ist spezifisch für diejenigen, die keine reine Vanillequarz-API verwenden, sondern Spring's Wrapper, damit der Quarz dasselbe tut.Wenn Sie bei der reinen Quartz-Implementierung für die Planung bleiben möchten (Quartz mit Autowiring-Funktionen mit Spring), konnte ich dies wie folgt tun:
Ich habe versucht, es so weit wie möglich mit Quarz zu machen, und daher erweist sich wenig Hack als hilfreich.
quartzScheduler.setJobFactory(autowiringSpringBeanJobFactory);
gibt uns eine automatisch verdrahtete Jobinstanz. Da aAutowiringSpringBeanJobFactory
implizit a implementiert wirdJobFactory
, haben wir jetzt eine automatisch verdrahtbare Lösung aktiviert. Hoffe das hilft!quelle
Stellen Sie sicher, dass Ihre
Abhängigkeit wird aus gezogen
und NICHT von
Es wollte, dass ich benutze
anstatt
Daher konnte die Jobinstanz nicht automatisch verdrahtet werden.
quelle
Wenn Sie in Ihrem Projekt bereits echtes AspectJ verwenden, können Sie die Job-Bean-Klasse mit Anmerkungen versehen
@Configurable
. Dann wird Spring in diese Klasse injizieren, selbst wenn es über konstruiert istnew
quelle
Ich habe mich dem ähnlichen Problem gestellt und bin mit folgendem Ansatz daraus hervorgegangen:
Im obigen Code injiziere ich dao.DAOFramework-Bean in JobA-Bean und in der ExecuteInternal-Methode können Sie Bean wie folgt injizieren lassen:
Ich hoffe, es hilft! Danke dir.
quelle
Die obige Lösung ist großartig, aber in meinem Fall hat die Injektion nicht funktioniert. Ich musste stattdessen autowireBeanProperties verwenden, wahrscheinlich aufgrund der Art und Weise, wie mein Kontext konfiguriert ist:
quelle
Alle oben genannten Lösungen funktionieren bei Spring 5 und Hibernate 5 sowie Quartz 2.2.3 nicht, wenn ich Transaktionsmethoden aufrufen möchte!
Ich habe daher diese Lösung implementiert, die den Scheduler automatisch startet und die Jobs auslöst. Ich habe viel von diesem Code bei dzone gefunden . Da ich Trigger und Jobs nicht dynamisch erstellen muss, wollte ich, dass die statischen Trigger über die Spring-Konfiguration vordefiniert werden und nur die Jobs als Spring-Komponenten verfügbar gemacht werden.
Meine Grundkonfiguration sieht so aus
Wie Sie sehen können, haben Sie den Scheduler und einen einfachen Testtrigger, der über einen Cron-Ausdruck definiert wird. Sie können natürlich einen beliebigen Planungsausdruck auswählen. Sie benötigen dann die AutowiringSpringBeanJobFactory, die so aussieht
Hier verbinden Sie Ihren normalen Bewerbungskontext und Ihren Job miteinander. Dies ist die wichtige Lücke, da Quartz normalerweise Worker-Threads startet, die keine Verbindung zu Ihrem Anwendungskontext haben. Aus diesem Grund können Sie keine Transaktionsmethoden ausführen. Das Letzte, was fehlt, ist ein Job. Es kann so aussehen
Es ist keine perfekte Lösung, da Sie eine zusätzliche Klasse nur zum Aufrufen Ihrer Servicemethode sind. Aber es funktioniert trotzdem.
quelle
Jdbc Jobstore
Wenn Sie jdbc jobstore verwenden, verwendet Quartz einen anderen Klassenladeprogramm. Dies verhindert alle Problemumgehungen für das automatische Verdrahten, da Objekte aus der Feder auf der Quarzseite nicht kompatibel sind, da sie von einem anderen Klassenlader stammen.
Um dies zu beheben, muss der Standardklassenlader in der Quarz-Eigenschaftendatei wie folgt festgelegt werden:
Als Referenz: https://github.com/quartz-scheduler/quartz/issues/221
quelle
Verlängern Sie einfach Ihren Job von
QuartzJobBean
quelle